vscode用のArduino CLI拡張機能 その2 追加機能

概要

作成した拡張機能で機能追加をいろいろして、一通りの開発ができそうな状態になったので追加機能の紹介をしたいと思います。

全体機能

ここはプロジェクト全体に関するコマンドです。

コマンドセンター

左メニューの上から紹介していきます。使えるコマンドが増えたので一覧表示する画面になります。通常はメニューなどから実行できるのでこの画面を使う必要はないと思います。

CLIバージョン

初期バージョンはPATHに追加する必要がありましたが、IDEに内蔵しているバージョンがアップされたことがありまして、ありそうなPATHを検索して一番新しい物を使うようにしました。Arduino IDEが入っている環境であればVSCODEに拡張機能を入れるだけで利用できるようになったと思います。

スケッチヘルパー

こちらは大きくは変わっていませんが、Arduino CLIで設定ファイルを手で管理しなければいけない問題をGUIを使って楽をするための画面です。プラットホームやライブラリのバージョンもこの画面で最新かを確認することが可能です。

ローカルポート設定

複数のボードを同時に利用しているとポート番号の変更が面倒になることがあります。その場合にはここの設定で接続先を指定することができます。sketch.yamlでも変更可能なのですが、シリアルポート番号って利用しているPCによって変わるのでプロジェクト内の設定ファイルとして保存できるルートも作成しました。

スケッチインスペクター

プロジェクトの分析ツールです。MAPファイルの確認や定義一覧などが確認できます。日常では利用しませんが、たまに確認できると便利なときがあるはずです。

define一覧はコンパイルオプションを変更して取得していますが、取得が面倒なのでたまに確認したいときには便利です。ただVSCODEの画面上では検索できなかったので、全文コピーして他のエディタとかで検索をしてみてください。

パーティションやESP-IDFのビルドオプションなども確認ができます。

スケッチバージョン

プロジェクト全体のsketch.yamlを検索して、内部のバージョンが最新かを確認してくれます。定期的に更新をしてから、あとで紹介するビルドチェックなどで確認をしてみてください。

エクスポートバイナリ

プロジェクトフォルダ直下にbuildフォルダを作成し、その中にバイナリファイルを取得する機能になります。Arduiono CLIだけの機能だとboot系のファイルが足りないので、独自にあったら便利そうなファイルもコピーしていれています。

{
  "version": 1,
  "generatedAt": "2026-03-21T00:00:00.000Z",
  "fqbn": "esp32:esp32:esp32",
  "tool": "esptool_py",
  "pattern": "\"{path}/{cmd}\" {upload.pattern_args}",
  "flags": {
    "chip": "esp32",
    "port": "{serial.port}",
    "baud": "921600",
    "before": "default-reset",
    "after": "hard-reset",
    "flash-mode": "keep",
    "flash-freq": "keep",
    "flash-size": "keep"
  },
  "shortFlags": [
    {
      "flag": "-z",
      "value": true
    }
  ],
  "commands": [
    "write-flash"
  ],
  "segments": [
    {
      "offset": "0x1000",
      "file": "03_none-print.ino.bootloader.bin"
    },
    {
      "offset": "0x8000",
      "file": "03_none-print.ino.partitions.bin"
    },
    {
      "offset": "0xe000",
      "file": "boot_app0.bin"
    },
    {
      "offset": "0x10000",
      "file": "03_none-print.ino.bin"
    }
  ],
  "compress": true
}

manifest.jsonは拡張機能が出力した転送で必要そうな情報を書いたファイルとなります。とくにボードに転送する場合このファームウエアの場合には4つのファイルを転送する必要があります。パーティションによって転送開始アドレスが変わりますが、この辺のケアをArduiono CLIだとしてくれません。

エクスポートバイナリをしてこのフォルダを読み込ませて、転送に必要な情報を自動作成させるとかが便利だと思います。Web Serialを利用してブラウザからアプリへ転送するのとかで必要そうになり追加した機能になります。

ビルドチェック

