ESP32をIDFの開発環境で触ってみようと思い開発ボードを購入してみました。
IDFでの実験はあんまり記事がなさそうなので備忘録的にblogに残そうと思います。
IDFでの開発の目的はFreeRTOSでタスクを簡単に分離する事です。
Arduinoでも内部的にはFreeRTOSで動いているようですが
他のライブラリを使う時にライブラリ内でブロックするような記述も多いので
ライブラリ自体がタスクに考慮されているのでIDFで書くと結果楽な気がします。
とりあえず試してみたいのは
I/O的には
1.UART
2.I2C (BME280, OLED1306)
3.WS2812などのシリアルLED
4.SD-CARD
5.赤外線通信
6.I2S or Audio Analog
ソフト的には
1.MQTT
2.WebSocket
3.WebServer
4.BLE
5.BT Serial
6.BT Sound
7.BT ビーコン
8.mDNS
これらを簡単にテストしたいと思ってたら

- ESP32-WROOM32 module
- Built-in programmer for Arduino and ESP-SDK
- WiFi, BLE connectivity
- Ethernet 100Mb interface
- MicroSD card
- Two relays 10A/250VAC with LED status
- CAN interface
- IR received and transmitter from 5 meter distance
- LiPo charger for stand alone operation during power breaks with 4 status LEDs
- UEXT connector to connect UEXT modules
- GPIO 40 pin connector with all ESP32 ports
- Dimensions: (75 x 75)mm ~ (2.95 x 2.95)
な結構要件を満たしているボードが見つかったので購入してみた。
利用前にまず必要なのはGPIOがどの様にアサインされているかを確認してみます。
回路図は以下からダウンロード出来ます。
ESP32-EVB_Rev_B.pdf
USB to UART

書き込みに必要なUSB to UARTが内蔵しています。
チップはCH340Tです。
UARTの入出力は
GPIO3/UORXD
GPIO1/UOTXD
に繋がっているようです。
それ以外にも
ESP_EN
GPIO0
GPIO2
の接続が確認出来ます。
これは、プログラム書込みモードへの遷移を自動的に行ってくれる回路になります。
ESP32のプログラム書込みを安定させる – Qiita
開発環境にmacOS Sierraを利用します。
MacのUSBとESP32-EVBを繋げてみました。
本体の電源はUSBのバスパワーでもとりあえず動く様です。
USBシリアルとして認識しているか確認してみます。
1 |
$ ls /dev/tty.* |
認識されていません。
USBSerialのチップCH340Tのドライバーは何処から手に入れる事が出来るのでしょう?
MACでArduino互換機(CH340)を接続するとMACがクラッシュする問題の解決方法 – Qiita
を参考にしました。
公式なサイトは???
よくわかりません。。。
安全性は不明ですので、自己責任でお願いします←
先ほどのページにあるリンク先
Run Makeblock hardware (and Arduino-compatible Boards with CH340/CH341) on Mac OS Sierra – mBlock
からドライバーを入れてmacを再起動します。
もう一度以下のコマンドを実行してみます。
1 |
$ ls /dev/tty.* |
/dev/tty.wchusbserial1410
としてドライバーが認識されました。
さて、ここから ESP32 の開発環境を作成します。
espressif/esp-idf: Espressif IoT Development Framework. Official development framework for ESP32.
の Mac OS Setup Guide から
1. pyserialなどを入れる
2. Toolchain ダウンロードインストール設定
3. ESP-IDF ダウンロードインストール設定
の手順になります。
自分の場合は .bash_profile に書きましたが
あと設定を書いたら $source .bash_profile などで読み込み直してください。
コマンドラインベースの開発環境は、上記の内容を実行する事で
サクッと完了します。
次にサンプルのプログラムを動かして動作を確認してみましょう
設定過程でダウンロードしたESP-IDFの
esp-idf/examples/
フォルダに一通りのサンプルがあります。
ESP-IDFを理解する為には
まず、これらのファイルを実行してみるのが近道だと思います。
esp-idf/examples/get-started/hello_world/main/hello_world_main.c
まずは、
Get Started — ESP-IDF Programming Guide v2.0
に基づいて、examples/get-started/hello_world を実行してみます。
hello_worldのディレクトリをコピーします。
コピーしたディレクトリで
1 2 |
$cd ~/esp/hello_world $make menuconfig |
をすると

helloworld-menuconfig
のような画面表示になります。
まずは、サンプルファイルをコンパイルして転送する為に
ESP32-EVB を接続したシリアルポートを設定します。
Serial flasher config > Default serial portを選びます。

シリアルドライバーをインストールした際に確認した
1 |
$ ls /dev/tty.* |
/dev/tty.wchusbserial1410 を入力します

Saveを行なったのちExitで設定メニューを終了します。
コンパイルして、ESP32-EVBに書き込みを行います。
1 |
$ make flash |
このような表示になると正常に転送されています。
動作を確認してみましょう。
main/hello_world_main.c
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 28 29 30 |
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "esp_spi_flash.h" void app_main() { printf("Hello world!\n"); /* Print chip information */ esp_chip_info_t chip_info; esp_chip_info(&chip_info); printf("This is ESP32 chip with %d CPU cores, WiFi%s%s, ", chip_info.cores, (chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "", (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : ""); printf("silicon revision %d, ", chip_info.revision); printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024), (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external"); for (int i = 10; i >= 0; i--) { printf("Restarting in %d seconds...\n", i); vTaskDelay(1000 / portTICK_PERIOD_MS); } printf("Restarting now.\n"); fflush(stdout); esp_restart(); } |
プログラムをみるとなんらかの文字列がprintfされています。
printfを行うとSerialに文字列を転送するので
ターミナルから確認してみます。
CoolTermで以下の設定でESP32-EVB内蔵のUSB-Serialに接続します

以下のような結果が表示されます

CoolTermを一度切断して、
1 |
$ make monitor |
というコマンドを試してみます。

同様にUSB-Serialから出力された値が表示されます。
Ctrl + ]
のキー入力で抜ける事ができます。
esp32-idfサンプルを実機に転送して、printfデバック
を確認しました。
Software Engineer #Unity #iOS