Arduino

来自 ArchWiki

Arduino 是一个开源电子原型平台,它基于灵活、易用的硬件和软件。它旨在为艺术家、设计师、业余爱好者以及任何对创建交互式对象或环境感兴趣的人而设计。

一旦连接和配置好,用户可以通过已建立的串口连接执行读/写任务。例如,可以使用串口监视程序通过 UART 进行接口操作,或者对微控制器进行编程。官方 Arduino IDE 方便了代码的编写、编译和上传,该 IDE 在官方仓库中可用。同样,用户也可以使用自己选择的编译器和编程器来对微控制器进行编程。

安装

Arduino IDE 1.x

以下章节仅适用于 IDE 的 1.x 版本。但是,有可能将其中一些内容适配到新的 IDE。

AVR 开发板

要使用 AVR 开发板(例如 Arduino Uno),您可以选择安装 arduino-avr-core,以使用 Arch Linux 上游的 avr-gcc 而不是捆绑的旧版本 avr-core。如果您仍然想使用旧版本的 arduino-core,则需要在开发板管理器中安装它。您可以随时在工具 > 开发板菜单中切换不同的核心。

Pinoccio Scout

Pinoccio Scouts 也可以使用 Arduino IDE 进行编程。说明可以在这里找到。或者,您可以安装 arduino-pinoccioAUR

Intel Galileo

要在 Arch Linux 中使用 Intel Galileo 开发板,请安装 Arduino IDE 并通过工具 > 开发板 > 开发板管理器下载 Galileo 工具包。要修复安装问题,您可以参考这个 github 帖子

Arduino IDE 1.x 或 2.x

这些步骤应该适用于 IDE 的两个版本。

AVR 开发板

AVR 开发板在 IDE 的 2.x 版本中自动安装,但在 1.x 和 2.x 版本中,AVR 开发板都可以从开发板管理器中进行管理。

SparkFun

要使用 SparkFun 开发板(例如 Pro Micro),您需要下载它们的开发板定义。更多信息请参阅这里这里

RedBear Duo

您可能需要安装 perl-archive-zip,否则您会收到关于缺少 crc32 的错误。

配置

大多数 Arduino 开发板都有一个 USB 端口,可用于建立串口连接。此串口连接允许用户对开发板进行编程。然而,大多数 Arduino 的主微控制器没有内置 USB 接口。因此,开发板通常配备一个 USB 转串口芯片,位于主微控制器和 USB 端口之间。

为了通过 USB 实现串口连接,大多数正品 Arduino 开发板都配备了另一个 ATmega 微控制器(例如 ATmega16U2)或一个 FTDI USB UART 转换器(例如 FT232RL)。这两个芯片都将自己注册为 USB 上的 ACM 设备,因此,Linux 将使用 cdc_acm 模块。Arduino 随后将显示为 /dev/ttyACMx

非正品 Arduino 开发板在接口芯片上偷工减料。它们通常配备中国的 WCH CH340x 或上述型号的仿冒品。CH340x 将自身暴露为 USB 设备上的专有 UART。这里使用 ch341 模块,使此类 Arduino 显示为 /dev/ttyUSBx。可以通过更改 udev 规则来自定义此命名模式。

有些开发板可能配备主微控制器,该微控制器本身就暴露了原生 USB 接口。无论开发板是否有专用接口芯片,正品开发板出厂时都会预装正确的引导加载程序。这些引导加载程序在连接后会自动建立 USB 串口连接。

注意: 有些开发板,特别是 Pro Mini,根本不暴露 USB 端口,必须使用额外的硬件进行编程。
提示: 当插入开发板时,使用 dmesg 监控内核消息可能很有用。如果成功建立连接,则可以在其中读取分配的端口。

访问串口

对于通过 USB 暴露 UART 的开发板,有必要允许用户对串口进行读/写访问[1]。正如 Udev#允许普通用户使用设备 中解释的那样,创建一个包含以下内容的文件

/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、screen、picocom...)直接与您的开发板通信,则需要禁用此功能。如果您有 Leonardo 开发板,则无需担心,因为它不会自动复位。如果您有 Uno 开发板,请在 RESET 和 GND 引脚之间连接一个 10 µF 电容。如果您有其他开发板,请在 RESET 和 5V 引脚之间连接一个 120 欧姆电阻。有关更多详细信息,请参阅 https://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection

读取 Arduino 要告诉您的内容

$ cat /dev/ttyACM0

Arduino-Builder

此文章或章节已过时。

原因: 本节是在 IDE 2.x 版本发布之前编写的,功能的描述可能不准确。在 Arduino-Builder 的 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 的替代方案

Arduino-CMake

使用 Arduino-CMake-ToolchainCMake,您可以使用多种构建系统从命令行构建 Arduino 固件。CMake 允许您使用您喜欢的工具生成适合您需求的构建系统。它可以生成任何类型的构建系统,从简单的 Makefiles 到 Eclipse、Visual Studio、XCode 等的完整项目。

要求: cmakearduinoavr-gccavr-binutilsavr-libcavrdude

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-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 工具,用于为多个硬件平台构建和上传 sketches,在撰写本文时,这些平台包括 Arduino/AVR 板、TI MSP430 和 TI TM4C12x 板。在不久的将来,作者计划添加一个库功能,允许直接从 GitHub 搜索和包含库。

安装

安装 platformio-coreplatformio-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

添加到 init 脚本

~/.emacs
;; arduino-mode
(require 'cl)
(autoload 'arduino-mode "arduino-mode" "Arduino editing mode." t)
(add-to-list 'auto-mode-alist '("\.ino$" . arduino-mode))

您可以使用 Arduino-mk(见上文)通过 M-x compile make upload 编译和上传 sketches。

主要资源:此处

故障排除

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),可以接收串行数据,因此可以通过插入时由 cdc-acm 内核模块创建的 /dev/ttyACM0 访问它们。

8U2 固件可能需要更新以简化串行通信。有关更多详细信息,请参见 [2],有关修复程序,请参见回复 #11。原始 arduino bbs,您可以在其中找到解释如何使 Uno 进入 DFU 模式的图像,现在处于只读状态。如果您没有帐户查看图像,请参见 [3]

您可以通过将 Uno 置于环回模式并在 arduino 串口监视器中以 115200 波特率键入字符来执行 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 软件包。有关更多详细信息,请参见 [4]

Nano RP2040 Connect 上传失败

如果您的上传失败并显示

Failed uploading: uploading error: exit status 1

您跳过了 #访问串口:请按照其说明允许用户对串口进行读/写访问。

另请参阅