Arduino - Arch Linux 中文维基

跳至內容

# Arduino

出自 Arch Linux 中文维基

相關文章

- AVR

翻譯狀態：

- 本文（或部分內容）譯自 Arduino，最近一次同步於 2024-11-27，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

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 時自動建立串行連接。

注意：類似 Pro Mini 這樣的板子不提供 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 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-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

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

### 無法上傳到連接中的 Nano RP2040

如果你在上傳時出現：

    Failed uploading: uploading error: exit status 1

你沒有進行[#訪問串口]]中的步驟：請跟隨文檔步驟授予用戶串口的讀寫操作權限。

## 參見

- 官方網站
- IDE v2 入門指南
- https://answers.ros.org/question/9097/how-can-i-get-a-unique-device-path-for-my-arduinoftdi-device/

分類：​

- 開發
- 科學
- 包含失效連結的頁面
- 使用「模板:過時」標記的頁面或章節

Arduino
新增話題