ESP-IDF 環境利用の基礎知識
はじめに
本ドキュメントでは C 言語で ESP32 マイコンのプログラミングをするやり方を述べる. 開発環境として ESP-IDF を用いる.
ESP-IDF 環境のリファレンス
ESP32 マイコンのメーカが出している ESP-IDF という SDK(Software Development Kit)を用いる. ESP-IDF には ESP32 マイコン用のソフトウェアを開発するために必要なプログラムや文書などがパッケージ化されている.
初めの一歩: Hello World
プロジェクトの作成
ESP-IDF 環境でプログラミングを行う場合は, ESP-IDF 環境をインストールしたディレクトリ(ここでは $HOME/esp) 以下にプロジェクト用のディレクトリを作る.
$HOME/esp/esp-idf 以下に example ディレクトリがあるが, ここにサンプルが置かれている. 必要なサンプルを探してコピーして利用するのが簡単である.
プログラムの作成
最初の第 1 歩は Hello World である. サンプルがあるのでそれを流用する.
$ cd ~/esp $ cp -r esp-idf/examples/get-started/hello_world . $ cd hello_world
ディレクトリ構造は以下のようになっている. main/ の中に C 言語のプログラム (hello_world_main.c) が置かれている.
$ tree -L 3 . ├── CMakeLists.txt ├── main │ ├── CMakeLists.txt │ └── hello_world_main.c ├── pytest_hello_world.py ├── README.md └── sdkconfig.ci
試しに main/hello_world_main.c を見てみると良いだろう.
$ cat main/hello_world_main.c ...(略)...
ビルド
idf.py コマンドでビルドする(ESP-IDF の公式ドキュメント).
$ idf.py build
一番最初にビルドするときは必要となるライブラリを全てコンパイルしているので時間がかかる. プロジェクトのディレクトリをみると, build という新たなディレクトリが 作成され, その下にオブジェクトファイルが置かれているのがわかる.
$ tree -L 3 ...(略)...
マイコンへの書き込みと標準出力の表示
マイコンに書き込むのは idf.py flash コマンド, 標準出力を表示するのは idf.py monitor コマンドである. まとめて idf.py flash monitor として実行しても良い.
プログラムをマイコンに書き込む. -p オプションでデバイス名 (上記の場合は /dev/ttyUSB0) を指定する. なお,デバイス名が /dev/ttyUSB0 の場合は -p オプションは省略しても良い.
$ idf.py -p /dev/ttyUSB0 flash ...(中略)... App "hello-world" version: 1 Flashing binaries to serial port /dev/ttyUSB0 (app at offset 0x10000)... esptool.py v2.9-dev Serial port /dev/ttyUSB0 Connecting....... Chip is ESP32D0WDQ6 (revision 0) Features: WiFi, BT, Dual Core, Coding Scheme None Crystal is 40MHz MAC: 30:ae:a4:02:26:34 Uploading stub... Running stub... Stub running... Configuring flash size... Auto-detected Flash size: 4MB Flash params set to 0x0220 ...(中略)... Leaving... Hard resetting via RTS pin...
プログラム中で "printf("Hello world!\n");" と書いたのを表示させたければ, idf.py monitor する必要がある. monitor を終了するのは Ctrl-] である.
$ idf.py monitor ...(中略)... Hello world! This is ESP32 chip with 2 CPU cores, WiFi/BT/BLE, silicon revision 0, 4MB external flash Restarting in 10 seconds... Restarting in 9 seconds... Restarting in 8 seconds... ...(以下略)...
プログラムの修正と実行
デフォルトの hello_world_main.c は ESP32 チップの情報などを出しているので, include するヘッダファイルの数が多く, プログラムの行数も多い. 単に "hello world" を表示するだけであれば, 以下のようなよくある単純な hello world プログラムで十分である. 但し, 関数名は main でなく app_main にする必要がある. また試してみると分かるが, app_main の型は void でないといけない (int 型ではダメ).
$ cp main/hello_world_main.c main/hello_world_main.c.bk $ vi main/hello_world_main.c
エディタで以下のようなプログラムを書く.
#include <stdio.h>
void app_main(void)
{
int i;
for (i = 0; i < 100; i++) {
printf("%02d, Hello world!\n", i);
}
}
書き終わったら, idf.py flash monitor して実行する.
$ idf.py build
$ idf.py flash monitor
...(略)...
0, Hello world!
1, Hello world!
2, Hello world!
3, Hello world!
4, Hello world!
...(中略)...
98, Hello world!
99, Hello world!
このプログラムは 100 回表示させたら "Hello World!" の表示が止まる. 教育ボードのリスタートスイッチ (EN ボタン) を押すと, 再びプログラムが実行されることがわかるだろう.