就算沒有接觸 Arduino,相信在講到 IoT 應用的時候,多少都聽過 Arduino。
Arduino 是一個開源嵌入式的硬體平台,以往要開發硬體電路時,往往需要編譯程式後燒錄到 IC 上。然而 Arduino 設計了一套電路,讓使用者可以用非常簡單的方式撰寫程式碼並達成功能。
由於它是開源的電路設計,任何人只要有對應的電子元件,電路圖給 PCB 廠印出後誰都可以自己做一塊 Arduino。
除了提供電路板之外,Arduino 厲害的地方在於它成熟的生態圈跟整合,例如不需要透過特別的燒錄器,只要用 USB 接到電腦就可以上傳程式碼;容易使用的 GPIO 接腳、包裝完整的函式庫,這些對想要接觸 IoT 的初學者來說是非常友善的。
舉例來說,如果想要做一個 LED 閃爍的功能,只要這樣寫:
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
setup
函數只會執行一次,在電路接電時執行,之後會不斷執行 loop 裡面的程式碼。digitalWrite
與 delay
都是 Arduino 提供的內建函數。digitalWrite 可以將指定的接腳改為指定的電位,由於是 digital
,所以只有 HIGH 跟 LOW。
在剛入門時,我學 Arduino 的目的很簡單,是想要自動化一些東西,自己實現一些好玩的創意。
像是透過 Arduino 讀取二氧化碳數據,並搭配 MQTT 與 Grafana 做到簡易視覺化。
又或是整合藍芽做了簡易的 Pomodoro。
透過藍芽連動行事曆的資訊。
雖然都是非常簡陋的實作,不過 Arduino 的包裝大幅簡化了開發成本,對硬體認知有限的我來說只要有點子,搭配麵包板跟跳線就能夠輕易實現。
然而,到了一定程度以後,我也蠻建議想要更近一步學習的人,去學更多關於硬體的知識,甚至是去理解 AVR。
因為 Arduino 寫到後面,很像是找到對的函式庫跟把這些函式庫兜起來達成自己想要的功能。這其實跟一般軟體工程師在做的事情很像。
舉例來說:digitalWrite
雖然可以改變電位,但背後是怎麼實現的呢?delay
可以延遲,那背後又是怎麼做到的?如果不去理解這些東西,只是用別人包好的函數,那麼能夠學到的東西很有限。
如果去深入研究的話,就會知道原來 digitialWrite 背後是去指定特定的暫存器的值來達到的;而 delay 背後的實作是透過 timer 功能來達成。在 AVR 的 IC 當中有數個 timer 可以使用,所以實際的秒數其實是用頻率與週期算出來的。
光是深入研究這兩個函數,就可以發現完全不一樣的世界。例如如果直接用 delay 的話其實是將 MCU blocking 住。
那要怎麼不讓它被 blocking 住呢?這時候就會開始研究中斷(interrupt)是怎麼運作的。我們可以將 delay 改為用中斷的方式執行,當 timer 時間到時直接送出中斷。如果要什麼功能就是直接找函式庫的話,我可能就不會知道這些原理和知識了。
比起直接看 intel 或是 ARM 指令集,AVR 的指令集相對少很多,打開 Attiny85 的 datasheet 也就 120 個指令,在學習上也就相對好上手。以 Attiny85 的 datasheet 為例,整個 datasheet 也才 234 頁,還算是相對好消化的範圍。
除了可以直接用 Arduino 來學習 AVR 之外,對於比較進階的學習者來說也可以直接買單顆 IC 來學習。以 Attiny85 為例,只有 8 隻腳而且可以直接插麵包板接線,想要測試程式碼運作時相對方便許多。Attiny85 只要 50 ~ 60 台幣就能入手,網路上隨便都買得到,比一杯飲料還便宜,燒掉也不會太心疼。