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

参见[编辑 | 编辑源代码]