Arduino CLIを使ってみた

概要

Arduino CLIの1系が公開されて、実用的なバージョンになった雰囲気がしたので試してみました。ESP32だとPlatformIOが最新バージョンに対応しないなど、Arduino IDE環境を使い続けることを考えるとArduino CLIもかなり便利に利用することができました。

入手方法

GitHub - arduino/arduino-cli: Arduino command line tool
Arduino command line tool. Contribute to arduino/arduino-cli development by creating an account on GitHub.

上記から入手することができます。

winget install ArduinoSA.CLI

WinGetを利用してインストールを行うことも可能です。

  • “C:\Program Files\arduino-ide\resources\app\lib\backend\resources\arduino-cli.exe”

ただし、Arduino IDEをインストールしている場合には上記に入っています。WinGetに頑張って登録したのに。。。

実行方法

mkdir \work\arduino
cd \work\arduino

copy "C:\Program Files\arduino-ide\resources\app\lib\backend\resources\arduino-cli.exe" .
arduino-cli version

とりあえず一時フォルダを作成して、Arduino IDEの中に入っているArduino CLIをコピーして使ってみます。上記でバージョンが表示されるはずです。

初期化

arduino-cli update
arduino-cli upgrade

arduino-cli config init

とりあえず全体的に環境を更新します。上記でボードマネージャとライブラリマネージャを更新して、Arduino IDEの設定ファイルを作成しています。この手順は必須ではありません。

プロジェクト作成

arduino-cli sketch new MyFirstSketch
cd MyFirstSketch
copy "C:\Program Files\arduino-ide\resources\app\lib\backend\resources\arduino-cli.exe" .

新しいスケッチを作ってみます。

#include <esp_arduino_version.h>
#include <M5Unified.h>

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.print(ESP_ARDUINO_VERSION_MAJOR);
  Serial.print(".");
  Serial.print(ESP_ARDUINO_VERSION_MINOR);
  Serial.print(".");
  Serial.print(ESP_ARDUINO_VERSION_PATCH);
  Serial.println();
  delay(1000);
}

とりあえず上記に編集をして実行してみます。

実行

シリアルポートの確認

C:\Work\arduino\MyFirstSketch>arduino-cli board list
シリアルポート Protocol タイプ               Board Name FQBN Core
COM3    serial   Serial Port (USB) Unknown

arduino-cliへのpathを通していないので上位フォルダにあるものを呼びだしています。上記のコマンドで接続しているボードの一覧が表示されます。M5Stack ATOMを接続していたのでボード名は不明でCOM3に接続されているのがわかります。

SET ARDUINO_COM=COM3

とりあえずシリアルポート番号を環境変数に入れておきます。

ボードのFQBN確認

C:\Work\arduino\MyFirstSketch>arduino-cli board listall m5atom
Board Name FQBN
M5Atom     esp32:esp32:m5stack_atom
M5Atom     m5stack:esp32:m5stack_atom
M5AtomS3   esp32:esp32:m5stack_atoms3
M5AtomS3   m5stack:esp32:m5stack_atoms3
M5AtomS3R  m5stack:esp32:m5stack_atoms3r

ESP32純正環境と、M5Stack環境の2つをいれている状態でm5atomを含むボードのリストを取得しました。M5Atomが2つあり、公式とM5環境のFQBNが上記からわかりました。

SET ARDUINO_FQBN=m5stack:esp32:m5stack_atom

今回はM5Unifiedを利用しているのでM5環境版のM5Atomを利用します。環境変数にFQBNを保存しておきます。

ビルド

arduino-cli compile --fqbn %ARDUINO_FQBN% -v

ビルドします。-vオプションを付けているので詳細ログが表示されます。

転送

arduino-cli upload -v -p %ARDUINO_COM%

シリアルポートを指定して転送します。ビルドと転送は同時に行うことも可能です。

シリアルモニタ