プロジェクト無いにある全てのスケッチとプロファイルでビルドを実行します。プラットホームやライブラリのバージョンアップした際などに警告が増えていないかを確認するなどで利用しています。

スケッチ別

スケッチ単位でプロファイル別にコマンドがあります。ここはそのプロファイルに対しての操作となります。私は基本ここのメニューからの実行がメインで利用しています。基本的なビルド系と全体機能にないものを中心に紹介します。

また、右上のところにエディタで該当のスケッチを開くリンクも追加しています。

アセット

バイナリファイルなどをプログラムの中に埋め込むための機能です。assetsフォルダにファイルを入れておくと、コンパイル前にassets_embed.hファイルを自動生成してくれる機能です。複数のファイルも対応していますので画像や音声などを入れて置くとプログラムからの利用が便利な機能です。拡張機能で追加した機能なのですが、ソースコード自体を生成しているので、ファイルを更新しない限りはこのファイルを使ってArduino IDEなどでもビルド可能です。

assets_wwwなど用途別にファイルを作成することが可能です。この場合にはassets_www_embed.hファイルが生成されます。また、アセットフォルダの中に埋め込みオプションの.assetsconfigと除外オプションの.assetsignoreがあります。オプションとしてHtmlなどの改行などを削除するminifyオプションや、Webサーバー向けに圧縮済みの.gzファイルを作成するオプションがあります。

ソースバックアップ

こちらも拡張機能での追加機能です。.sourcebackupconfigファイルがinoと同じ場所にあると、ファイルに応じてビルドで必要そうなファイルをあつめてzipファイルで圧縮したものをソースファイルの中に埋め込みます。

実機はあるけれど、動いているソースファイルがわからない場合に仕込んでおくと便利なオプションとなります。

#include "sourcebackup_embed.h"

constexpr int kBackupTriggerPin = 33; // External trigger input for Source Backup output

void setup()
{
    Serial.begin(115200);
    delay(1000);

    pinMode(kBackupTriggerPin, INPUT_PULLUP);
    delay(10);
    if (digitalRead(kBackupTriggerPin) == LOW)
    {
        sourcebackup::writeArchiveBase64WithInfoTo(Serial);
    }
    else
    {
        Serial.printf("Source Backup skipped. Hold GPIO%d LOW during boot to print.\n", kBackupTriggerPin);
        sourcebackup::printRestoreUrl(Serial);
        Serial.println();
    }
}

void loop()
{
}

たとえば上記のように起動時に特定のGPIOの状態を確認をしてsourcebackup::writeArchiveBase64WithInfoTo(Serial)でzipファイルのBASE64をシリアルに出力したりできます。この他にSerialなどで特定のコマンドを送信したときに出力など、プログラムによってトリガーは作り込むことが可能です。

上記のArduoino IDE用にソースコードを埋め込む仕組みを参考にして作成させていただきました。

Source Backup ZIP Extractor

画面上に表示されたBASE64を上記のサイトからzipに戻すことが可能です。

Source Backup Restore:
https://tanakamasayuki.github.io/arduino-cli-helper/sourcebackup.html

