PlatformIO IDE for VSCode でESP-IDF を利用したESP32プログラムの開発

ESP32の複数のコアを適切に利用して並列動作させるためには、Espressif の ESP-IDF をフレームワークとして使う必要があるようだ。PlatformIO IDE for VSCode でESP32のプログラム開発ではArduinoをフレームワークとして使う場合について試したが、今回は ESP-IDF を利用した場合の動作確認をしてみた。少し時間がかかり、待つ必要がある場合もあるが、PlatformIOが自動的に必要なファイルなどをインストールしてくれるので環境設定でイライラすることがなく、楽である。

ここでは、ESP-IDFに含まれているサンプルプロジェクトの  espidf-hello-world をビルドして実行する。

PlatformIO IDE のインストールまでは、PlatformIO IDE for VSCode でESP32のプログラム開発 に書いた内容と基本的に同じだが、Visual Studio Code をインストール時にGitがインストールされていない状況から始めた例を示す。Platform IDE がインストール済みなら プラットフォームのインストール から、Platform としてEspressif32 がインストール済みなら サンプルプロジェクトのインポート から始めればよい。

Visual Studio Code インストール直後の起動

言語パック

日本語表示をする場合には、次の[インストールして再起動(Install and Restart)]をクリックして言語パックをインストールする。

Git

Git がインストールされていない場合には上記のようにGitが見つからないという警告が表示される。

必要に応じて次の[Download Git]をクリックし、Git をダウンロードしてインストールする。

Gitをインストールして再起動すると次のようなメッセージが表示され、Gitがうまく使えるようになったことがわかる。

PlatformIO IDE のインストール

次に PlatformIO IDE のインストールを行う。

VSCodeウィンドウの一番左にあるアクティビティバーの拡張機能  (Ctrl-Shift-X)を選択する。

サイドバーの検索窓に platformio を入力して検索する。

しばらくすると候補が表示される。

候補から[PlatformIO IDE]を選択する。

選択すると次のように表示されるので、[インストール]ボタンをクリックして、インストールを開始する。

インストールが開始されたらしばらく待つ。

インストールができたら、次のようになるので、[再読み込み]ボタンをクリックして有効化する。

再読み込みされると次のような表示になるが、この時にステータスバーが PlatformIO: Installing PlatformIO IDE … なら、まだインストール中なので別の作業はしない。

右下の出力ウィンドウを大きくすると次のように、終了するまでこのウィンドウを閉じたり、他のフォルダーを開いたりするなというメッセージが出ている。

正常にPlatformIO IDE のインストールが終わったら次のようなメッセージが表示され、ウィンドウのリロードが促される。

リロードする前に、右下の出力パネルにも[PlatformIO IDE installed successfully]が表示されていることを確認すると、より良い。

一方、を表示したままだと、ウィンドウの一番下のステータスバーが PlatformIO: Installing PlatformIO IDE … のままのようであり、それが消えるのを待っていると時間を無駄にする(無駄にした :-<)。

次のように表示された場合には、[ウィンドウの再読み込み]ボタンをクリックして更新する。

しばらく待っていると次のようにPIO Home が表示される。

プラットフォームのインストール

プラットフォーム(Espressif32)がインストールされていない場合に、PIO Home の [Project Examples]ボタンをクリックすると以下のように表示され、プラットフォームのインストールが促される。

(PIO Homeの Platform ボタン をクリックし、そこからまずプラットフォームをインストールしても良い。)

組み込み用プロセッサであるESP32のプラットフォームをインストールするので[Install Embedded Platform]をクリックする。

次のような画面になるので、しばらく待つ。

検索窓が表示されたら、ESP32を入力する。そうすると Espressif 32 が候補として表示される。

Espressif 32 をクリックする。

次のような画面になるので、[Install]ボタンをクリックしてプラットフォームのインストールを開始する。

インストール中は次のように表示される。

インストールが完了すれば次のようになる。

[OK]ボタンを押してパネルを消す。

Espressif 32 のプラットフォームをインストールすると Arduino と ESP-IDFの両者のフレームワークがインストールされるようである。

サンプルプロジェクトのインポート

PIO Home の [Project Examples]ボタンをクリックする。

次のような [Import Project Example]パネルが表示される。

Select an Example … の検索窓をクリックすると候補が表示される。

ここでは、espidf-hello-world を選択する。

[Import]ボタンをクリックしてインポートを開始する。

自動的に必要なファイルのインストールもされるので、完了を待つ。

インポートが完了するとサイドバーのエクスプローラーにプロジェクトが表示される。

サンプルプロジェクトのビルド

platformio.ini の編集

まず、ビルドの準備として platformio.ini を編集する。

ここでは、PlatformIO IDE for VSCode でESP32のプログラム開発 と同様にターゲットのボードとして「DOIT ESP32 DEVKIT V1」を使用するとする。

PlatformIO IDE for VSCode でESP32のプログラム開発 から「DOIT ESP32 DEVKIT V1」は次の記述になる。

[env:esp32doit-devkit-v1]
platform = espressif32
board = esp32doit-devkit-v1
framework = espidf

上記を platform.ini に追加し、また、シリアル通信速度を115200 bps にする。

このままでは、ビルドすると platformio.ini に記載されているすべてのボードがビルド対象になり、時間がかかる。使わないボードの記述を削除しても良いが、ここでは、PlatformIO IDE における複数の対象環境の指定方法 で示したように、デフォルトを設定する。「DOIT ESP32 DEVKIT V1」をデフォルトにするには次を追加することになる。

[platformio]
env_default=esp32doit-devkit-v1

ビルド

ステータスバーのビルドアイコン をクリックしてビルドする。

次のように順次コンパイルなどが進む。

 

正常にビルドできれば以下のようになる。

アップロード

正常にビルドができたらプログラムをボードにアップロードする。

ステータスバーのアップロードアイコン  をクリックする。もちろん、ボードをPCに接続しておく必要がある。

次のようになればアップロード完了。

シリアルモニタアイコン  をクリックしてシリアルモニタを開く。

動作確認

Hello world! とプロセッサの情報が表示されれば、ビルドしたプログラムが実行されていることがわかる。

不具合

DOIT ESP32 DEVKIT V1 ボードで試したら、上記の出力メッセージの 「Restarting in X seconds … 」が次々と速く表示され、1秒間隔くらいでリセットが行われている。本来なら10秒ごとにリセットされるはず。プログラム中の portTICK_PERIOD_MS の値の設定がどこかでおかしくなっているようだ。ボードに対する FreeRTOS のなんらかの定数の設定がおかしいのかもしれない。

別の環境で MH-ET Live ESP32 minikit を試したら10秒間隔でリセットされた。2種類のボードで違う挙動をする原因は調べていない。

まとめ

PlatformIO IDE for VSCode を使えば、ESP-IDFのためのインストールなどの環境設定もArduino と同様にほぼ自動的に行われる。GUI環境での開発もできるので ESP-IDFを直接利用した開発の敷居を低くしているように思う。

 ただ、ESP-IDF を利用して並列動作するプログラムを作成するには、ESP-IDFのAPIを理解するだけではなく、 FreeRTOS を理解することも必要なので少し時間がかかりそうである。

コメント

  1. espおじさん より:

    DOIT ESP32 DEVKIT V1にて早くリセットがかかってしまう件、platformio.iniのenv:esp32doit-devkit-v1の設定によるものと思われます。
    スニペットではframework = espidfとなっていますが、スクリーンショットではframework = arduinoとなっています。後者でビルド・アップロードを行うと件の現象が再現しましたが、前者では正常に動作しました。