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() 完成基本的初始化
回傳結果都沒問題,就可 以開始打電話了
523. GSM Library 架構
GSM class (負責送出初始化命令)
GSM Soft Serial class
GSM Shield
GSM_SMS class
GSMClient Class
GPRS class (負責送出初始化命令)
GSMClient class
GSMServer class
1. 每個 class 包含 自己專用的 AT command
2. 當使用者呼叫 GSM API 時,該 API 會把自己的處 理程序註冊到一個 特殊列表中,讓 SoftSerial 中斷副 程式以 callback 的 方式來呼叫