-----BEGIN SOURCEBACKUP ZIP BASE64-----
UEsDBBQAAAAIAERreVyrUXj/swEAAMEDAAAhAAAAMDFfYm9vdC1wcmludC8uc291cmNlYmFja3VwY29uZmlnfVNNj9sgEL3zKzhbLpGq7d5y6z9Ib5FlDTA2NHyVwbvZ/voKSJo0WfUyH++NYeYN1jbzPRc7ZhA05jmAR77nFLesUII6bWlGL1ELwzr4nxKVEksZF3t+4Bk72qDcpnFiCUrBHIjv+SBsiCMfRNJYnWqm25SaO5+rM8102wnTCduz0t2hGiA/cjphUUZ8gHcjh6w3G+IX5ewFEffNqRgWu45cvJGKGnd4LhjIxkDiJ8VwIwhLsWG9whoK7IZh5ECEhe7CedgNA2NHPD/PLFZbWmkNzCZ7fLnBwRaUebi2AJ2ud8rNOt0/uYXa0uXI+7Ea8tkeP0W73reSQUgbmtDYhEa3VOehCd2WBtVQC3Vbgm+ci1XL74f5UGLGkf8wm5cktGTsCFkZ+4YTW2L2UPie/7aJqehTRqqS8z3XuDgoWOWrzUwsYwFbmZI3ZCnH1aO/puDsWrkXRqhKP0HkWHcjHl6gh2AXpDIxDCAdXo+4vMw55bjYZ3j5JcNTaczlEZOw6UdsxYAZCuq5DbuAI2QGyNT/w8DXb6+MHQ26hJkmht6WOUGmvz00RALh68s/UIb3a/4HUEsDBBQAAAAIABZzeVw56VAphAAAAKYAAAAfAAAAMDFfYm9vdC1wcmludC8wMV9ib290LXByaW50Lmlub02NuwrCMBRA93xFqEuylETUoZ10c1ZwlDyu5mJMSh4Vkf67YEVcz4FzFhiMrxZok2NNBrQytzqc4a7Btq4hZIxoaYZSB8bJi1BK6QESKt9quGJgUq6XQvD+Yyx49WRS/MB/tOseCQtsk3E4wk5l2KxOWNw+XOIxsrnKezJ9pz7G+TmRN1BLAwQUAAAACACaaHlc/JwkvowAAADjAAAAGQAAADAxX2Jvb3QtcHJpbnQvc2tldGNoLnlhbWxVT0EOwiAQvPOKPeqhkNiDCZ8hVJYWRVhZaHy+sRirl0lmdmayQyX7EJG1AECm8WQcrm8C4B9T0l3UP7jdKNrqc7lztwIMX+kvAodRjvJ8/Lj2oAnJ4dO0EjUstRJrpZCpIHPwcg51aZMMWdniWkh52NoU2cvNzmj6p1uFvHJOQjj0tsVqqO/R+xjxAlBLAQIUABQAAAAIAERreVyrUXj/swEAAMEDAAAhAAAAAAAAAAAAAAAAAAAAAAAwMV9ib290LXByaW50Ly5zb3VyY2ViYWNrdXBjb25maWdQSwECFAAUAAAACAAWc3lcOelQKYQAAACmAAAAHwAAAAAAAAAAAAAAAADyAQAAMDFfYm9vdC1wcmludC8wMV9ib290LXByaW50Lmlub1BLAQIUABQAAAAIAJpoeVz8nCS+jAAAAOMAAAAZAAAAAAAAAAAAAAAAALMCAAAwMV9ib290LXByaW50L3NrZXRjaC55YW1sUEsFBgAAAAADAAMA4wAAAHYDAAAAAA==        
-----END SOURCEBACKUP ZIP BASE64-----

上記のような出力があります。誰でもソースコードが見えてもいい場合には埋め込んでおくのもいいのかなと思います。画像などがなければ容量もそれほど増えないと思います。

esptool.py -p /dev/ttyUSB0 read-flash 0x00000 0x400000 flash.bin

シリアル出力機能が無い場合でも上記のようにバイナリファイルを抜き出して、先程の画面にアップロードすることでzipをダウンロード可能です。

アップロード

dataフォルダを作成しておくことで、SPIFFSかLittleFSパーティションにデータ転送が可能です。ただ現在ESP32にしか対応していません。転送種別はinoファイルを見て、どっちのヘッダーファイルを読み込んでいるかで判定をしています。

スケッチ例

スケッチ例もArduino CLIだと弱いので、拡張機能側で対応しています。ファイル名での絞り込みの他に、ソースコードのプレビューとgrepでの絞り込みに対応しています。特定の関数の使い方などを調べたい場合にも便利です。

まとめ

いろいろな機能を追加して、一通り実用で使えるレベルになったと思います。今回は紹介していませんが、WSL環境向けの機能も追加してありますが、次回に紹介したいと思います。

コメント