arduino-cli monitor -p %ARDUINO_COM% --config baudrate=115200

コマンドラインからシリアルモニタを開くこともできます。これは別のアプリを使ったほうが便利かもしれません。

プロジェクトファイルを使ってみる

Arduino IDEでボードマネージャとライブラリを管理して、Arduino CLIをビルドだけをするのであれば複雑な設定は必要ありません。ただし、それだけだと他のエディタでソースコードを編集をして、Arduino IDEでビルドするのとあまり変わりません。

プロジェクトファイルを利用するとPlatformIOのようにバージョンを指定してのビルドが可能になります。ただしArduino IDEとはまったく別環境でのビルドになりますので注意してください。

スケッチを作成する

arduino-cli sketch new M5UnifiedTest

とりあえず新しいスケッチを作成します。

#include <esp_arduino_version.h>
#include <M5Unified.h>

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.print(ESP_ARDUINO_VERSION_MAJOR);
  Serial.print(".");
  Serial.print(ESP_ARDUINO_VERSION_MINOR);
  Serial.print(".");
  Serial.print(ESP_ARDUINO_VERSION_PATCH);
  Serial.println();
  delay(1000);
}

とりあえずArduinoのバージョン番号を表示するだけのスケッチです。

プロジェクトファイルを作成する

profiles:
  p_1:
    fqbn: esp32:esp32:m5stack_atom
    platforms:
      - platform: esp32:esp32 (3.0.5)
        platform_index_url: https://espressif.github.io/arduino-esp32/package_esp32_index.json
    libraries:
      - M5Unified (0.1.17)
      - M5GFX (0.1.17)

  p_2:
    fqbn: m5stack:esp32:m5stack_atom
    platforms:
      - platform: m5stack:esp32 (2.1.2)
        platform_index_url: https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
    libraries:
      - M5Unified (0.1.17)
      - M5GFX (0.1.17)

default_profile: m5atom

スケッチと同じ場所に「sketch.yaml」を置くことでプロジェクトの設定が可能です。上記は2つのプロファイルを設定しており、p_1がESP32公式環境、p_2がM5Stack環境になります。プラットフォームのURLと、バージョン番号も指定可能です。

arduino-cli compile -m p_1 --dump-profile

上記のようにmオプションでプロファイルを指定してビルドすることが可能です。利用したプロファイルを表示するオプションも追加しています。これでバージョン番号を指定してのビルドが可能です。特にボードマネージャは複数バージョンを同時ビルドする方法が公式ツールだとなかったので、プロジェクトごとにバージョンが違う場合には面倒でした。

GitHub - tanakamasayuki/esp32-arduino-test
Contribute to tanakamasayuki/esp32-arduino-test development by creating an account on GitHub.

私はボードマネージャーのURLをバージョンごとに用意することで、過去バージョンを同時に利用できるようにしていましたが、Arduino CLIのプロジェクトファイルを利用することでライブラリまで含めてバージョン指定が可能になりました。

Arduino CLIの自動ビルド環境構築

@ECHO OFF

