Arduino 是一款便捷靈活、方便上手的開源電子原型平台。它適用於藝術家,設計師,業餘愛好者以及任何對創建交互式對象或環境感興趣的人。
在連接並完成配置後,用戶可以通過建立好的串行接口進行多種讀寫操作。例如,可以使用串行監視器操控 UART 或是對微控制器進行編程。編程,編譯及上傳程序需要用到官方 Arduino IDE,可通過官方軟體源獲得。另外,用戶也可以自行選擇編譯器和編程器對微控制器進行編程。
安裝
- 需要官方 CLI 請安裝 arduino-cli包,需要新的 2.x 版本官方 IDE 請安裝 arduino-ide包。
- 啟用到設備的[#訪問串口|用戶訪問權限]]。
- 你可能需要加載
cdc_acm
模塊。
Arduino IDE 1.x
以下部分只適用於 1.x 版本的 IDE。不過,可能也有部分內容可用於新 IDE。
AVR 開發板
要使用Arduino Uno等AVR板,您可以選擇安裝 arduino-avr-core包,以使用Arch Linux上游avr-gcc代替捆綁的舊版avr-core。如果您仍然想使用較舊的arduino-core,則需要將它安裝在arduino的開發板管理器中[1]。您始終可以在「工具>面板」菜單中的不同內核之間切換。
Pinoccio Scout
Pinoccio Scouts[失效連結 2024-01-13 ⓘ] 也可以使用Arduino IDE編寫程序。可以在這裡[失效連結 2024-01-13 ⓘ]找到相關介紹。 此外你可以通過AUR來安裝arduino-pinoccioAUR。
Intel Galileo
要將Intel Galileo開發板與Arch Linux一起使用,請安裝Arduino IDE,然後通過「工具->板->板管理器」下載Galileo工具包。 修復安裝問題,請訪問github。
Arduino IDE 1.x 或 2.x
以下內容應同時適用於兩個版本的 IDE。
AVR 開發板
AVR 開發板在 2.x 版本的 IDE 上應已自動安裝,但在 1.x 和 2.x 版本上都可以通過開發板管理器管理 AVR 開發板。
SparkFun
如果要使用 Pro Micro 等 SparkFun 開發板,需要先下載開發板定義。更多信息請參考這裡和這裡。
RedBear Duo
你可能需要安裝 perl-archive-zip包,否則可能會出現 crc32 缺失錯誤。
配置
大多數 Arduino 開發板都提供了 USB 接口,以提供串行連接對開發板進行編程。然而,多數 Arduino 開發板使用的微控制器缺乏內置 USB 接口,因此板上通常會使用 USB 轉串行晶片來連接 USB 接口和微控制器。
為了通過 USB 傳輸串行信號,大部分官方 Arduino 開發板會使用一顆額外的 ATmega 微控制器(例如 ATmega16U2),或是使用 FTDI USB UART 轉換器(如 FT232RL)。這兩者都會將自身註冊為 ACM 設備,因此 Linux 將會使用到 cdc_acm
內核模塊。這一類的 Arduino 開發板會在系統中顯示為 /dev/ttyACMx
。
非官方的 Arduino 開發板通常會在接口晶片上扣成本,將其替換為中國產的 CH340 晶片或其仿冒品。CH340 會將自己描述為 USB 上的 UART 專有傳輸設備,因此 Linux 會使用到 ch341
內核模塊,這一類的開發板在系統中會顯示為 /dev/ttyUSBx
。該命名規則可通過 udev 規則進行修改。
有些開發板使用的微控制器自帶 USB 接口。無論開發板是否使用獨立的接口晶片,官方開發板出廠都會預裝啟動引導器,引導器會在連接到 USB 時自動建立串行連接。
訪問串口
對於通過 USB 暴露 UART 接口的板子,需要給予用戶串口的讀寫權限 [2]。根據 Udev#Allowing regular users to use devices 的說明,需要創建如下文件:
/etc/udev/rules.d/01-ttyusb.rules
SUBSYSTEMS=="usb-serial", TAG+="uaccess"
重新加載 udev 規則,然後重新連接 Arduino 設備。在上傳程序到 Arduino 前,請確保已在 1.x 的工具菜單和 2.x 的「選擇開發板」選項(位於 IDE 頂部)設置了正確的串行接口、開發板及處理器。
stty
設置:
# stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts
通過終端發送命令,無換行
# echo -n "Hello World" > /dev/ttyACM0
讀取Arduino發送的信息
$ cat /dev/ttyACM0
Arduino-Builder
您也可以使用arduino-builder包命令行工具來構建Arduino的內置例程。 為了使用所提供的arduino-avr-core包與上游avr-gcc包和avrdude包你需要創建一個小的設置文件:
build.options.json
{ "fqbn": "archlinux-arduino:avr:uno", "hardwareFolders": "/usr/share/arduino/hardware", "toolsFolders": "/usr/bin" }
通過下面的命令來編譯一個內置例程:
$ arduino-builder -build-options-file build.options.json blink.ino
或通過命令行傳遞所有選項:
$ arduino-builder -fqbn archlinux-arduino:avr:uno -hardware /usr/share/arduino/hardware -tools /usr/bin blink.ino
IDE 替代
Arduino-CMake
通過 Arduino-CMake-Toolchain 和 CMake,你可以在命令行下使用多個構建系統來構建 Arduino 固件。CMake 可以讓您使用自己喜歡的工具生成適合您需求的構建系統。它可以生成任何類型的構建系統,從簡單的 Makefile 到 Eclipse,Visual Studio,XCode 等完整項目。
需求:cmake包, arduino包組, avr-gcc包, avr-binutils包, avr-libc包, avrdude包.
Makefile
除了使用 Arduino IDE,還可以使用其他編輯器搭配上 Makefile。
設置目錄以對Arduino進行編程,然後將 Makefile 複製到該目錄中。可以從該 GitHub 示例獲取 Makefile 的副本。
您必須在此稍作修改以反映您的設置。Makefile應該很容易說明。這是您可能需要編輯的幾行:
PORT = usually /dev/ttyUSBx, where x is the usb serial port your arduino is plugged into TARGET = your sketch's name ARDUINO = /usr/share/arduino/lib/targets/arduino
根據您在例程代碼中調用的庫函數,您可能需要編譯庫的某些部分。為此,您需要編輯SRC和CXXSRC以包括所需的庫。
現在,您應該可以make && make upload
編譯並上傳您的程序到板子了。
Arduino-mk
arduino-mk 是另一種Makefile方法。它允許用戶使用包含Arduino.mk的本地Makefile。具體用法參見項目頁。
對於Arduino 1.5,請嘗試以下本地Makefile(因為Arduino 1.5的庫目錄結構略有不同):
ARDUINO_DIR = /usr/share/arduino ARDMK_DIR = /usr/share/arduino AVR_TOOLS_DIR = /usr AVRDUDE_CONF = /etc/avrdude.conf ARDUINO_CORE_PATH = /usr/share/arduino/hardware/archlinux-arduino/avr/cores/arduino ARDUINO_PLATFORM_LIB_PATH = /usr/share/arduino/hardware/archlinux-arduino/avr/libraries BOARDS_TXT = /usr/share/arduino/hardware/archlinux-arduino/avr/boards.txt ARDUINO_VAR_PATH = /usr/share/arduino/hardware/archlinux-arduino/avr/variants BOOTLOADER_PARENT = /usr/share/arduino/hardware/archlinux-arduino/avr/bootloaders BOARD_TAG = uno ARDUINO_LIBS = include /usr/share/arduino/Arduino.mk
在某些情況下,您可能需要安裝avr-libc包和avrdude包。
Scons
結合使用scons和arscons,可以很容易地從命令行編譯和上傳Arduino項目。 Scons基於python,您將需要python-pyserial才能使用串行接口。安裝python-pyserial包和scons包。
這也將同時獲得您需要的依賴項。您還將需要Arduino本身,請參考上所述進行安裝。創建項目目錄(例如test),然後在新目錄中創建arduino項目文件。使用與目錄相同的名稱並添加.ino(例如test.ino)。從arscons獲取SConstruct腳本並將其放在目錄中。大致看一下內容,如有必要,對其進行編輯。這是一個python腳本。根據需要編輯項目,然後運行
$ scons # This will build the project $ scons upload # This will upload the project to your Arduino
PlatformIO
PlatformIO 是一個 python 工具,用於為多個硬體平台構建和上傳程序,在編寫本文時,它支持基於 Arduino/AVR,TI MSP430 和 TI TM4C12x 的開發板。作者計劃在不久的將來添加一個庫功能,該功能允許直接從 GitHub 搜索和導入庫。
安裝
安裝 platformio-core包 或 {platformio-gitAUR。
使用
一線內容基於官方 PlatformIO 入門指南,展示了如何創建和上傳示例項目。
為 platformio 項目創建一個新文件夾,並進入到目錄內。 然後執行以下命令來為特定開發板初始化項目(此處為 megaatmega2560):
$ pio project init --board megaatmega2560
這將下載所需工具鏈和依賴,並創建 platformio.ini
文件:
platformio.ini
; PlatformIO Project Configuration File [env:megaatmega2560] platform = atmelavr board = megaatmega2560 framework = arduino
創建並將代碼添加到 src/ 目錄下的 main.cpp 文件內,可參考快速入門指南中的示例代碼。
然後編譯代碼並將其上傳到 platformio.ini 中指定的設備上:
$ pio run $ pio run --target upload
Emacs
當然可以將 Emacs 配置為IDE。
安裝 emacs-arduino-mode-gitAUR,以便在 emacs 中啟用 arduino-mode
。
在初始化腳本添加下列內容:
~/.emacs
;; arduino-mode (require 'cl) (autoload 'arduino-mode "arduino-mode" "Arduino editing mode." t) (add-to-list 'auto-mode-alist '("\.ino$" . arduino-mode))
您可以使用 M-x compile
make upload
和 Arduino-mk
(見上文)來編譯和上傳程序。
參見: [3].
排障
Arduino 設備命名持久化
如果您有多個arduino,您可能已經注意到,它們的名稱 /dev/ttyUSB[0-9]
是按連接順序分配的。在IDE中,這並不是什麼大問題,但是當您編寫了自己的軟體以在後台與arduino項目進行通信時,這可能會很煩人。使用以下udev規則為arduino分配靜態符號連結:
/etc/udev/rules.d/52-arduino.rules
SUBSYSTEMS=="usb", KERNEL=="ttyUSB[0-9]*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="sensors/ftdi_%s{serial}"
您的arduino將以 /dev/sensors/ftdi_A700dzaF
之類的名稱提供。如果您願意,還可以為多個設備分配更有意義的名稱,如下所示:
/etc/udev/rules.d/52-arduino.rules
SUBSYSTEMS=="usb", KERNEL=="ttyUSB[0-9]*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A700dzaF", SYMLINK+="arduino/nano"
這將在 /dev/arduino/nano
中創建到具有指定序列號的設備的符號連結。
您需要將 arduino 拔出並重新插入才能使它生效,也可以運行:
# udevadm trigger
常見的 idVendor
/idProduct
對可在發行包中的 /usr/share/arduino/hardware/archlinux-arduino/avr/boards.txt
中找到。請注意,其中一些(尤其是 FTDI)並不是Arduino平台所獨有的。使用 serial
屬性是區分各種設備的好方法。
無法開啟串口
在 IDE 啟動時,您可能最初會看到串行埠,但是在上傳固件時,TX/RX 指示燈無任何變化。您可能之前將串口監視器中的波特率更改為了它不喜歡的內容。編輯 ~/.arduino/preferences.txt
,將 serial.debug_rate
修改為不同的速度,例如 115200。
使用 Uno/Mega2560
Arduino Uno 和 Mega2560 具有一個板載 USB 接口(Atmel 8U2),用來接收串口數據,因此,在 USB 插入後,可以通過 cdc-acm 內核模塊創建的 /dev/ttyACM0
來訪問它們。
8U2 固件可能需要更新才能方便串行通信,詳細信息可參考 [4],並在回復 #11 中找到修複方法。最早在 Arduino bbs 上有一張圖解釋了如何將 Uno 啟動到 DFU 模式,但現在已進入只讀狀態。如果你沒有查看該圖所需的帳號,可以參考 [5]。
您可以通過將 Uno 置於環回模式並在 115200 波特的 arduino 串行監視器中鍵入字符來對 Uno 進行常規功能測試。它應將字符回顯給您。要將其置於環回狀態,請在數字端短接引腳 0->1,並在鍵入時按住復位按鈕或將 GND->RESET 引腳短路。
無法識別中國制廉價 Mega2560 的 USB 連接
試試安裝驅動: i2c-ch341-dkmsAUR
上傳失敗:編程器無響應
將處理器設置從 ATmega328P
更改為 ATmega328P (Old Bootloader)
(請參閱Arduino IDE中的「工具」->「處理器」)可能有助於解決上傳失敗的問題。
串口與 brltty 衝突
如果未找到 arduino 的 /dev/ttyUSB*
串口,且在設備已連接時 journal 包含如下內容:
usb 3-1: usbfs: interface 0 claimed by ch341 while 'brltty' sets config #1 ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0
無法上傳到連接中的 Nano RP2040
如果你在上傳時出現:
Failed uploading: uploading error: exit status 1
你沒有進行[#訪問串口]]中的步驟:請跟隨文檔步驟授予用戶串口的讀寫操作權限。