Visual Studio Code

概要

Windows10上の、Visual Studio Code(VSCode)から、Arduinoを利用できるように設定します。関数名の補完などができるようになり、便利です。Arduino開発チームが開発しているArduino Tools extension for VS Codeではないので注意してください。

ここでは、Visual Studio Code extension for Arduino 0.4.7のときの設定などを記載します。以前はIntellisenseを動かすためにいろいろ必要でしたが、最近のバージョンではとりあえず動作させるためには、追加の設定を行う必要がなくなっています。

!
AVRコアの中身を詳しく見ていこうとしたら、"__AVR_ATmega328P__"が定義されていないことに気づきました。コンパイラに渡す際の、"-mmcu"オプションの設定が正しく反映されていないようです。
i
VSCode/Visual Studio Code extension for Arduinoとも、結構な頻度でバージョンアップされるので、あくまで、特定のバージョンでの動作であることに注意してください。

また、バージョンアップによりデグレードが発生することもよくあるようです。問題が起こった場合は、古いバージョンに戻すと問題が解決する場合もあります。

対応状況

私の環境で、Visual Studio Code extension for Arduinoのアップロード/シリアル通信/IntelliSenseの各機能が動作するかを、いくつか試してみました。あくまで、私の環境での特定のバージョンでの状況です。VSCodeは、バージョンによる違いが結構あるようなので、注意してください。

Visual Studio Code extension for Arduinoと、Arduino IDEのバージョンは以下の通りです。

  • Visual Studio Code extension for Arduino: 0.4.7
  • Arduino IDE: 1.8.16

以下の表のソフトウェアバージョンは、Arduino IDEのボードマネージャで表示される各ボード用のソフトウェアバージョンです。

ボード/ソフトウェアバージョン アップロード シリアル通信 IntelliSense
Uno/1.8.3
Due/1.6.12
ESP32 Dev Module/2.0.1 -
Spresense/2.3.0

ESP32のv2.0.1では、IntelliSenseが動作しませんでした。ネットを調べたところ、Parse failed when cmdline too long #1275が該当するようで、vsciot-vscode.vscode-arduino-0.4.7/out/src/arduino/arduino.js に、Split by lines when parsing stdout of build #1276のパッチをあてると、正しく動作しました。そのうち改善されるのではと思います。

事前準備

以下の事前準備を行います。

  • Arduino IDEをインストールします。
  • VSCodeをインストールします。
  • C/C++ for Visual Studio Codeをインストールします。
    C/C++ for Visual Studio Codeは、インストールしなくても、以下の、Arduino for Visual Studio Codeのインストール時に、同時にインストールするか、尋ねられると思います。

なお、Arduino IDEではなく、Arduino CLIを利用することも可能なようです。ここでは、Arduino IDEを利用しています。

VSCodeの設定

VSCodeを利用するために、以下の設定を行います。

Visual Studio Code extension for Arduino のインストール

Extensions(拡張機能)からArduinoを検索し、「Visual Studio Code extension for Arduino」をインストールします。.inoファイルを読み込ませると、自動で推奨されるかもしれません。

文字化けの防止

Windowsでは、デフォルトのままでは、Arduino IDEが出力する日本語が文字化けするので、以下のファイルを手動で修正します。

C:\Users\USERNAME\.vscode\extensions\vsciot-vscode.vscode-arduino-0.4.7\out\src\common\util.js

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

200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
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 });
            }
        });
    });
}

Code Page Identifiersによれば、文字コードは以下の通りです。

コード 説明 備考
850 OEM Multilingual Latin 1; Western European (DOS) Windows上で、chcpコマンドに失敗したときのデフォルト設定
932 ANSI/OEM Japanese; Japanese (Shift-JIS) 私のWindows10上でchcpコマンドを実行したときの値
65001 Unicode (UTF-8) デフォルトの設定

.vscode/c_cpp_properties.json の設定(Arduino UNOの場合)

最近のVScode extensionのArduinoでは、c_cpp_properties.jsonの設定がかなり改善されました。ほぼ修正なしで利用できると思います。

Arduino Unoを利用した例です。

VSCodeでディレクトリを開く

スケッチファイルではなく、スケッチファイルが存在するディレクトリを開きます。単にファイルを開いただけでは、編集はできますが、ファイルをコンパイルしようとしたとき、うまく動作しませんでした。なお、Arduino IDEとは異なり、ディレクトリ名とスケッチ名を異なるものにしてもうまく動作するようです。とはいえ、Arduino IDEで開いたときはエラーになると思うので、わざわざそういうことをする必要はないと思います。

何も設定しない状態で、簡単なプログラムを書いてみました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
void setup() {
    Serial.begin(115200);
}

void loop() {
    static unsigned long counter = 0;

    Serial.print("Hello World: ");
    Serial.println(counter++);
    delay(1000);
}

このときは、VSCodeがArduinoのスケッチの情報を何も持っていないため、Serialやdelay()が未定義と報告されています。

Arduinoボードを選択する

