如何讓 Arduino 2.0 快速編譯(增量編譯)

Jack omnixri
5 min readOct 10, 2024

--

作者:Jack OmniXRI, 2024/10/10

以往在開發簡易型聲音辨識(Keyword Spotting / Voice Command)時常使用 Edge Impulse 來建立及訓練模型,再輸出成 Arduino LIB(ZIP)格式給對應的開發板使用[1]。不過由於 AI 相關函式庫非常多,所以第一次編譯程式時都得等上十到三十分鐘,這還勉強可以接受,但悲劇地是就算什麼都不作,再傳新上傳程式時也要再全部重新編譯一次,這就有點不合乎常理,不是沒更動到的部份就不用重編嗎?難道沒有好的解決方式嗎?

經網路查詢後,得知 Arduino IDE 2.x 預設是不支援「增量編譯」,就是只編譯有變更部份的程式,須改用其它編譯器來改善這個問題。測試了幾個網路資訊給出的幾個建議後,這裡選擇一個最簡單的作法,就是直接使用 Arduino Command Line Interface (簡稱CLI)[2] 來解決增量編譯問題。

這裡假設大家原本就已有安裝好 Arduino IDE 2.x ,電腦已順利連接開發板,並可對指定開發板進行程式撰寫、校驗/編譯、上傳及執行,且串列埠(Serial)也都能順利工作,可正常顯示開發板送出的字串。接下來就以 Windows 為例,依序操作下列相關步驟及指令碼即可完成增量編譯設定。

  1. 安裝 Arduino CLI
    可參考[1]說明安裝,可直接下載 Widnows 64bit exe ,雙擊程式啟動安裝。完成後進入 Windows 命令列模式(已為全域命令)直接輸入下列指令即可測試是否完成安裝。
arduino-cli -h

2. 開啟工作程式
為方便後面編修程式及串列埠監看工作狀況,請先以 Arduino IDE開啟欲執行的程式(ino)。
注意:接下來不要使用介面的編譯及上傳功能,改使用步驟6編譯和步驟8上傳。

3. 切換到 Arduino ino程式所在路徑

cd x:\xxx

4. 查詢所使用開發板的FQBN代號
執行下列指令可得所有開發板名稱及 FQBN 代號,如 “arduino:avr:nano” ,請複製下來,後面會用到。

arduino-cli board listall

5. 建立程式編譯批次檔(bat)
為方便後續操作,可先建立批次檔。首先進入Arduino IDE,點選選單「File — Preferences」,將 Arduino 程式所在位置路徑(Sketchbook Location)完整複製下來備用。接著開啟「筆記本(Notpad)」或任意文字編輯器,將下列文字輸入。其中 echo 部份是取得目前系統時間,方便記錄工作起迄時間,可以略過不輸入。編譯時記得加入 Arduino 函式庫路徑,以免找不到相關已安裝函式庫,另外如果想要看到編譯過程所有資訊,可於編譯(compile)指令最後方加上 “ -v” 即可。最後將檔案另存成”compile.bat”(名稱可自行定義)

echo Start time: %time%
arduino-cli compile --fqbn 開發板FQBN代號 --libraries Arduino程式所在位置路徑\libraries 待編譯程式名稱.ino
echo End time: %time%

6. 執行編譯批次檔

compile

7. 建立程式上傳批次檔(bat)
由於連接上 Arduino 的開發板在上傳程式和工作模式的串列埠(COM)埠號會變,而 Arduino IDE 有時會自動幫忙切換,但使用 CLI 模式時則要自己指定,所以要先從 IDE 連接好板子找到對應的 COMx (x表埠號),以便稍後上傳使用。最後將檔案另存成”upload.bat”(名稱可自行定義)

echo Start time: %time%
arduino-cli upload -p COM9 --fqbn 開發板FQBN代號 待上傳程式名稱.ino -v
echo End time: %time%

8. 執行上傳批次檔
一般開發板上傳完程式後會自動切到工作模式,串列埠號也隨之改變,導致無法上傳程式了。此時只需快按兩次開發板的重置鍵(RESET)就可切回上傳模式埠號,等待程式上傳。上傳完成後開發板會重新回到工作模式,此時 Arduino IDE 上也可正常監看串列埠回傳的數據及字串。

upload

接下來如果修改程式後,不要使用 IDE 上的編譯及上傳,只需反覆執行步驟6及8即可!

最後以一個 Edge Impulse 產生的 LIB(ZIP)來測試,結果如下。

工作內容Arduino IDEArduino CLI第一次編譯上傳19~20min19~20min未修改程式第二次編譯上傳19~20min< 1min修改程式後編譯上傳19~20min1~2min

由以上測試數據透過 Arduino CLI 增量編譯很明顯地節省了大量時間,有興趣的朋友可以自己試試。

參考文獻:

[1] Edge Impulse — Run Inference — Arduino Library
https://docs.edgeimpulse.com/docs/run-inference/arduino-library

[2] Arduino CLI Installation
https://arduino.github.io/arduino-cli/1.0/installation/

--

--

Jack omnixri

OmniXRI (Omni-eXtened Reality Interaction) 歐尼克斯實境互動工作室是一個全方位電腦視覺、實境互動、邊緣計算及人工智慧技術的愛好者及分享者,歡迎大家不吝留言指教多多交流。 這裡的文章大部份是個人原創,如有引用到他人內容都會註明,若不慎疏漏侵犯到,煩請儘快通知,我們會儘速處理。