Arduino

出自 Arch Linux 中文维基

Arduino 是一款便捷靈活、方便上手的開源電子原型平台。它適用於藝術家,設計師,業餘愛好者以及任何對創建交互式對象或環境感興趣的人。

在連接並完成配置後,用户可以通過建立好的串行接口進行多種讀寫操作。例如,可以使用串行監視器操控 UART 或是對微控制器進行編程。編程,編譯及上傳程序需要用到官方 Arduino IDE,可通過官方軟件源獲得。另外,用户也可以自行選擇編譯器和編程器對微控制器進行編程。

安裝[編輯 | 編輯原始碼]

  • 需要 1.x 版本的 IDE 請安裝 arduino,需要官方 CLI 請安裝 arduino-cli,需要新的 2.x 版本官方 IDE 請安裝 arduino-ide-binAUR。1.x 版本 IDE 的官方文檔可通過安裝 arduino-docs 獲取。
  • 啟用到設備的[#訪問串口|用户訪問權限]]。
  • 你可能需要加載 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 開發板。1.x 版本的相關文檔可在這裏獲取。

SparkFun[編輯 | 編輯原始碼]

如果要使用 Pro Micro 等 SparkFun 開發板,需要先下載開發板定義。更多信息請參考這裏這裏

RedBear Duo[編輯 | 編輯原始碼]

你可能需要安裝 perl-archive-zip,否則可能會出現 crc32 缺失錯誤。

配置[編輯 | 編輯原始碼]

為使用 USB 與 Arduino 進行交互,正版開發板通常會使用一顆 ATmegaxU2 晶片,其將自身註冊為 ACM 設備。在 Linux 上會用到 cdc_acm 模塊。當開發板連接到設備上時,Arduino 會顯示為 /dev/ttyACMx

非正版 Arduino 開發板一般會在接口晶片上省錢,通常會將其替換為中國產的 CH34x 系列。CH34x 並沒有實現上述標準,並將其自身描述為 UART 轉 USB 設備。這一過程需要用到 ch341 模塊,使得 Arduino 將顯示為 /dev/ttyUSBx。該命名規則可通過編輯 udev 規則進行修改。

注意: 在上傳程序期間需關閉所有串行監視器,以將串口釋放給編程器使用。

訪問串口[編輯 | 編輯原始碼]

對於通過 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 IDE,屏幕,picocom ...)直接與您的板通信,則需要禁用此功能。如果您有Leonardo面板,則不必擔心,因為它不會自動重置。如果您有Uno板,請在RESET和GND引腳之間連接一個10 µF電容器。如果有另一塊板,則在RESET和5V引腳之間連接一個120歐姆的電阻。 有關更多詳細信息,請參見 https://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection

讀取Arduino發送的信息

$ cat /dev/ttyACM0

Arduino-Builder[編輯 | 編輯原始碼]

本文內容或本節內容已經過期。

原因: 該部分寫於 2.x 版本 IDE 發佈前,因此相關功能描述可能有錯。在 GitHub 頁面上 Arduino-Builder 已被標記為過時,並將被 Arduino CLI 替代。 (在Talk:Arduino討論)

您也可以使用arduino-builder命令行工具來構建Arduino的內置例程。 為了使用所提供的arduino-avr-core與上游avr-gccavrdude你需要創建一個小的設置文件:

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 替代[編輯 | 編輯原始碼]

ArduIDE[編輯 | 編輯原始碼]

ArduIDE是基於QT的Arduino IDE,可通過安裝 arduide-gitAUR[損壞的連結:package not found] 獲得。

Arduino-CMake[編輯 | 編輯原始碼]

通過 Arduino-CMake-ToolchainCMake,你可以在命令行下使用多個構建系統來構建 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-mkAUR[損壞的連結:package not found] 是另一種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-libcavrdude

Scons[編輯 | 編輯原始碼]

結合使用sconsarscons,可以很容易地從命令行編譯和上傳Arduino項目。 Scons基於python,您將需要python-pyserial才能使用串行接口。安裝python-pyserialscons

這也將同時獲得您需要的依賴項。您還將需要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 uploadArduino-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

1.x 應用未隨窗口管理器調整大小,且菜單自動關閉[編輯 | 編輯原始碼]

參考 Java#灰色窗口/應用不隨窗口管理器調整大小/菜單自動關閉

上傳失敗:編程器無響應[編輯 | 編輯原始碼]

將處理器設置從 ATmega328P 更改為 ATmega328P (Old Bootloader)(請參閱Arduino IDE中的「工具」->「處理器」)可能有助於解決上傳失敗的問題。

1.x 版本在全新安裝後啟動崩潰,並提示 java.lang.NullPointerException 報錯[編輯 | 編輯原始碼]

需要安裝 arduino-avr-core

串口與 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

你可能需要卸載 brltty。詳細信息參見 [6]

無法上傳到連接中的 Nano RP2040[編輯 | 編輯原始碼]

如果你在上傳時出現:

Failed uploading: uploading error: exit status 1

本文或本章節的事實準確性存在爭議。

原因: 不要在未解釋作用的前提下建議用户運行任意腳本。(在 Talk:Arduino 中討論)


嘗試通過運行以下腳本配置 Raspberry Pi RP2040 啟動引導模式 udev 規則:

# ~/.arduino15/packages/arduino/hardware/mbed_nano/3.5.1/post_install.sh

參見[編輯 | 編輯原始碼]