Windows 下編譯 Arduino原始碼
下載 JAVA JDK 並完成安裝
下載 cygwin並完成安裝
◦Linux-like environment for Windows
◦安裝 cygwin 過程中, 選擇安裝下列套件
git
make, gcc-mingw, and g++
perl
unzip, zip
17.
Windows 下編譯 Arduino原始碼
下載 Apache Ant 程式
◦JAVA base 編譯器
設定 Apache Ant 和 JAVA JDK 的環境變 數
執行 cygwin, 使用 git 指令下載 Arduino 最新原始碼
Arduino Standard API在 86Duino 上的移植
直接來自 C/C++ standard library 的 API
◦DJGPP 與 avr-gcc 相容, 無需移植
直接使用 C 語言巨集定義的 API
◦直接沿用 Arduino 原始碼
平台獨立 API
◦直接沿用 Arduino 原始碼
硬體相關 API
◦重新改寫至 x86 平台
Arduino Leonardo Bootloader
Arduino Leonardo 使用 caterina bootloader
◦透過 USB 直接與 PC 通訊, 省掉 USB to Serial bridge, 降低成本
◦使用 LUFA library 來進行 USB 通訊
LUFA 是一套 AVR 系列微處理機專用的通訊程式 庫, 支援各種 USB Class
caterina 只用到 CDC Class 的功能
86Duino 編譯系統
DOSBox+ DJGPP
DOSBox 是一個跨平台的 DOS 模擬軟體
◦在 IDE 的路徑: buildwindowsworkDOSBox-0.74
DJGPP 是一個可在 DOS 下編譯程式的 GNU gcc
◦在 IDE 的路徑: buildwindowsworkDJGPP
BasicUploader.java → ClassBasicUploader → 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 → ClassBasicUploader → 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 回傳
在 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 惡化情形
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() 完成基本的初始化
回傳結果都沒問題,就可 以開始打電話了
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 的 方式來呼叫