背景
最近我正在准备一个智能车比赛,需要利用 Arduino 开发板实现核心的功能。网上通常的 Arduino 开发环境是 Arduino IDE,
这确实是一个完美的方案。不过这将意味着我在开发 Arduino 时不能使用我最爱的 vscode,我不能接受。(bushi)
于是,我不禁思考,能否将 Arduino 与 vscode 结合起来?正好 Arduino 官方也提供了一个命令行工具,它就是我们的主角:Arduino CLI。
以下是我在 wsl2 里配置相关环境的大概步骤。
安装 Arduino CLI
官网的教程里提供了很多种安装方法,比如直接用包管理器安装:
brew update
brew install arduino-cli
不过我没有装 Homebrew,而且 apt
找不到 arduino-cli,这个方法只能作罢。
另一种办法是使用安装脚本,比如当运行以下脚本时,Arduino CLI 就会被安装到 $PWD/bin
文件夹下:
curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh
我在主目录下运行了脚本,它就安装到了 ~/bin
下。github 的访问不太稳定时,可以考虑代理/镜像。
安装完成后,记得把安装目录添加到环境变量,最简单的方法是在 .bashrc
下添加一行:
export PATH=$PATH:<directory>
<directory>
里就是 Arduino CLI 安装到的目录。最后别忘了 source ~/.bashrc
以使更改生效。
当在终端输入
arduino-cli
时,输出了一大堆使用说明,证明我们的安装就完成了。
这时我的主目录里还会出现了一个 .arduino15
文件夹。
创建第一个项目
这里还是参考了官网的教程。
在创建第一个项目前,我们需要先创建一个配置文件(虽然这不是必需的,但是后面会使用到它):
arduino config init
这会在主目录的 .arduino15
文件下生成一个 arduino-cli.yaml
的配置文件,不过约等于空。
想要在当前目录下新建一个项目,只需要 new 一下:
arduino-cli sketch new MyFirstSketch
这会在当前目录下从创建一个 MyFirstSktech
文件夹,里面有一个 MyFirstSketch.ino
文件,
这里面就可以写我们的代码了,先写一个经典点灯:
#include "Arduino.h"void setup() {pinMode(LED_BUILTIN, OUTPUT);
}void loop() {digitalWrite(LED_BUILTIN, HIGH);delay(1000);digitalWrite(LED_BUILTIN, LOW);delay(1000);
}
接下来,就是把这个的项目编译并烧录到开发板上就可以了。不过,当我们把 Arduino 开发板插到电脑上时,
WSL2 并不会自动连接这个设备,这时可以看微软的相关教程:连接 USB 设备 | Microsoft Learn。
在连接成功后,输入
arduino-cli board list
应该就可以看到开发板了。
在编译之前,按照官方教程,我们还要安装对应于开发板的平台核心(platform core)。比如对于 Arduino UNO R3 开发板,其核心为 arduino:avr
:
arduino-cli core install arduino:avr
安装完成后,就可以编译了:
arduino-cli compile --fqbn arduino:avr:uno MyFirstSketch
这里的 --fqbn
对应于开发板的 FQBN。对于 Arduino UNO R3,其 FQBN 为 arduino:avr:uno
。
编译成功后,就可以烧录到开发板上了:
arduino-cli upload -p /dev/ttyUSB0 --fqbn arduino:avr:uno MyFirstSketch
不过当我们真的运行以上命令时,可能会出现 /dev/ttyUSB0
无法访问的情况。大概率是权限不够,可以考虑采用如下方法:
- 检查设备权限:
ls -l /dev/ttyUSB0
可能会有一个dialout
或其他的东西,其为设备所属为用户组。 - 把当前用户添加到用户组中:
sudo usermod -a -G dialout $USER
- 注销并重新登录以使更改生效
临时用的话还可以考虑更直接的;
sudo chmod 666 /dev/ttyUSB0
之后应该就可以成功烧录了。
之后在 vscode 里就可以愉快地写代码了,不过如何启动自动补全?
自动补全
本来我想找一个 Arduino 拓展帮我实现的,我看网上大多数教程也是这么办的。
但是我寻遍拓展商店,找不到微软官方对 Arduino 的拓展(很奇怪,网上的教程里说可以找到),
又不想用第三方开发者的拓展。没办法,只能寄希望于已有的 clangd。
clangd 需要一个 compile_commands.json
文件,这时,先前的 arduino-cli.yaml
就派上用场了,
可以在其中添加如下条目:
build:compile_commands: true
然后在编译时添加 --build-path
选项:
arduino-cli compile --fqbn arduino:avr:uno --build-path MyFirstSketch/build MyFirstSketch
这样一来,项目文件夹下会出现一个 build
文件夹,其中就有我们希望的 compile_commands.json
文件。之后再打开 .ino
文件,就可以看到自动补全等功能可以正常使用了。
如果要经常编译烧录的话,不妨写一个脚本自动化运行,还是挺方便的。
以上只是一个折腾记录,如果嫌繁琐建议直接上 Arduino IDE,它才是 Arduino 开发的正解。