跳转到内容

Arduino

来自 Arch Linux 中文维基

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-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 可以让您使用自己喜欢的工具生成适合您需求的构建系统。它可以生成任何类型的构建系统,从简单的 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-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

上传失败:编程器无响应[编辑 | 编辑源代码]

将处理器设置从 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

你没有进行[#访问串口]]中的步骤:请跟随文档步骤授予用户串口的读写操作权限。

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