にわかプラス

にわかが玄人になることを夢見るサイトです。社会や国際のトレンド、プログラミングや電子工作のことについて勉強していきたいです。

ArduinoIDEをVS Codeにしたらコード補完や書き込みが楽で最高になった

sponsor

はじめに

Arduinoの標準IDEはよくできているが、コード補完が効かなかったり、参照ライブラリ元へ飛べなかったりと少し残念である。 そこで、エディタをVS Codeに切り替えることで、コード補完、参照ライブラリへのジャンプ、その他VS Code拡張の恩恵を預かれるようにする。

f:id:hiddenvally333:20210404225359p:plain

準備

以下をインストールする

Visual Studio Code Extension for Arduinoのインストールと設定

VS Codeの拡張機能Visual Studio Code Extension for Arduinoをインストール。 マイクロソフトご謹製の拡張。とてもできが良い。

Arduinoのパスを設定

File → 基本設定 → 設定で”Arduino”と検索。

以下を設定

  • Arduino Command Path
    • arduino_debug.exe
  • Arduino Path
    • C:/Program Files (x86)/Arduino(各自の環境に合わせる)

ここまでできたらVS Codeを再起動する。

拡張の使い方

Ctrl + Shift + pでコマンドパレットを開き、”Arduino”と入力するとすべてのコマンド一覧が表示される。

コード補完の有効化

さきほどパスを設定したときと同様に設定を開き、”C_Cpp.intelliSenseEngine”を検索。

C_Cpp:intelli Sense Engineの設定を”Tag Parser”に変更する。

デフォルトだと厳密に#includeしたものしかコード補完の対象にならない。 Tag Parserにすると(.inoに明記していなくても使えている)Arduino.hなども補完の対象になるようだ。

setting.jsonにインクルードパスを記載

c_cpp_properties.jsonにインクルード情報が記載されているが、これを編集するのは間違い! スケッチのコンパイルごとにc_cpp_properties.jsonは自動生成されて変更したことが初期化されてしまう。

そこでインクルードパスはsetting.jsonに記載する。 VS CodeはC_Cpp.default.browse.pathというキーでインクルードパスを拾ってくるようなので、以下のように記載。
setting.jsonはプロジェクトを開いたフォルダ内の.vscodeフォルダに作成されている。

    "C_Cpp.default.browse.path": [ //インクルードライブラリのパス設定
        "C:\\Users\\username\\Documents\\Arduino\\libraries",  //usernameは適宜変更すること
        "C:\\Program Files (x86)\\Arduino\\tools",
        "C:\\Program Files (x86)\\Arduino\\libraries",
        "C:\\Program Files (x86)\\Arduino\\hardware",
        "C:\\Users\\username\\OneDrive\\Documents\\Arduino\\libraries"//自分の環境はOeDrive配下なので、適宜変更すること
    ],

これでコード補完が効くようになった!

文字化け対策

Windows環境だと、Arduino IDEの出力する日本語が文字化けするので対策を行う。

以下ファイルを修正する。

C:/Users/USERNAME/.vscode/extensions/vsciot-vscode.vscode-arduino-0.4.0/out/src/ommon/util.js

コードページをデフォルトの65001(UTF-8)から変更しないように、chcpを呼び出している、205~215行目をコメントアウト

function spawn(command, args = [], options = {}, output) {
    return new Promise((resolve, reject) => {
        options.cwd = options.cwd || path.resolve(path.join(__dirname, ".."));
        const child = child_process.spawn(command, args, options);
        let codepage = "65001";
        /* if (os.platform() === "win32") {
            try {
                const chcp = child_process.execSync("chcp.com");
                codepage = chcp.toString().split(":").pop().trim();
            }
            catch (error) {
                outputChannel_1.arduinoChannel.warning(`Defaulting to code page 850 because chcp.com failed.\
                \rEnsure your path includes %SystemRoot%\\system32\r${error.message}`);
                codepage = "850";
            }
        } */
        if (output) {
            if (output.channel || output.stdout) {
                child.stdout.on("data", (data) => {
                    const decoded = decodeData(data, codepage);
                    if (output.stdout) {
                        output.stdout(decoded);
                    }
                    if (output.channel) {
                        output.channel.append(decoded);
                    }
                });
            }
            if (output.channel || output.stderr) {
                child.stderr.on("data", (data) => {
                    const decoded = decodeData(data, codepage);
                    if (output.stderr) {
                        output.stderr(decoded);
                    }
                    if (output.channel) {
                        output.channel.append(decoded);
                    }
                });
            }
        }
        child.on("error", (error) => reject({ error }));
        child.on("exit", (code) => {
            if (code === 0) {
                resolve({ code });
            }
            else {
                reject({ code });
            }
        });
    });
}

Arduinoへの書込み設定

ウインドウ下部のバーから簡単に設定できる。

  • スケッチ
  • ボード
  • シリアルウインドウを開く/閉じる
  • COMポート選択

f:id:hiddenvally333:20210404225918p:plain

種類の違う複数のボードに書込みたいときには、標準のIDEよりかんたんに設定できる!

おわりに

VS CodeでArduinoは想像以上に快適だった。とくに複数のArduinoに書き込むときに、ポートやボードの選択がとても簡単でとてもいい。