
Arduino CLI
全体の例
では、例として簡単なスケッチを用意してインストールから一連の作業をしてみます。
用意したのは、Seeed StudioのXIAO ESP32C3です。
選択に深い意味があるわけではありませんが、普通のArduinoと違うので、デフォルトに期待ができません。そのため指定するべきものを指定しなければならないという点で、説明に向いているかなというくらいです。
インストール
とりあえずarduino-cli
本体はインストール済みということにします。私は、特別に何も考えることはないので、インストールおよび環境設定/本体の最初にあるコマンドラインでインストールしたままです。
インストールしたら、初期化しておきます。
$ arduino-cli config init
Config file written to: /home/ogochan/.arduino15/arduino-cli.yaml
A new release of Arduino CLI is available: 0.34.2 → 0.35.0
https://arduino.github.io/arduino-cli/latest/installation/#latest-packages
コアのインストール
まず、コアをインストールします。その前に、どんなコアが必要なのか知るために、ボードリストを見てみましょう。
シリアルポートにArduino(XIAO ESP32C3)をつないでボードリストを見てみます。
$ arduino-cli board list
Downloading index: library_index.tar.bz2 downloaded
Downloading index: package_index.tar.bz2 downloaded
Downloading missing tool builtin:ctags@5.8-arduino11...
builtin:ctags@5.8-arduino11 downloaded
Installing builtin:ctags@5.8-arduino11...
Skipping tool configuration....
builtin:ctags@5.8-arduino11 installed
Downloading missing tool builtin:serial-discovery@1.4.0...
builtin:serial-discovery@1.4.0 downloaded
Installing builtin:serial-discovery@1.4.0...
Skipping tool configuration....
builtin:serial-discovery@1.4.0 installed
Downloading missing tool builtin:mdns-discovery@1.0.9...
builtin:mdns-discovery@1.0.9 downloaded
Installing builtin:mdns-discovery@1.0.9...
Skipping tool configuration....
builtin:mdns-discovery@1.0.9 installed
Downloading missing tool builtin:serial-monitor@0.13.0...
builtin:serial-monitor@0.13.0 downloaded
Installing builtin:serial-monitor@0.13.0...
Skipping tool configuration....
builtin:serial-monitor@0.13.0 installed
Downloading missing tool builtin:dfu-discovery@0.1.2...
builtin:dfu-discovery@0.1.2 downloaded
Installing builtin:dfu-discovery@0.1.2...
Skipping tool configuration....
builtin:dfu-discovery@0.1.2 installed
Port Protocol Type Board Name FQBN Core
/dev/ttyACM1 serial Serial Port (USB) ESP32S3 CAM LCD esp32:esp32:esp32s3camlcd esp32:esp32
/dev/ttyS9 serial Serial Port Unknown
何やらいろいろダウンロードされていますが、これは真っ新な状態でこのようなコマンドを入れると自動的に必要なファイルをダウンロードするためです。最後の3行ほどが、arduino-cli board list
の処理結果です。
これを見ると、コアはesp32:esp32
であることがわかります。でも、ボード名やFQBNが何か変な感じですね。はっきり言ってこれは間違いです。arduino-cli board list
をもう一度実行してみると、
$ arduino-cli board list
Port Protocol Type Board Name FQBN Core
/dev/ttyACM1 serial Serial Port (USB) ESP32-S3-Box esp32:esp32:esp32s3box esp32:esp32
/dev/ttyS9 serial Serial Port Unknown
また違うことを言って来ますね。アテになりません。そこで、標準サポートのコアの一覧を表示してみます。
arduino-cli board search esp32
Board Name FQBN Platform ID
Arduino Nano ESP32 arduino:esp32
ESP32 Dev Board esp32:esp32
ESP32-C3 Dev Board esp32:esp32
ESP32-S2 Dev Board esp32:esp32
ESP32-S3 Dev Board esp32:esp32
どうもESP32はS系列(xtensa)もC系列(RISC-V)もesp32:esp32
というコアで良いことがわかります。そこで、esp32:esp32
のコアをインストールします。
$ arduino-cli core install esp32:esp32
Downloading packages...
esp32:xtensa-esp32-elf-gcc@esp-2021r2-patch5-8.4.0 downloaded
esp32:xtensa-esp32s2-elf-gcc@esp-2021r2-patch5-8.4.0 downloaded
esp32:xtensa-esp32s3-elf-gcc@esp-2021r2-patch5-8.4.0 downloaded
esp32:xtensa-esp-elf-gdb@11.2_20220823 downloaded
esp32:riscv32-esp-elf-gcc@esp-2021r2-patch5-8.4.0 downloaded
esp32:riscv32-esp-elf-gdb@11.2_20220823 downloaded
esp32:openocd-esp32@v0.11.0-esp32-20221026 downloaded
esp32:esptool_py@4.5.1 downloaded
esp32:mkspiffs@0.2.3 downloaded
esp32:mklittlefs@3.0.0-gnu12-dc7f933 downloaded
arduino:dfu-util@0.11.0-arduino5 downloaded
esp32:esp32@2.0.11 downloaded
Installing esp32:xtensa-esp32-elf-gcc@esp-2021r2-patch5-8.4.0...
Configuring tool....
esp32:xtensa-esp32-elf-gcc@esp-2021r2-patch5-8.4.0 installed
Installing esp32:xtensa-esp32s2-elf-gcc@esp-2021r2-patch5-8.4.0...
Configuring tool....
esp32:xtensa-esp32s2-elf-gcc@esp-2021r2-patch5-8.4.0 installed
Installing esp32:xtensa-esp32s3-elf-gcc@esp-2021r2-patch5-8.4.0...
Configuring tool....
esp32:xtensa-esp32s3-elf-gcc@esp-2021r2-patch5-8.4.0 installed
Installing esp32:xtensa-esp-elf-gdb@11.2_20220823...
Configuring tool....
esp32:xtensa-esp-elf-gdb@11.2_20220823 installed
Installing esp32:riscv32-esp-elf-gcc@esp-2021r2-patch5-8.4.0...
Configuring tool....
esp32:riscv32-esp-elf-gcc@esp-2021r2-patch5-8.4.0 installed
Installing esp32:riscv32-esp-elf-gdb@11.2_20220823...
Configuring tool....
esp32:riscv32-esp-elf-gdb@11.2_20220823 installed
Installing esp32:openocd-esp32@v0.11.0-esp32-20221026...
Configuring tool....
esp32:openocd-esp32@v0.11.0-esp32-20221026 installed
Installing esp32:esptool_py@4.5.1...
Configuring tool....
esp32:esptool_py@4.5.1 installed
Installing esp32:mkspiffs@0.2.3...
Configuring tool....
esp32:mkspiffs@0.2.3 installed
Installing esp32:mklittlefs@3.0.0-gnu12-dc7f933...
Configuring tool....
esp32:mklittlefs@3.0.0-gnu12-dc7f933 installed
Installing arduino:dfu-util@0.11.0-arduino5...
Configuring tool....
arduino:dfu-util@0.11.0-arduino5 installed
Installing platform esp32:esp32@2.0.11...
Configuring platform....
Platform esp32:esp32@2.0.11 installed
よく見ると、ESP32のS系列とC系列の両方に対応したものが入るっぽいですね。
FQBNの確認
さてコアが入ったところでボードの確認をします。
$ arduino-cli board list
Port Protocol Type Board Name FQBN Core
/dev/ttyACM1 serial Serial Port (USB) ESP32-S3-Box esp32:esp32:esp32s3box esp32:esp32
/dev/ttyS9 serial Serial Port Unknown
とは言え、やっぱりboard list
には嘘をつかれてるっぽいので、arduino-cli board listall
を使って探してみます。
$ arduino-cli board listall xiao
Board Name FQBN
XIAO_ESP32C3 esp32:esp32:XIAO_ESP32C3
XIAO_ESP32S3 esp32:esp32:XIAO_ESP32S3
これを見ると、どうやらFQBNはesp32:esp32:XIAO_ESP32C3
だということがわかります。
これでプロジェクトを始める準備ができました。
スケッチの作成
プロジェクトを始めるためには、まずスケッチを作ります。
$ arduino-cli sketch new foo
foo
というディレクトリが作られました。
$ cd foo/
$ ls
foo.ino
$
foo
の中にはfoo.ino
というファイルがあります。
中を見てみます。
$ cat foo.ino
void setup() {
}
void loop() {
}
中身が空のスケッチが出来てます。このsetup()
とloop()
の中にいろいろ書いて行けば良いですね。
Arduinoプログラミングの細かい話は、ここではしません。
とりあえず以後の作業のために簡単なスケッチを用意します。
通常、この手のことをやってみるには「Lチカ」が定番なのですが、XIAO ESP32C3のボード上には、そういった用途に使えるLEDがついていません。LEDはあるのですが、これはUSBポートの接続と連動しているだけで、GPIO等につながっているわけではないので、この用途には使えません。そこで、monitor
コマンドの確認も兼ねて「Hello」を表示するスケッチを作ります。
void setup()
{
Serial.begin(115200);
Serial.printf("");
}
#define INTERVAL 5 * 1000
static int count;
void loop()
{
Serial.printf("Hello %d\r\n", count);
delay(INTERVAL);
count += INTERVAL;
}
delay()
は1ms単位の停止なので、5秒毎に「Hello 数字」を表示しますね。
コンパイルする
まず何も考えないでスケッチをコンパイルしてみます。
単純にコンパイルするだけなら、--fqbn
を使ってFQBNを指定します。
$ arduino-cli compile --fqbn esp32:esp32:XIAO_ESP32C3
Sketch uses 227042 bytes (17%) of program storage space. Maximum is 1310720 bytes.
Global variables use 13524 bytes (4%) of dynamic memory, leaving 314156 bytes for local variables. Maximum is 327680 bytes.
Used platform Version Path
esp32:esp32 2.0.11 /home/ogochan/.arduino15/packages/esp32/hardware/esp32/2.0.11
うまく行きました。
ボードに書き込む
うまく出来たので、ボードに書いてみます。
$ arduino-cli upload --fqbn esp32:esp32:XIAO_ESP32C3 -p /dev/ttyACM1
esptool.py v4.5.1
Serial port /dev/ttyACM1
Connecting...
Chip is ESP32-C3 (revision v0.4)
Features: WiFi, BLE
Crystal is 40MHz
MAC: 34:85:18:25:c1:14
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Flash will be erased from 0x00000000 to 0x00003fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Flash will be erased from 0x0000e000 to 0x0000ffff...
Flash will be erased from 0x00010000 to 0x0004afff...
Compressed 13216 bytes to 9528...
Writing at 0x00000000... (100 %)
Wrote 13216 bytes (9528 compressed) at 0x00000000 in 0.2 seconds (effective 475.5 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 146...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (146 compressed) at 0x00008000 in 0.0 seconds (effective 533.2 kbit/s)...
Hash of data verified.
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 744.0 kbit/s)...
Hash of data verified.
Compressed 238192 bytes to 133666...
Writing at 0x00010000... (11 %)
Writing at 0x0001ad77... (22 %)
Writing at 0x0002223a... (33 %)
Writing at 0x00028197... (44 %)
Writing at 0x0002e3c6... (55 %)
Writing at 0x0003416a... (66 %)
Writing at 0x0003bdda... (77 %)
Writing at 0x00042b34... (88 %)
Writing at 0x0004910a... (100 %)
Wrote 238192 bytes (133666 compressed) at 0x00010000 in 2.1 seconds (effective 898.6 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
New upload port: /dev/ttyACM1 (serial)
どうやらうまく書けたようです。
シリアルポートを見てみる
スケッチを書いてみたものの、何も起きませんね。スケッチを見ればわかりますが、シリアルポートに文字列を書いているだけなので、何も見えません。そこでシリアルポートの内容を見てみましょう。
$ arduino-cli monitor -p /dev/ttyACM1
Connected to /dev/ttyACM1! Press CTRL-C to exit.
Hello 230000
Hello 235000
Hello 240000
Hello 245000
Hello 250000
Hello 255000
いきなり大きな数字が出て来ましたが、「Hello」を表示し続けてる感じです。数字が大きいのは、monitor
する前からスケッチは動いていたということですね。
プロファイルを使って楽をする
以上で一通りの作業はできるようになりましたが、一々FQBNを指定するのは面倒臭いですね。長いFQBNだと売ち間違えたりしますし。
そこでプロファイルを作って楽をしたいと思います。
プロファイルの雛形は、compile
のオプションで生成させることができます。
$ arduino-cli compile --fqbn esp32:esp32:XIAO_ESP32C3 --dump-profile --no-color --only-compilation-database
Used platform Version Path
esp32:esp32 2.0.11 /home/ogochan/.arduino15/packages/esp32/hardware/esp32/2.0.11
profiles:
XIAO_ESP32C3:
fqbn: esp32:esp32:XIAO_ESP32C3
platforms:
- platform: esp32:esp32 (2.0.11)
ここで必要なのは、profiles:
以下で、ここを切り出してsketch.yaml
というファイルを作れば、とりあえずの情報を作ることができます。
出力の最初の3行が邪魔なのですが、これを出さないオプションが見つからなかったので、とりあえず手作業で外します。
profiles:
XIAO_ESP32C3:
fqbn: esp32:esp32:XIAO_ESP32C3
platforms:
- platform: esp32:esp32 (2.0.11)
これがあれば、たとえばコンパイルは、
$ arduino-cli compile --profile XIAO_ESP32C3
のようにすれば良くなります。プロファイル名が長くて面倒であれば、もっと短くしても構いません。
ちなみに私がこれらを試すために作ったsketch.yaml
は、
profiles:
esp32:
fqbn: esp32:esp32:esp32
platforms:
- platform: esp32:esp32 (2.0.11)
XIAO:
fqbn: esp32:esp32:XIAO_ESP32C3
platforms:
- platform: esp32:esp32 (2.0.11)
default_port: /dev/ttyACM0
こんな感じになっています。これれであれば、
$ arduino-cli compile --profile XIAO
となってくれます。
詳しくは、スケッチメタ情報を見て下さい。