VS Code で ESP-WROOM-32

# 目標

VSCode を使って ESP32 で LED Blink = Lチカ をします。
なんと、せっかくWi-Fi と BLE が使えるボードなのに全く使用しておりません。

# 前提条件

## ハード

- [ESP32 ESPDuino-32 (ESP-WROOM-32) 技適取得品](https://www.amazon.co.jp/waves-ESP32-ESPDuino-32-ESP-WROOM-32-%E6%8A%80%E9%81%A9%E5%8F%96%E5%BE%97%E5%93%81/dp/B074PNFJGF/ref=pd_sbs_328_1/356-9610273-6100118)
  - **Amazon`s Choice** になってます。お買い得です。
- データ通信用USBケーブル
- CH340 ドライバ
  - PCとの通信にはCH340ドライバのインストールが必要と成る場合が有ります。
  - <http://www.wch.cn/download/CH341SER_ZIP.html>

## ソフト

### OS

Windows10 Homeで行いましたが、以下でも可能なようです。

- [Windows](https://ja.wikipedia.org/wiki/Microsoft_Windows) 7以降（32ビットおよび64ビット）
- [macOS](https://ja.wikipedia.org/wiki/MacOS) 10.10以降
- [Ubuntu](https://ja.wikipedia.org/wiki/Ubuntu) 16.04

#### アプリケーション

入力補完や自動フォーマット機能などが使いたい方は以下構成にしましょう。
何でもいいという方は、Arduino IDE だけでいいと思います。

- [VSCode](https://code.visualstudio.com/)
  - [Visual Studio Code extension for Arduino](https://marketplace.visualstudio.com/items?itemName=vsciot-vscode.vscode-arduino)
    - [Arduino IDE](https://www.arduino.cc/en/main/software#download)
      - <https://github.com/espressif/arduino-esp32>
(OSによってインストール方法が違うので気を付けてください。)

## Windowsの場合の設定

`arduino.json`はスケッチのアップロード設定です。GUIで設定すれば自動生成されます。

```json:.vscode/arduino.json
{
    "board": "esp32:esp32:esp32",
    "configuration": "PSRAM=disabled,PartitionScheme=default,CPUFreq=240,FlashMode=qio,FlashFreq=80,FlashSize=4M,UploadSpeed=115200,DebugLevel=none",
    "port": "*** your board port ***",
    "sketch": "Blink.ino"
}
```

`c_cpp_properties.json`はコンパイラやリンカの設定です。このファイルも自動生成されます。Cコンパイラがインストールされていると自動で認識するようです。その辺りの挙動はわからないので割愛します。`includePath`と`intelliSenseMode`と`browse`は書き換えました。

```json:.vscode/c_cpp_properties.json
{
  "configurations": [
    {
      "name": "Win32",
      "includePath": [
        "C:/Program Files (x86)/Arduino/hardware/arduino/avr/cores/arduino",
        "C:/Program Files (x86)/Arduino/hardware/arduino/avr/variants/standard",
        "C:/Program Files (x86)/Arduino/hardware/tools/avr/avr/include",
        "C:/Program Files (x86)/Arduino/hardware/tools/avr/lib/gcc/avr",
        "${workspaceRoot}",
        "C:/Users/${env:USERNAME}/AppData/Local/Arduino15/packages"
      ],
      "forcedInclude": [],
      "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/cl.exe",
      "cStandard": "c11",
      "cppStandard": "c++17",
      "intelliSenseMode": "msvc-x64",
      "browse": {
        "path": [
          "C:/Program Files (x86)/Arduino/hardware/arduino/avr/cores/arduino",
          "C:/Program Files (x86)/Arduino/hardware/arduino/avr/variants/standard",
          "C:/Program Files (x86)/Arduino/hardware/tools/avr/avr/include",
          "C:/Program Files (x86)/Arduino/hardware/tools/avr/lib/gcc/avr",
          "${workspaceRoot}",
          "C:/Users/${env:USERNAME}/AppData/Local/Arduino15/packages",
          "C:/Users/${env:USERNAME}/Documents/Arduino"
        ],
        "limitSymbolsToIncludedHeaders": false,
        "databaseFilename": ""
      }
    }
  ],
  "version": 4
}
```

Arduino IDE を立ち上げてもできますが、VSCode上からesp32のライブラリをインストールするには`.vscode/settings.json`で下記のように拡張機能設定を変更します。

```json:.vscode/settings.json
{
    "arduino.additionalUrls": [
        "https://dl.espressif.com/dl/package_esp32_index.json",
        "http://arduino.esp8266.com/stable/package_esp8266com_index.json"
    ],
}
```

## つまづきやすいところ

- USBケーブルに給電専用のものを使っていてPCに認識されない。
- `c_cpp_properties.json`の設定をしていないためコンパイルできない。
- `c_cpp_properties.json`の設定をしていないためLinterがエラーメッセージを出す。
- このボードはLEDのIOポートが13ではなく2だということに気が付くのが遅れる。

## 結果

無事アップロードが完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/ececf6bd-2f4f-c419-fe20-c2a286dea945.png)

## 参考

- [ESP8266/ESP32環境向上委員会](https://www.facebook.com/groups/927623023964478/)
- [Arduino core for the ESP32 のインストール方法](https://www.mgo-tec.com/arduino-core-esp32-install)
- [他のESP32ボードに手を出した](http://takashiski.hatenablog.com/entry/2017/06/15/114818)
- [ESP-WROOM-32ボードで、ARDUINO IDEを使用してスケッチプログラミング](http://johmon.com/blog/?p=245)

**Excelsior!**