接下來將一系列專文說明 ROSA 的程式開發,複雜的東西就是要切塊逐一處理,因為 Arduino 有很多 pin 腳,每隻腳都是獨立運作,因此採功能模組方式開發,參考程式範例如下:
// (C) 2015, Bridan Wang, CC BY-NC-SA 3.0 TW
// http://4rdp.blogspot.tw/search/label/ROSA%20(Arduino)
// System
#define TARGET mBot
#if TARGET == mBot
#define DIGITAL 14
#define ANALOG 8
#elif TARGET == motoduino
#define DIGITAL 14
#define ANALOG 6
#elif TARGET == UNO
#define DIGITAL 14
#define ANALOG 6
#endif
enum { // CONFigure
DOUT,
DIN,
DIN_UP,
ADIN,
ADIN_UP,
PWM_,
LED = 7,
TONE,
SERVO,
I2C,
SER_RX,
SER_TX,
IR_RX,
IR_TX,
XXXX
};
const byte CFD[] PROGMEM = { // DIGITAL + ANALOG pin default
#if TARGET == mBot
SER_RX, SER_TX, IR_RX, IR_TX, DIN, DIN, DIN, DIN,
TONE, DIN, DIN, DIN, DIN, LED,
ADIN, ADIN, ADIN, ADIN, ADIN, ADIN, ADIN, ADIN
#elif TARGET == motoduino
SER_RX, SER_TX, DIN, DIN, SERVO, PWM_, PWM_, SERVO,
SERVO, PWM_, DOUT, DOUT, DOUT, DOUT,
ADIN, ADIN, ADIN, ADIN, ADIN, ADIN
#elif TARGET == UNO
SER_RX, SER_TX, IR_RX, IR_TX, DIN, DIN, DIN, DIN,
TONE, DIN, DIN, DIN, DIN, LED,
ADIN, ADIN, ADIN, ADIN, ADIN, ADIN
#endif
};
接下是列舉 (Enumerations) 定義,enum 會從 0 開始依整數排序對每一個整數常數給值,Arduino pin 可以因應需求定義功能,在此列出 14 種功能,綜觀目前現有 S4A、S2A、Firmata 腳位功能列舉還沒 ROSA 多,有些功能沒列上例如超音波,它是可用一個數位輸出及一個數位輸入組合成的,因此基本上 ROSA 可涵蓋多樣功能需求。
CFD[] 是將每一 pin 預設功能用陣列形式建表,const 就是將此表儲存於 ROM 程式區塊,這表是 ROSA 開機後要預設各個 pin 腳功能時使用,因為初始值是常數,所以用 const 儲存,加 PROGMEM 關鍵字是為了減少消耗 SRAM 空間,少了這個關鍵字宣告,常數資料會在執行階段被複製到 SRAM 佔用空間,之前 ROSA 的 SRAM 寫爆就是這緣故,也與 Arduino 編譯器有關,這種情形我倒是第一次遇到,此外 ROSA 另有指令可以切換 pin 腳功能,不必擔心被 Arduino 內部韌體綁死。
本系列文章適合進階玩家,並不適合初學者,因此不會逐行解說程式碼。
沒有留言:
張貼留言