投影片講解視訊影片網址:
http://www.youtube.com/playlist?list=PLFL0ylDooClTXfy-cFbq7rV1iwP57JFaF
This slide is made by the RoBoard team of DMP Electronics Inc.:
https://www.facebook.com/roboard.fans
91. Arduino Standard API 在 86Duino 上的移植
直接來自 C/C++ standard library 的 API
◦DJGPP 與 avr-gcc 相容, 無需移植
直接使用 C 語言巨集定義的 API
◦直接沿用 Arduino 原始碼
平台獨立 API
◦直接沿用 Arduino 原始碼
硬體相關 API
◦重新改寫至 x86 平台
151. Arduino Leonardo Bootloader
Arduino Leonardo 使用 caterina bootloader
◦透過 USB 直接與 PC 通訊, 省掉 USB to Serial bridge, 降低成本
◦使用 LUFA library 來進行 USB 通訊
LUFA 是一套 AVR 系列微處理機專用的通訊程式 庫, 支援各種 USB Class
caterina 只用到 CDC Class 的功能
242. 86Duino 編譯系統
DOSBox + DJGPP
DOSBox 是一個跨平台的 DOS 模擬軟體
◦在 IDE 的路徑: buildwindowsworkDOSBox-0.74
DJGPP 是一個可在 DOS 下編譯程式的 GNU gcc
◦在 IDE 的路徑: buildwindowsworkDJGPP
264. BasicUploader.java → Class BasicUploader → uploadUsingPreferences()
取得目前 Serial USB port
對 upload port 設定 1200 baud 再關閉 (soft-reset Arduino)
如果設定要等待 upload port 出現
如果設定 1200 baudrate reset → 執行 USB bootloader 燒錄流程
取得 user 設定的 upload port
等待 Arduino reset 完畢, 重新 取得 upload port (見下頁)
265. BasicUploader.java → Class BasicUploader → waitForUploadPort()
Timeout 時間: 20 秒
找出 Arduino reset 後, 重 新連線的 upload port
如果找到 upload port
如果沒有找到 upload port, delay 250ms 再重新尋找
如果超過時限未找到新 upload port (win: 10 秒, 其他: 500ms), 且 user 選擇的 upload port 並未消失, 則回傳 user 選擇的 upload port
將找到的 upload
port 回傳
278. 燒錄工具程式的一點開發經驗
在 ubuntu 遇到的問題
◦在 ubuntu 11.04 版本及之後的版本, 內建的 modem manager 會干擾 USB CDC 裝置的傳輸
◦https://bugs.launchpad.net/ubuntu/+source/modemmanager/+bug/1153632/+activity
◦這會造成燒錄程序被干擾而失敗
◦解決方式: 將 USB CDC 裝置的 PID 和 VID 加入 modem manager 的忽略清單
279. 燒錄工具程式的一點開發經驗
在 Mac OS X 遇到的問題
◦USB CDC 裝置的 Call Management Functional Descriptor 中的 最後一個 data 必須為 0x01, 否則 Mac 會認不到 USB CDC 裝 置
◦http://stackoverflow.com/questions/5009593/acessing- a-serial-to-usb-device-with-i-o-kit
280. 燒錄工具程式的一點開發經驗
在 Mac OS X 遇到的問題 (cont.)
◦USB CDC 裝置的 Configuration Descriptor 中不可 宣告 remote wakeup 功能, 否則會大大延長 Mac 辨 識此 USB CDC 裝置的時間
352. 在 Arduino 和 86Duino 上只使用 1 個 servo pin, 並量測輸出的 PWM duty 與目標值的誤 差, 所測得的數據如下表所示: 各板子的 PWM Duty 抖動實測
板子
目標 duty
實際量測值
duty 誤差範圍
最小
最大
Arduino UNO
1000 us
1000.04 us
1006.42 us
約 6 ~ 7 us
Arduino Leonardo
1000 us
1000.04 us
1007.92 us
約 7 ~ 8 us
Arduino DUE
1000 us
998.200 us
998.280 us
約 1 ~ 2 us
Arduino Mega2560
1000 us
1001.12 us
1008.87 us
約 8 ~ 9 us
86Duino
1000 us
998.64 us
1001.1 us
約 1 ~ 2 us **
** 在 86Duino 有標註硬體 PWM 功能的 I/O pin 上, 誤差則是 0
353. 在 Arduino DUE / Mega2560 和 86Duino 上啟 用 45 組 servo pins, 並量測其中一個 pin 輸出 的 PWM duty 與目標值的誤差, 所測得的數據 如下表所示:
各板子的 PWM Duty 抖動實測
板子
目標 duty
實際量測值
duty 誤差範圍
最小
最大
Arduino DUE
1000 us
998.05 us
1004.68 us
約 2 ~ 5 us
Arduino Mega2560
1000 us
1001.09 us
1076.96 us
約 1 ~ 77 us
86Duino
1000 us
998.70 us
1001.31 us
約 1 ~ 2 us
Arduino 的 Servo 函式庫在超過 12 組 channels 時, 會啟用 2 組以上 Timer 中斷, 以上表格可以看出多組 Timer 中斷互相影響所造成的 jitter 惡化情形
514. MakeVoiceCall 範例程式
使用者可透過 Serial monitor 輸入電話 號碼來撥打給對方
#include <GSM.h>
#define PINNUMBER “"
GSM gsmAccess;
GSMVoiceCall vcs;
String remoteNumber = “";
char charbuffer[20];
void setup()
{
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
如果已經在手機上已取消 PIN 碼,這 裡就不用輸入 PIN 碼
初始化 GSMAccessProvider class
初始化 GSMVoiceProvider class
515. MakeVoiceCall:setup()
… // Start GSM shield // If your SIM has PIN, pass it as a parameter of begin() in quotes while(notConnected) { if(gsmAccess.begin(PINNUMBER)==GSM_READY) notConnected = false; else { Serial.println("Not connected"); delay(1000); } } Serial.println("GSM initialized."); Serial.println("Enter phone number to call."); …
begin() 完成基本的初始化
回傳結果都沒問題,就可 以開始打電話了