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

概略

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

事前準備

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

VSCodeの設定

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

最新は、Version 0.3.5となりました。画面キャプチャは、0.2.27のものです。

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

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

    spawn()内で、chcpを呼び出している、215~225行目をコメントアウトします。これにより、コードページをデフォルトの65001(UTF-8)から変更しないようにします。
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
function spawn(command, outputChannel, args = [], options = {}) {
    return new Promise((resolve, reject) => {
        const stdout = "";
        const stderr = "";
        options.cwd = options.cwd || path.resolve(path.join(__dirname, ".."));
        const child = childProcess.spawn(command, args, options);
        let codepage = "65001";
        /* if (os.platform() === "win32") {
            try {
                const chcp = childProcess.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 (outputChannel) {
            child.stdout.on("data", (data) => {
                outputChannel.append(decodeData(data, codepage));
            });
            child.stderr.on("data", (data) => {
                outputChannel.append(decodeData(data, codepage));
            });
        }
        child.on("error", (error) => reject({ error, stderr, stdout }));
        child.on("exit", (code) => {
            if (code === 0) {
                resolve({ code, stdout, stderr });
            }
            else {
                reject({ code, stdout, stderr });
            }
        });
    });
}
  • .vscode/c_cpp_properties.json の設定(Arduino UNOの場合)

以下に、c_cpp_properties.json の例を記載します。USERNAMEは適宜変更してください。なぜこういう設定をしたのかは、後半に記載しています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
    "configurations": [
        {
            "name": "Win32",
            "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\\**"
            ],
            "forcedInclude": [
                "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino\\Arduino.h"
            ],
            "defines": [
                "__AVR_ATmega328P__",
                "F_CPU=16000000L",
                "ARDUINO=10812",
                "ARDUINO_AVR_UNO",
                "ARDUNO_ARCH_AVR"
            ],
            "intelliSenseMode": "clang-x64",
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}

VSCodeを使う

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

VSCodeでディレクトリを開く

スケッチファイルではなく、スケッチファイルが存在するディレクトリを開きます。単にファイルを開いただけでは、編集はできますが、ファイルをコンパイルしようとしたとき、「Cannot find the sketch file.」と出てきて、うまくArduinoと連携できませんでした。なお、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ボードの種類を選択します。ウインドウの下部にある、<Select Board Type>をクリックします。

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

すると、画面に以下のような変化が現れます。

  • 開いているディレクトリ配下に、「.vscode」ディレクトリが作成されます。以下の2つのファイルが作成されます。
    • arduino.json: Arduino関係の設定
    • c_cpp_properties.json: C/C++言語関係の設定
  • エラーの内容が変わる。

これは、Arduinoボードの種類を選ぶことで、Arduino用の設定が読み込まれたためです。ただ、設定が完璧ではないようで、設定を追加する必要があります。とりあえず、Serialとdelay()を解決してみます。

新しくできた、.vscode の下の、c_cpp_properties.json を開き、以下の設定を変更/追加しました。

includePath に、“C:\\Program Files (x86)\\Arduino\\hardware\\tools\\**” を追加。

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

利用するライブラリによっては、includePathをさらに追加/変更する必要があると思います。

defines を追加。Arduino Unoなので、「__AVR_ATmega328P__」を追加しました。これで、Serialが正しく理解されるようになります。正しいJSON定義にするために、definesの前行に、「,」が必要なので注意してください。vscode自身が注意してくれますが。

16
17
18
            "defines": [
                "__AVR_ATmega328P__"
            ]

これ以外に、platform.txt に定義されている、コンパイラに渡す定義を渡すのが正しいのではないかと思います。

Arduino Unoの場合は、おそらく、以下の定義を入れておけば、かなり正確になるのではないかと思います。また、intelliSenseModeは、Windows環境でのデフォルトは、「msvc-x64」でしたが、「clang-x64」に変更しています。msvc-x64では、size_tを解決できませんでした。

名称 説明
__AVR_ATmega328P__ MCU
F_CPU 16000000L クロック周波数
ARDUINO 10810 IDEバージョン(この例は 1.8.10)
ARDUINO_AVR_UNO ボード
ARDUINO_ARCH_AVR アーキテクチャ

以下に、c_cpp_properties.jsonの例を示します(再掲です)。パスは、適宜変更してください(特にライブラリのパスはユーザ名の変更が必要です)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
    "configurations": [
        {
            "name": "Win32",
            "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\\**"
            ],
            "forcedInclude": [
                "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino\\Arduino.h"
            ],
            "defines": [
                "__AVR_ATmega328P__",
                "F_CPU=16000000L",
                "ARDUINO=10812",
                "ARDUINO_AVR_UNO",
                "ARDUNO_ARCH_AVR"
            ],
            "intelliSenseMode": "clang-x64",
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}

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。

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

各ディレクトリ内の、.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と同様のエラーが出ていました。c_cpp_properties.json を見てみると、“forcedInclude” が空だったので、Arduino.h をフルパスで設定すると、問題なく動作しました。IncludePathは、とりあえず修正不要でした。

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

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

参考リンク

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

最終更新日

February 23, 2021

inserted by FC2 system