微軟開發了一個頗受歡迎的Arduino for Visual Studio Code延伸模組,讓VS Code成為開發Arduino應用的好工具(參閱:使用微軟Visual Studio Code編寫Arduino程式),除了好用的程式編輯器,還能搭配眾多延伸模組幫助開發程式,例如,AI程式設計助手。可惜微軟在2024年8月宣佈不再持續開發此模組,並於10月1日將它從VS Code延伸模組市集移除。
所幸,vscode-arduino社群將微軟的Arduino for Visual Studio Code備份(fork)下來,集眾人之力繼續開發、維護。目前在VS Code的延伸模組搜尋“Arduino”關鍵字,看到的Arduino for Visual Studio Code就是社群版。
另一個廣受Arduino開發人員喜愛的VS Code延伸模組是PlatformIO,可視為非Arduino官方的整合開發環境,廣告一下,《超圖解ESP32應用實作》有三個章節的完整PlatformIO說明。
”The Last Outpost Workshop”也開發了另一個用於VS Code的Arduino延伸模組,叫做“Arduino Maker Workshop”,目前支援x86處理器的Windows和Linux系統,以及Apple晶片的macOS。
微軟的Arduino延伸模組要求使用者先在電腦上安裝Arduino官方IDE,而“Arduino Maker Workshop”不需要,它透過內建的Arduino CLI工具編譯以及上傳程式檔,也具備Arduino IDE的這些元素:開發板管理員、程式庫管理員和序列監控窗。
以下簡單說明“Arduino Maker Workshop”延伸模組的安裝與使用方式。
安裝Arduino Maker Workshop
在VS Code的延伸模組搜尋“Arduino Maker Workshop”(以下稱為「Arduino 創客工作坊」)關鍵字即可找到它,然後點擊「安裝」。筆者在沒有安裝Arduino IDE的Ubuntu Linux系統上安裝此VS Code模組。
安裝完畢後,VS Code左側工具列會出現一個Arduino圖示,此即「Arduino 創客工作坊」。
使用Arduino Maker Workshop開發Arduino專案
第一次用「Arduino 創客工作坊」編寫程式之前,請先開啟「專案資料夾」。選擇VS Code主功能表的「檔案 → 開啟資料夾」命令,然後選擇「文件 / Arduino」資料夾。
螢幕此時會出現如下的對話方塊,請點擊「是」。
然後點擊「Arduino 創客工作坊」的“Maker Workshop Home”(主頁):
它將開啟如下的分頁畫面,你可以在這個「主頁」新增程式檔(此例新增一個名叫”blink”的檔案),並且選擇開發板所在的序列埠(稍後說明)。
新增開發環境以及選擇開發板
「Arduino 創客工作坊」沒有預先安裝任何控制板的開發環境,請切換到「開發板管理員」選項,點擊上方的Not Installed(未安裝),即可在此搜尋開發板關鍵字,並且下載、安裝該開發板所需的開發環境。
筆者下載了ESP32,以及Arduino UNO R3開發板的“Arduino AVR Boards”,共兩個開發環境。點擊上方的Installed & Up to date(已安裝且更新),便能看到已安裝的開發環境名稱、安裝版本(Installed)和最新版本(Latest),以及刪除鈕。下半部的設定,能讓我們輸入其他開發板管理員的網址。
下載開發環境之後,即可切換到「選擇開發板」畫面,筆者選用Arduino Uno開發板。
切換到「開發板設置」畫面,它顯示此開發板沒有設置選項。
若選用其他開發板,例如ESP32的LOLIN D32,它的設置選項就有很多選擇,例如,時脈頻率、檔案上傳速率、快閃記憶體分區…等,如下圖所示:
編輯以及編譯程式碼
如同Arduino IDE,新增的空白程式檔裡面,會自動包含空白的setup()和loop()函式。輸入程式碼時,VS Code編輯器會自動出現提示,但它可能不認得Arduino的函式和一些識別字,例如,digitalWrite()和delay(),簡單的解決辦法是在程式碼開頭引用Arduino.h標頭檔,如底下程式碼的第一行:
此外,初次新增Arduino程式檔時,VS Code會提示你安裝 C/C++語言的延伸模組,請點擊「安裝」,這樣才會有C/C++程式碼的指令提示功能。
程式編寫完畢,點擊「Arduino 創客工作坊」的“Compile”(編譯)或者“Compile (clean)”編譯程式。編譯過程中,編譯器會把程式元件個別編譯成一個個物件檔,最後再合併成一個可執行檔(二進位檔);下次再編譯此程式檔,編譯器將略過之前已編譯過且沒有變動的部分,因而節省編譯時間。“Compile (clean)” 代表「重新編譯所有元件」,因此再次編譯所花費時間比較長。
或者,點擊狀態列裡的Compile,即可編譯程式碼;底下顯示「編譯完成」。
上傳程式檔
回到「Arduino 創客工作坊」主頁,如果開發板已經接上電腦,其中的Port(序列埠)選單將會自動搜尋並選擇開發板所在的序列埠。
點擊「Arduino 創客工作坊」的”Upload(上傳)”,或者狀態列的Upload,將能上傳檔案到開發板。但在Linux系統可能會出現底下的錯誤訊息,代表「使用者沒有權限存取"/dev/ttyUSB0"序列埠裝置」:
avrdude: ser_open(): can't open device "/dev/ttyUSB0": Permission denied
像這樣:
Arduino官方的「安裝Linux版Arduino IDE」(英文版)文件指出,我們需要在Linux終端機輸入底下的命令,賦予使用者“dialout”權限(稍後說明):
sudo usermod -a -G dialout 使用者名稱
因此,底下命令代表賦予使用者“cubie”輸出(dialout)以及接收(tty)USB序列訊息的權限:
sudo usermod -aG dialout cubie sudo usermod -aG tty cubie
執行命令後,登出、再重新登入系統。再次點擊Upload上傳程式檔就沒問題了,VS Code也將自動切換到序列監控窗,顯示來自Arduino開發板的訊息。
列舉接在Linux序列埠的Arduino開發板及其通訊晶片
補充說明,本文使用的是Arduino UNO R3相容開發板。在Linux終端機輸入底下的命令,可列舉接在USB的序列埠裝置:
ls -l /dev/ttyUSB*
執行結果顯示UNO R3開發板的序列埠是“/dev/ttyUSB0”。其中的“dialout”,直譯為「撥出」,也就是電腦是主控端,送出控制訊號給周邊裝置。188是裝置編號,用於讓作業系統識別該裝置所需的驅動程式,我們不用管它。
此外,Linux系統內核有個環狀緩存區(ring buffer),作業系統在這裡紀錄關於它正在做什麼的重要訊息,包括硬體、驅動程式和其他系統事件的相關資訊。在終端機執行dmesg命令可顯示此緩存區的內容,後面加上"| tail"代表顯示接收到的訊息的最後10行。
sudo dmesg | tail
執行結果如下,它顯示此USB裝置的驅動程式是ch341(此即UNO R3相容開發板上的通訊晶片的名字)、支援USB序列通訊、附加在ttyUSB0序列埠。
ˇ