Arduino CLI

 

全体の例

では、例として簡単なスケッチを用意してインストールから一連の作業をしてみます。

用意したのは、Seeed StudioXIAO 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

となってくれます。

詳しくは、スケッチメタ情報を見て下さい。