ESP32の開発環境をVisual Studio Codeで作る

Create a develop environment for ESP32 with VSCode
600円前後と安価にもかかわらず、2コアプロセッサや、無線通信が内蔵されているという高性能で人気を得ているSoCマイコン・ESP32。このチップの統合開発環境はメーカーからは提供されていませんが、マイクロソフトのVisual Studio Codeをカスタマイズすれば、ソースコードのビルドが簡単に行えるようになります。ただし、古い情報を参考にするとこんな問題が出てきます。

Windowsだとビルドが遅すぎね?

これはLinuxのgccをWindowsのmsysで動作させるという旧来の手法が原因だといわれています。現時点で配布されている最新の開発ツールにはCLang版が含まれている(将来的にはgccから完全に移行される予定)ので、それらを踏まえた開発環境の導入方法をまとめました。なお、CLangを使った環境は64bit版Windowsでしかできないのでご注意を。

1:ESP32のビルドツール(ESP-IDF Tools)のインストール
記事投稿時の最新版は「esp-idf-tools-setup-1.2.exe」なので、これ以降のバージョンを入手し、インストールします。このときオプションとしてCLangとPython2のダウンロードも促されますので、これらも承認します。

2:ESP-IDFのインストール
開発環境のSDKに相当するESP-IDFをハードディスクにコピーします。公式ドキュメントではGitを導入してから、コマンドラインより「git clone --recursive https://github.com/espressif/esp-idf.git」を実行するとありますが、ここでやっていることはデータのハードディスクへの丸写しなので、Githubからzip形式でダウンロードしたものを任意のフォルダーに展開してもかまいません。

3:環境変数の設定
コマンドラインからのビルドを行えるように、ESP-IDFのあるフォルダーを環境変数のパスとして追加します。Windows 10であれば、スタートボタンの右クリックメニューの「検索」で「path」をキーワードに検索するとすぐに見つかります。
環境変数設定ウィンドウが開いたら図のように「IDF_PATH」にGitでコピーしたESP-IDFがあるフォルダーを、「PATH」にはidf.pyファイルがある、ESP-IDFに含まれる「tools」フォルダー(%IDF_PATH%\tools)をそれぞれ追加します。
4:Visual Studio Codeの環境を整える
Visual Studio Codeをインストールして起動したら、「C/C++」拡張を「拡張機能」よりインストールしておきましょう。これでインクルードファイルの参照やキーワード推測などが使えるようになります。

続いてはプロジェクトファイルの構築です。Githubから複製したESP-IDFの「exsamples」フォルダーにはサンプルプログラムが多数含まれているので、この中から「get-started/hello_world」を任意の場所へコピーします。

このフォルダをVisual Studio Codeで開くと、内部に「.vscode」フォルダーが新しく作成されます。ここにtasks.jsonファイルを追加することで、ビルドを行うためのコマンド入力を簡略化させることができます。また、settings.jsonでシェルプログラムを指定すると、Visual Studio Codo内部のターミナルでビルド状況を把握できるようになります(参考サイト)。

settings.json
{
    "terminal.integrated.shell.windows": "cmd.exe",
}
tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "command": "idf.py",
            "type": "shell",
            "args": [
                "build"
            ],
            "presentation": {
                "reveal": "always",
                "echo": true
            },
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": "absolute",
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        {
            "label": "clean app",
            "command": "idf.py",
            "type": "shell",
            "args": [
                "clean"
            ],
            "presentation": {
                "reveal": "always",
            },
        },
        {
            "label": "flash app",
            "command": "idf.py",
            "type": "shell",
            "args": [
                "-p","COM3","flash"
            ],
            "presentation": {
                "reveal": "always",
            },
        },
        {
            "label": "monitor",
            "type":"process",
            "windows": {
                "command": "",
                "args": [
                    "idf.py",
                    "monitor"
                ],
            },
            "presentation": {
                "reveal": "always",
            },
            "problemMatcher": []
        },
        {
            "label": "menuconfig",
            "type":"shell",
            "windows": {
                "command": "",
                "args": [
                    "idf.py",
                    "menuconfig"
                ]
            },
            "presentation": {
                "reveal": "always",
            },
            "problemMatcher": []
        }
    ]
}
さらに、VSCodeの「基本設定→キーボードショートカット」経由で「keybindings.json」ファイルを開き、tasks.jsonにあるlabelの名称と合わせる形でショートカットタスクを登録すると、コマンドパレットを開かずに直でビルドを実行できるようになります。
はじめのビルドはライブラリー関連のソースコードもすべてコンパイルするため、やや時間はかかるものの、全体のビルド時間はLinux仮想環境と遜色ない速度になります。
もし、ビルドを実行してもコマンドラインウィンドウがすぐに閉じてしまったり、メッセージがまともに表示されない場合は、Pythonの設定が正しく反映されていない可能性があります。

Pythonの環境変数が反映されていない場合は、VSCodeを再起動するか、Windows自体を再起動します。

Pythonに含まれる標準ツールが古いと同じく処理が進まない(「The following Python requirements are not satisfied」というエラーメッセージが表示される)ので、pipを使って関連プログラムのアップグレードを行いましょう。ESP側が指示する方法(例:「C:\\Python27\\python.exe -m pip install --user -r C:\\esp\\esp-idf\\requirements.txt」をコマンドラインで実行)に従えば大丈夫です。
2019/02/17