【2021年12月版】Arduino CLIを使ったM5Stack系デバイスへのスケッチアップロード方法【シリアルモニタもあるよ！】

# はじめに

こんにちは。田中みそと申します。
私は[opniz](https://github.com/miso-develop/opniz)というM5Stack系デバイスをobnizっぽくJavaScript/TypeScriptで制御できるオープンソースIoTフレームワークを作っているのですが、リリース時にArduinoライブラリ検証のため毎回Arduino IDEをまっさらにしてインストールから検証するということを繰り返しています。

この苦行をなんとかしたく思いついたのが[Arduino CLI](https://arduino.github.io/arduino-cli/0.20/)を使っての自動化でした。

https://arduino.github.io/arduino-cli/0.20/

https://github.com/arduino/arduino-cli



# [Arduino CLI](https://arduino.github.io/arduino-cli/0.20/)

リリースはもう3年ほど前となり現在の最新バージョンは[v0.20.2](https://github.com/arduino/arduino-cli/releases)です。
リリース当時から比べるとそこそこアップデートもあり、特にリリース当時は実装もなくIssueでも[実装しないよ！](https://github.com/arduino/arduino-cli/issues/876)と言われていたシリアルモニタも、2021/11/23にリリースされたv0.20.0にて実装されました。

本記事では2021年12月現在のM5Stackデバイスへのスケッチアップロード方法を説明しようと思います。



## インストール

```sh:macOS&nbsp;/&nbsp;Linux
$ brew update
$ brew install arduino-cli
```

shスクリプトからのインストールであればWindows環境でもGit Bash等のCLIから実行できます。

```sh:shスクリプトからインストール
curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh
```

私はWindows環境ですが[Scoop](https://scoop.sh/)からインストールしました。

```sh:Scoop（Windows）
$ scoop update
$ scoop search arduino-cli
$ scoop install arduino-cli
```

https://scoop.sh/

もちろん各OS向けの実行ファイルも直接ダウンロードできます。

https://arduino.github.io/arduino-cli/0.20/installation/#download



## 設定ファイル初期化

以下のコマンドで`arduino-cli.yaml`という設定ファイルが生成されます。

生成パスはデフォルトではmacOS / Linuxだと`~/.arduino15/arduino-cli.yaml`、
Windowsだと`%USERPROFILE%\AppData\Local\Arduino15\arduino-cli.yaml`です。

```sh
arduino-cli config init
```



## ESP32用ボードマネージャ追加

Arduino IDEだと設定画面から行うESP32用ボードマネージャの追加です。
以下のコマンドで先ほど生成した設定ファイルに追加します。

```sh
arduino-cli config add board_manager.additional_urls https://dl.espressif.com/dl/package_esp32_index.json
```



## ESP32ボードパッケージのインストール

続いてESP32ボードパッケージをインストールします。
まずは以下のコマンドでESP32ボードパッケージが見つかることを確認します。

```sh
$ arduino-cli core update-index
$ arduino-cli core search esp32

ID          Version Name 
esp32:esp32 1.0.6   esp32
```

以下のコマンドでインストールします。
`install`コマンドの最後のオプションは上記の`search`コマンドで出力された`ID`の値になります。

最後に`list`コマンドを実行して正常にインストールされていることを確認します。

```sh
$ arduino-cli core install esp32:esp32
$ arduino-cli core list

ID          Installed Latest Name 
esp32:esp32 1.0.6     1.0.6  esp32
```



## ライブラリのインストール

続いてライブラリのインストールです。
今回は以降M5ATOMのケースで説明していきます。

まずは以下のコマンドでライブラリが見つかるかチェックしてみます。

```sh
$ arduino-cli lib update-index
$ arduino-cli lib search M5Atom

Updating index: library_index.json.gz downloaded
Updating index: library_index.json.sig downloaded
Name: "M5Atom"
  Author: M5Stack
  Maintainer: M5Stack
  Sentence: Library for M5Atom Core development kit
  Paragraph: See more on http://M5Stack.com
  Website: https://github.com/m5stack/M5Atom
  Category: Device Control
  Architecture: esp32
  Types: Contributed
  Versions: [0.0.1, 0.0.2, 0.0.3, 0.0.5, 0.0.7]
  Provides includes: M5Atom.h
  Dependencies: FastLED, UNIT_ENV, Adafruit MCP4725, Adafruit TCS34725, Adafruit NeoPixel, MAX30100lib, MFRC522_I2C, M5GFX, M5_BM8563, M5_ADS1100, M5_ADS1115, M5_FPC1020A, HX711 Arduino Library, PCA9554, TinyGPSPlus, Adafruit SGP30 Sensor, FFT, TFTTerminal, ClosedCube TCA9548A, Ethernet2, ESP8266Audio, M5_EzData, ArduinoJson, PubSubClient
Name: "M5Unified"
  Author: M5Stack
  Maintainer: M5Stack
  Sentence: Library for M5Stack/Core2/Tough, M5StickC/C-Plus, M5CoreInk, M5Paper, M5ATOM
  Paragraph: M5Stack, M5Stack Core2, M5Stack CoreInk, M5StickC, M5StickC-Plus, M5Paper, M5Tough, M5ATOM, M5Station, See more on http://M5Stack.com
  Website: https://github.com/m5stack/M5Unified.git
  Category: Display
  Architecture: esp32
  Types: Contributed
  Versions: [0.0.1, 0.0.3]
  Provides includes: M5Unified.h
  Dependencies: M5GFX
```

続いてライブラリをインストールします。
ボードパッケージのインストールと同様に`install`コマンド→`list`コマンドでインストール確認します。

```sh
$ arduino-cli lib install M5Atom@0.0.3 FastLED
$ arduino-cli lib list

Name                    Installed Available Location              Description
FastLED                 3.4.0     -         LIBRARY_LOCATION_USER -
M5Atom                  0.0.3     0.0.7     LIBRARY_LOCATION_USER Library for M5Atom Core development kit
```

> M5Atomライブラリを`M5Atom@0.0.3`とバージョン指定してインストールしています。
> このバージョン以上だと依存ライブラリの`TinyGPSPlus`でnot availableとなり、個別に`TinyGPSPlus`をインストールしても解消されないためv0.0.3で固定しました。
> たしかArduino IDEでも同じ感じだったような…



## スケッチファイルの生成

空の`setup`と`loop`だけの.inoファイルが生成されます。

```sh
$ arduino-cli sketch new M5AtomExample
Sketch created in: M5AtomExample
```

このあとのコンパイル/アップロードのためにM5ATOMの[Lチカサンプル](https://github.com/m5stack/M5Atom/blob/master/examples/Basics/LEDSet/LEDSet.ino)で上書きましょう。
curlコマンドでGitHubにあるサンプルソースを取得し、上記のコマンドで生成した.inoファイルを上書きます。

```sh
curl -fsSLk https://raw.githubusercontent.com/m5stack/M5Atom/master/examples/Basics/LEDSet/LEDSet.ino > M5AtomExample/M5AtomExample.ino
```

https://github.com/m5stack/M5Atom/blob/master/examples/Basics/LEDSet/LEDSet.ino



## コンパイル

以下のコマンドでコンパイルします。
`--fqbn esp32:esp32:m5stack-atom`というオプションがボードの指定となります。
前半部の`esp32:esp32`が先ほどボードインストールした際のIDとなり、最後の`m5stack-atom`が具体的なボード名となります。
このボード名はArduino IDEで「ツール」→「ボード」と選択するときに表示されるボード名と同じ文字列です。

![image](https://user-images.githubusercontent.com/22117028/146118637-9e971222-857c-4eaf-98f0-a6f0ddb4b7e5.png)

そして最後のオプションにコンパイルしたい.inoファイルが格納されるディレクトリを指定します。

```sh
arduino-cli compile --fqbn esp32:esp32:m5stack-atom M5AtomExample
```



## アップロード

アップロード時にはポート情報が必要となるので、まずは`board list`コマンドにてポート情報を確認します。

ただM5ATOMだと`Board Name`が`Unknown`となってしまうのでPCへのデバイス接続前後で`board list`コマンドを実行し、差分となるポートを確認するとよいと思います。

```sh
$ arduino-cli board list

Port Protocol Type    Board Name FQBN Core
COM1 serial   Unknown
COM6 serial   Unknown
```

そして以下のコマンドのようにコンパイルと同様のオプションに加え、`--port`オプションにてポートを指定しアップロードします。

```sh
arduino-cli upload --port COM6 --fqbn esp32:esp32:m5stack-atom M5AtomExample
```



## コンパイルとアップロードを同時に実行

コンパイルとアップロードを同時実行するには`compile`コマンドをベースに`--upload`オプション、`--port`オプションを追加します。

```sh
arduino-cli compile --fqbn esp32:esp32:m5stack-atom --upload --port COM6 M5AtomExample
```



## シリアルモニタ

2021/11/23にリリースされたv0.20.0にて実装されました。
`--port`オプションで対象のポートを指定し実行します。

```sh
arduino-cli monitor --port COM6
```

`--describe`オプションをつけるとポート設定が表示されます。

```sh
$ arduino-cli monitor --port COM6 --describe

ID        Setting   Default Values
baudrate  Baudrate  9600    300, 600, 750, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000, 921600, 1000000, 2000000
bits      Data bits 8       5, 6, 7, 8, 9
parity    Parity    None    None, Even, Odd, Mark, Space
stop_bits Stop bits 1       1, 1.5, 2
```

`baudrate`がデフォルトだと`9600`となり変更したい場合は`--config`オプションでいけるはずのようですが、[現在バグっててききません…😢](https://github.com/arduino/arduino-cli/issues/1562)

```sh:--configオプションは現時点ではバグっててきかない…😢
arduino-cli monitor --port COM6 --config baudrate=115200
```
https://github.com/arduino/arduino-cli/issues/1562



## Arduinoライブラリに未登録の野良ライブラリをインストール

Arduino IDEの場合、Arduinoライブラリに未登録の野良ライブラリだとGitHub等からZIPをダウンロードして手動でインポートする感じでした。
Arduino CLIなら設定ファイルを一部変更することで`lib install`コマンドから直接GitHubのURLを指定してインストールできます。（超便利！😊）

まずは以下のコマンドで設定ファイルにある`library.enable_unsafe_install`の値を`true`に変更します。

```sh
arduino-cli config set library.enable_unsafe_install true
```

そして`lib install`コマンドの`--git-url`オプションにてGitHubのURLを指定します。

```sh
arduino-cli lib install --git-url https://github.com/miso-develop/opniz-arduino-m5atom
```



## （おまけ）M5ATOMの環境構築を一括実行

M5ATOM以外のM5Stackデバイスは最後の`lib install`を対応するライブラリに変更すればおっけーです。

```sh
curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh # Arduino CLIインストール
arduino-cli config init # 設定初期化
arduino-cli config add board_manager.additional_urls https://dl.espressif.com/dl/package_esp32_index.json # ESP32用ボードマネージャ追加
arduino-cli core update-index # ボードパッケージのローカルキャッシュ更新
arduino-cli core install esp32:esp32 # ESP32ボードパッケージインストール
arduino-cli lib update-index # ライブラリのローカルキャッシュ更新
arduino-cli lib install M5Atom@0.0.3 FastLED # ライブラリインストール
```