Arduinoで遊ぶページ
Arduinoで遊んだ結果を残すページです
Visual Studio Code

概略

Windows10上の、Visual Studio Code(VSCode)から、Arduinoを利用できるように設定します。関数名の補完などができるようになり、便利です。

VSCode extensionの、(おそらく)Arduino 0.4.0から、IntelliSense周りの動作が少し変更されたようです。

ここでは、Visual Studio Code extension for Arduino 0.4.2のときの設定などを記載します。ただし、画面キャプチャは、0.4.0のときのものです。

事前準備

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

  • 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.0\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 0.4.0では、c_cpp_properties.jsonの設定がかなり改善されました。とはいえ、まだ少し修正が必要なようです。

VSCodeを使う

Arduino Unoを利用した例です。VSCodeの機能を便利に利用するためには、いくつかの設定が必要でした。

Arduino IDEで追加インストールした、Arduino core for the ESP32 についても、特に問題なく動作しました。最後に少し記載しています。

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/Genuino Uno」を選択しました。

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

IntelliSenseの設定を行う。

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

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

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

すると、IntelliSenseが動作して、IntelliSense用の設定ファイル(c_cpp_properties.json)が作成されました。

しかし、まだ、エラーは残っています。調べてみたたところ、(Arduino UNOの場合)c_cpp_properties.jsonでの、「defines」に、「_AVR_ATmega328P_」という定義を追加すれば、解決することがわかりました。行番号は、私の環境での話なので、他の環境では異なるかもしれません。

31
32
33
34
35
36
            "defines": [
                "__AVR_ATmega328P__",
                "F_CPU=16000000L",
                "ARDUINO=10813",
                "ARDUINO_AVR_UNO",
                "ARDUINO_ARCH_AVR",

この結果、現状では全ての、問題は解決されました。ただし、c_cpp_properties.jsonを見たところ、ライブラリパスが含まれていないようなので、ライブラリを利用するときは、「includePath」に、パスを追加する必要があると思います。

追加するライブラリパスの例を以下に示します。JSONなので、前後の関係で、「,」を正しく記載する必要があることに注意してください。USERNAMEは適宜変更してください

1
2
3
4
5
6
            "includePath": [
                "C:\\Program Files (x86)\\Arduino\\tools\\**",
                "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\**",
                "C:\\Program Files (x86)\\Arduino\\hardware\\tools\\**",
                "C:\\Users\\USERNAME\\Documents\\arduino\\libraries\\**"
            ],

なお、disableIntelliSenseAutoGenがfalseの場合(デフォルトではこのようです)、スケッチをコンパイルするたびに、IntelliSense用の設定が上書きされてしまうようなので、一度自動生成した後は、trueの設定しておいた方がよさそうです。

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

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

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

その後、ウインドウ右下の、プラグマーク(私の場合COM3の左側。下の画像では「×」に変わっています)をクリックし、シリアルモニタに切り替えると、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 スケッチファイルをビルドする前に実行する外部コマンド。一つだけ設定できる。

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

ESP-WROOM-32 の場合

ESP-WROOM-32でも試してみました。

何も接続しない状態で、ボードを"ESP32 Dev Module(esp32)“を選択してみました。Arduino Unoと同様のエラーが出ていました。一度コンパイルさせてみると、問題なく動作しました。

その後、ESP-WROOM-32を接続してみると、“Adafruit HUZZAH ESP8266"と認識されてしまい、ボードパッケージをインストールするか、尋ねられました。

あとは、スケッチのアップロードも、シリアルモニタも、問題なく動作しました。

参考リンク

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

最終更新日

May 9, 2021

inserted by FC2 system