まず、Arduinoの機能をArduinoボードの種類を選択します。ウインドウの下部にある、<Select Board Type>をクリックします。

画面にボードの選択肢が現れます。今回は、「Arduino Uno(Arduino AVR Boards)」を選択しました。

すると、開いているディレクトリ配下に、「.vscode」ディレクトリが作成され、その下に arduino.jsonというファイルが作成されます。これは、Arduino関連の設定ファイルです。

IntelliSenseの設定を行う

Alt-Ctrl-I(Arduino: Rebuild IntelliSense Configuration)で、IntelliSense関連の設定ができると思うのですが、今の時点ではコマンドは起動できませんでした。おそらく、arduino.jsonファイルに、スケッチの情報がないからだと思います(あくまで動作からの想像です)。

以下のどちらかを行うと、IntelliSense関連の設定ファイルが作成されました。他にも方法はあるかもしれません。

  • スケッチを一度コンパイルする
  • arduino.jsonに、スケッチの設定を書きこみ、Alt-Ctrl-Iを押す
1
2
3
4
{
    "board": "arduino:avr:uno",
    "sketch": "HelloWorld.ino"
}

スケッチをコンパイルするには、右上のコンパイルアイコンを押します(画像をスクロールする必要があるかもしれません)。IntelliSenseが動作して、IntelliSense用の設定ファイル(c_cpp_properties.json)が作成されました。

この時点で、エラーはすべて解消されていました。

ユーザがインストールしたライブラリを利用したときも、自動で参照関係が解決されていました。

Arduinoにスケッチをアプロードする

スケッチをアップロードするには、シリアルポートを設定した後(ウインドウの右下)、アップロードボタン(ウインドウの右上)を押します。

スケッチの書き込みに成功すると、以下のようになります。

シリアルモニタを開く

ウインドウ右下の、プラグマーク(私の場合COM5の左側。下の画像では「×」に変わっています)をクリックし、シリアルモニタに切り替えると、Arduinoからの出力が確認できます。通信速度を合わせるのを忘れないようにしてください。

なお、Ctrl+Shift+Pで、“Arduino: Send text to Serial Port"を選択すると、VSCodeからArduinoのシリアルポートに文字列を送信することができます。おそらく、デフォルトではキーバインドはないと思います。

オプションを設定する

オプション

File -> Preferences -> Settings(Ctrl + ,)で、設定画面を出した後、Extentions->Arduino configurationを選ぶと出てきます。グローバル設定・ワークスペースごとの設定のどちらも可能です。

一部の設定は、コマンド(F1)からも可能なようです。

オプション 説明
arduino.path Arduinoへのパス。デフォルトは自動検出したArduino。
arduino.commandPath 実行形式の、arduino.pathからの相対パス。デフォルト値は、Windows: arduino_debug.exe, Mac: Contents/MacOS/Arduino, Linux: arduino
arduino.additionalUrls サードパーティパッケージ用のボードマネージャのURL。複数指定するときは、コンマで区切るか、文字列の配列にする。
arduino.logLevel CLI出力のログレベル。info もしくは verbose。デフォルトは info。
arduino.allowPDEFiletype Arduino-1.0.0以前の拡張子である .pde の利用可否。Processingのコードが壊れる(break)ので注意。デフォルトは false。
arduino.enableUSBDetection USBの検出の許可・不許可。デフォルトはtrue。
arduino.disableTestingOpen USBポートのオープン状態を確認するためのテストメッセージを自動送信することの許可・不許可。デフォルトはfalse(テストメッセージを送信する)。
arduino.skipHeaderProvider ヘッダの補完の拡張の提供有無。デフォルトはfalse。
arduino.defaultBaudRate シリアルポートモニタのデフォルトボーレート。デフォルトは115200。
arduino.disableIntelliSenseAutoGen trueの場合、IntelliSenseの設定ファイル(.vscode/c_cpp_properties.json)を自動生成しない。

スケッチごとのオプション

スケッチごとの設定です。各ディレクトリ内の、.vscode/arduino.json ファイルに記述します。

オプション 説明
sketch メインとなるArduinoのスケッチファイル名。
port デバイスに接続しているシリアルポート名。
board 現在選択しているArduinoのボード名。Arduino: Change Board Typeコマンドで設定できる。
output コンパイル時の出力ディレクトリ。未設定の場合は、一時ファイルを毎回作成する。デフォルトは未設定。
debugger デバッガの名称。
prebuild スケッチファイルをビルドする前に実行する外部コマンド。
postbuild スケッチファイルをビルドした後に実行する外部コマンド。
intelliSenseGen IntelliSense用設定の自動生成のグローバル設定を上書きする。以下のオプションが利用可能。
“global”: グローバル設定を利用(デフォルト)
“disable”: 不許可
“enable”: 許可
buildPreferences ビルド時にArduinoに渡すフラグ。

outputを設定すると、オブジェクトファイルを再利用するので、コンパイルが早くなります。

参考リンク

https://github.com/microsoft/vscode-arduino

最終更新日

January 1, 2022

inserted by FC2 system