IF EXIST "arduino-cli.exe" (
    ECHO arduino-cli find.
) ELSE (
    ECHO download arduino-cli
    curl -L https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Windows_64bit.zip -o arduino-cli_latest_Windows_64bit.zip
    tar -xf arduino-cli_latest_Windows_64bit.zip
    DEL arduino-cli_latest_Windows_64bit.zip
)
ECHO(

ECHO 対象ボードの選択
ECHO  1 : M5Stack Core2
ECHO  2 : M5Stack Core2 for AWS
SET /P arduino_n=上記より接続しているボードの番号を入力してください:
ECHO(

ECHO シリアルポートの選択
arduino-cli board list
SET /P arduino_com=上記の一覧より接続しているCOMの番号をCOM3のように入力してください:
ECHO(

ECHO ビルド開始
arduino-cli compile -m p_%arduino_n% --dump-profile
ECHO ビルド終了

ECHO 転送開始
arduino-cli upload -m p_%arduino_n% -p %arduino_com%
ECHO 転送終了

pause

さらに上記のようなバッチファイルを作ってみました。プロジェクトフォルダの中にbuild.batなどの名前で入れておき、実行することでArduino開発環境が入っていない環境でもarduino-cli.exeをダウンロードしてビルド環境が構築可能です。

途中でボードの選択とシリアルポートの設定をして、ビルドオプションなどに反映させています。

たとえば、上記のようなサンドボックス環境でもビルドができることを確認しました。ただサンドボックスだとシリアルポートが使えないので転送は失敗します。

普通のWindows環境の場合には上記のようにビルドが可能です。

最後に転送されます。ただし、ボードによってはUSBシリアルのドライバーなどをWindows Updateからインストールしないと認識しないなどはあると思います。

ボードの設定を変更する

転送速度やCPU速度、エラーレベルなどをこのままだと指定することができません。

C:\Work\arduino\MyFirstSketch>arduino-cli.exe board details -b m5stack:esp32:m5stack_atom
Board name:            M5Atom
FQBN:                  m5stack:esp32:m5stack_atom
Board version:         2.1.2

Package name:          m5stack
Package maintainer:    M5Stack official
Package URL:           https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
Package website:       https://github.com/m5stack
Package online help:   https://forum.m5stack.com/

Platform name:         M5Stack
Platform category:     M5Stack
Platform architecture: esp32
Platform URL:          https://static-cdn.m5stack.com/resource/arduino/m5stack-2.1.2.zip
Platform file name:    esp32-2.1.2.zip
Platform size (bytes): 245721798
Platform checksum:     SHA-256:e56c999148d4ed6761e92d7691442886c1c79669972713a81f6d6074ab2519d9

Required tool: arduino:dfu-util                                 0.11.0-arduino5
Required tool: m5stack:esptool_py                               4.5.1
Required tool: m5stack:mklittlefs                               3.0.0-gnu12-dc7f933
Required tool: m5stack:mkspiffs                                 0.2.3
Required tool: m5stack:openocd-esp32                            v0.12.0-esp32-20230419
Required tool: m5stack:riscv32-esp-elf-gcc                      esp-2021r2-patch5-8.4.0
Required tool: m5stack:riscv32-esp-elf-gdb                      11.2_20220823
Required tool: m5stack:xtensa-esp-elf-gdb                       11.2_20220823
Required tool: m5stack:xtensa-esp32-elf-gcc                     esp-2021r2-patch5-8.4.0
Required tool: m5stack:xtensa-esp32s2-elf-gcc                   esp-2021r2-patch5-8.4.0
Required tool: m5stack:xtensa-esp32s3-elf-gcc                   esp-2021r2-patch5-8.4.0

Option:        Upload Speed                                                             UploadSpeed
               1500000                                          ✔                       UploadSpeed=1500000
               750000                                                                   UploadSpeed=750000
               500000                                                                   UploadSpeed=500000
               250000                                                                   UploadSpeed=250000
               115200                                                                   UploadSpeed=115200
Option:        CPU Frequency                                                            CPUFreq
               240MHz (WiFi/BT)                                 ✔                       CPUFreq=240
               160MHz (WiFi/BT)                                                         CPUFreq=160
               80MHz (WiFi/BT)                                                          CPUFreq=80
               40MHz (40MHz XTAL)                                                       CPUFreq=40
               26MHz (26MHz XTAL)                                                       CPUFreq=26
               20MHz (40MHz XTAL)                                                       CPUFreq=20
               13MHz (26MHz XTAL)                                                       CPUFreq=13
               10MHz (40MHz XTAL)                                                       CPUFreq=10
Option:        Flash Frequency                                                          FlashFreq
               80MHz                                            ✔                       FlashFreq=80
               40MHz                                                                    FlashFreq=40
Option:        Flash Mode                                                               FlashMode
               QIO                                              ✔                       FlashMode=qio
               DIO                                                                      FlashMode=dio
               QOUT                                                                     FlashMode=qout
               DOUT                                                                     FlashMode=dout
Option:        Flash Size                                                               FlashSize
               4MB (32Mb)                                       ✔                       FlashSize=4M
Option:        Partition Scheme                                                         PartitionScheme
               Huge APP (3MB No OTA/1MB SPIFFS)                 ✔                       PartitionScheme=huge_app
               Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)                         PartitionScheme=default
               Default 4MB with ffat (1.2MB APP/1.5MB FATFS)                            PartitionScheme=defaultffat
               8M with spiffs (3MB APP/1.5MB SPIFFS)                                    PartitionScheme=default_8MB
               Minimal (1.3MB APP/700KB SPIFFS)                                         PartitionScheme=minimal
               No OTA (2MB APP/2MB SPIFFS)                                              PartitionScheme=no_ota
               No OTA (1MB APP/3MB SPIFFS)                                              PartitionScheme=noota_3g
               No OTA (2MB APP/2MB FATFS)                                               PartitionScheme=noota_ffat
               No OTA (1MB APP/3MB FATFS)                                               PartitionScheme=noota_3gffat
               Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS)                         PartitionScheme=min_spiffs
               16M Flash (2MB APP/12.5MB FATFS)                                         PartitionScheme=fatflash
               RainMaker                                                                PartitionScheme=rainmaker
               Custom                                                                   PartitionScheme=custom
Option:        Core Debug Level                                                         DebugLevel
               None                                             ✔                       DebugLevel=none
               Error                                                                    DebugLevel=error
               Warn                                                                     DebugLevel=warn
               Info                                                                     DebugLevel=info
               Debug                                                                    DebugLevel=debug
               Verbose                                                                  DebugLevel=verbose
Option:        Arduino Runs On                                                          LoopCore
               Core 1                                           ✔                       LoopCore=1
               Core 0                                                                   LoopCore=0
Option:        Events Run On                                                            EventsCore
               Core 1                                           ✔                       EventsCore=1
               Core 0                                                                   EventsCore=0
Option:        Erase All Flash Before Sketch Upload                                     EraseFlash
               Disabled                                         ✔                       EraseFlash=none
               Enabled                                                                  EraseFlash=all
Programmers:   ID                                               Name
               esptool                                          Esptool

上記のようにboard detailsにbオプションを利用してFQBNを指定することで、選択可能なオプションを確認することができます。

C:\Work\arduino\MyFirstSketch>arduino-cli.exe board details -b m5stack:esp32:m5stack_atom:CPUFreq=80,DebugLevel=verbose

(略)

Option:        CPU Frequency                                                            CPUFreq
               240MHz (WiFi/BT)                                                         CPUFreq=240
               160MHz (WiFi/BT)                                                         CPUFreq=160
               80MHz (WiFi/BT)                                  ✔                       CPUFreq=80
               40MHz (40MHz XTAL)                                                       CPUFreq=40
               26MHz (26MHz XTAL)                                                       CPUFreq=26
               20MHz (40MHz XTAL)                                                       CPUFreq=20
               13MHz (26MHz XTAL)                                                       CPUFreq=13
               10MHz (40MHz XTAL)                                                       CPUFreq=10

上記のように「m5stack:esp32:m5stack_atom:CPUFreq=80,DebugLevel=verbose」とFQBNに:を追加してカンマ区切りでオプションを指定することが可能です。

これはドキュメントをよく見れば書いてあるのですが、なかなかわかりにくい指定方法だと思います。

まとめ

Arduino CLIは思ったより使いやすかったです。とくに開発環境の自動構築ツールとしても優秀でした。プロジェクトファイルが使いこなせればかなり便利なのですが、PlatformIOと比べるとクセが強いので注意が必要です。

コメント