Arduino-Visual Studio Codeでの開発

Visual Studio CodeでArduinoの開発を行うためPlatformIOを使っていたのだが、マイクロソフト謹製のものがあるということだったので試してみた。

基本的なインストールの手順は、以下のサイトを参考にした。

Visual Studio Code
Visual Studio Codeからの利用方法です。

インストール後、問題点が2つほど出たので、その対応方法をまとめてみた。

ESP32を開発ボードに設定した場合forcedIncludeの設定がされない

参考サイトの最後の方にも記述があったのだが、ESP32関連をボードに設定すると、forcedIncludeが空欄になる。

forcedIncludeの設定は機能拡張ソース、arduino.jsのgetDefaultForcedIncludeFilesで行われている。
実装を見たところ、Arduino.hを探して設定しているのだが、パッケージ/cores/Arduino/Arduino.hを決め打ちで探していたためだった。esp32のパッケージはパッケージ/cores/esp32/Arduino.hの場所にあるため、ファイルが探せず設定が空になった。

以下の様にソースを変更することでESP32を指定してもforcedIncludeの設定がなされるようになった。

getDefaultForcedIncludeFiles() {
    const result = [];
    const boardDescriptor = this._boardManager.currentBoard;
    if (!boardDescriptor) {
        return result;
    }
    const folders = ["arduino", "esp32"];
    folders.forEach((folder) => {
        const arduinoHeadFilePath = path.normalize(path.join(boardDescriptor.platform.rootBoardPath, "cores", folder, "Arduino.h"));
        if (fs.existsSync(arduinoHeadFilePath)) {
            result.push(arduinoHeadFilePath);
        }
    });
    return result;
}

ボード固有のマクロが定義されていない

Arduinoでは、inoファイルがコンパイルされる場合、選択されたボードに合わせたマクロでコンパイラーが起動される。
そのためインテリセンス用に正しいマクロを定義しておかないと、実装時にいらぬエラーやワーニングが表示される可能性が出てくる。

例えば、開発ボードをESP32にした場合のコードの表示が以下の様になった。

ESP32ボードでの開発なので、上側のコードが通常表示されていないといけないのだが、ESP32マクロが定義されていないという認識でインテリセンスが動作し、上側がグレーダウン表示状態になってしまった。

c_cpp_properties.jsonファイルのdefinesに以下の様にESP32を定義することで、この問題は回避できる。

ただできたら、このマクロ定義もボード決定時に自動定義されているとよかったのだが、さすがにそこまではなされていなかったようだ。

今回インストールされた機能拡張では、arduino.jsのgetDefaultDefines関数内でdefinesの定義をしているところまでは分かったのだが、マクロ定義はパッケージがインストールされているフォルダのplatform.txtとboards.txtと、現在選択されているボード名で決定されるようになっており、機能拡張内では、それらファイルの必要とする情報を読み込んでいなかったためと、そこで使用されているクラス類の構造が不明だったので、書き換えることができなかった。

一応、platform.txtとboards.txtを見て、どのようなマクロをdefinesに定義すればいいのか、以下にまとめておく。

基本的な内容

ボードを選択時、ボード名の後ろに「(Arduino AVR Boards)」と出てくるもの。

  • F_CPU=CPU周波数
    boards.txtのbuild.f_cpuの値
    例: 16000000L
  • ARDUINO=IDEのバージョン
    今は10813のようだ
  • ARDUINO_+ボード名
    boards.txtのbuild.boardの値
    最終値の例:ARDUINO_ AVR_UNO
  • ARDUINO_ARCH_+アーキテクチャ名
    boards.txtのbuild.archの値のようだが、boards.txtには入っていなかった
    どこから持ってくるのだろうか
    ちなみに現在の最終値は: ARDUINO_ARCH_AVRとなっていた

Arduino UNOを選択した場合、以下のようなマクロの定義になる。

“F_CPU=16000000L”,
“ARDUINO=10813”,
“ARDUINO_ AVR_UNO”,
“ARDUINO_ARCH_AVR”

ESP32系での追加内容

ボードを選択時、ボード名の後ろに「(esp32)」と出てくるもの。
基本的な内容で定義されたマクロに加え、以下のものが追加で定義されている。

  • ESP32
  • CORE_DEBUG_LEVEL=デバッグレベル
    デバッグレベルは、ボード設定のCore Debug Levelの設定が使われ、None:0、Error:1、Warn:2、Info:3、Debug:4、Verbose:5のそれぞれの整数が割り当てられる
  • ARDUINO_BOARD=ボード名
    boards.txtのbuild.boardの値
  • ARDUINO_VARIANT=バリアント名
    boards.txtのbuild.variantの値

ESP32 Dev Moduleを選択した場合、以下のようなマクロの定義になる。

“F_CPU=240000000L”,
“ARDUINO=10813”,
“ARDUINO_ESP32_DEV”,
“ARDUINO_ARCH_ESP32”,
“ESP32”,
“CORE_DEBUG_LEVEL=0”,
“ARDUINO_BOARD=ESP32_DEV”,
“ARDUINO_VARIANT=esp32”

手っ取り早い求め方

platform.txtとboards.txtとかを見て決めるのは多分面倒なので、以下のような手順で求めるといい。

  1. まずVSCodeの設定で、Arduino:Log Levelをinfoにしておく。
  2. ボードを設定し、ベリファイ(コンパイル)を実行する。
  3. 出力ウィンドウ内をg++で検索する。

    この行にC++のコンパイルオプションの情報が定義されている。
  4. 上の行を一行まるまるコピーし、空のウィンドウにペーストする。
  5. -Dを改行コードに置換する。

    正規表現のチェックを入れておくことが重要。
  6. -Dつまりマクロの定義行が表示されるので、それをdefinesに設定する。

    持っていくのはF_CPU以降の定義のみでいいはず。

当然だがボードを変更する際には、definesをまるっと変更しないといけないので注意が必要。

コメント

タイトルとURLをコピーしました