ESP32開発環境/Arduino IDE (Debian11.3.0)

2022/7/8


はじめに

最初に断っておくが、ここであつかうArduino IDEはESP32の公式な開発環境ではない。 Espressif社(ESP32製造元)が提供している開発環境は ESP-IDF (https://github.com/espressif/esp-idf)らしい。
と思っていたが、
Welcome to Espressif’s site on GitHub (https://github.com/espressif)もEspressif社の公式サイトらしい。このなかにarduino-esp32の記載があることから、公式なものと思ってよさそうだ。

成り行き上、似非開発環境ArduinoIDEを使いESP32をターゲットとして開発をする。
素のESP32-WROOM-32EはATコマンドでアレコレ制御できるが、ArduinoIDEで書き込みをするとファームウェアを上書きするのでATコマンドによる制御ができなくなる。最悪の場合は、「デバイスの破壊」が待っている。
に同意できるなら非公式な開発環境を試してもいいかもしれない。
ESPESP
写真は左からESP-WROOM-02, ESP32-WROOM-32E, ESP32-WROOM-SOLO-1, ESP32-WROVER-E
製品の違いはEspressif Systems社(https://www.espressif.com/en)で調べてほしい。

ESP32-WROOM-32E書き込み回路

開発時にESP32-DevKitC互換ボードはリセットボタン・プログラムボタンを操作必要とするので、アレらしい。
互換ボードは書き込み回路とESP32が一体化している。
ESP32-WROOM-32E単体しか用意していないので、USBポート/シリアルポート変換器(+リセットボタン+プログラムボタン+NodeMCU回路)を作る。
などを考慮して、書き込み回路とESP32-WROOM-32Eは分離できるようにする。
ESP

パッケージをインストール

ESP32-WROOM-32Eの開発で必要になる。これがないとコンパイルに失敗する。
#管理者権限で実行
apt install -y python3-serial esptool
ESP なにもしないプログラムでもコンパイルするとエラーになる。
void setup() {}

void loop() {}

このような感じでエラーになるときは、python3-serialが疑わしい。
Traceback (most recent call last):
  File "esptool.py", line 27, in 
    import serial
ModuleNotFoundError: No module named 'serial'
exit status 1
ボードESP32 Dev Moduleに対するコンパイル時にエラーが発生しました。

Arduino IDEにライブラリを追加

  1. 環境設定を開く。
    ESP
  2. 追加のマザーボードマネージャのURLへESP,ESP32を追加する。ここに直接記入してよい。
    ESP
  3. 追加のURLを一行ずつ入力する。
    http://arduino.esp8266.com/stable/package_esp8266com_index.json
    https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
    ESP-WROOM-02の開発には http://arduino.esp8266.com/stable/package_esp8266com_index.json
    ESP32-WROOM-32Eの開発には https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

    ESP32-WROOMの開発にhttps://dl.espressif.com/dl/package_esp32_index.jsonを使用しているサイトがある。 ヘッダファイルにエラーがあると言われる。ソースを見たが、文法的におかしいわけではないので解決できなかった。
    adc_types.h:90:27: error: expected ',' or '}' before '__attribute__'
         ADC_DIGI_FORMAT_12BIT __attribute__((deprecated)),  /*!<ADC to DMA data format,                [15:12]-channel, [11: 0]-12 bits ADC data (`adc_digi_output_data_t`). Note: For single convert mode. */
                               ^
                  このあたりに,か}が必要と言っているが・・・
    
    ESP
  4. ボードマネージャでESP8266,ESP32を追加する。
    ESP
  5. ボードマネージャでESPを検索し、esp32をインストールする。
    ESP
  6. 同様にesp8266(ESP-WROOM-02)をインストールする。
    ESP
  7. ESP32-WROOM-32E,ESP32-WROOM-SOLO-1,ESP32-WROVER-Eの開発にはESP32 Dev Moduleを選択する。
    ESP

    ESP-WROOM-02の開発にはGeneric ESP8266 Moduleを選択する。
    ESP
  8. ボードにESP32 Dev Moduleを選択すると、詳細な設定項目が表示される。
    通信速度(Upload Speed)やFlash Freq,Flash Mode,Flash Size他はデータシートを見て適宜修正する。
    ESP

スケッチ

Arduino IDEではプログラムを「スケッチ」というらしい。
Arduino IDEで使用したmyBlinkを使用する。

信号を確認

いきなりESP32-WROOM-32Eをつなぐのはコワイ。プログラム時の信号を確認した。
ESPCH1:EN(RESET) CH2:IO0(PGM)
ESP32は接続していない。
10秒間に7回トライしている。
ESPCH1:EN(RESET) CH2:IO0(PGM)
IO0のL時間に2パターンあるらしい。
ESPCH1:EN(RESET) CH2:IO0(PGM)
RESET=L→Hの後IO0をH→L→Hにしている。
1回目のL時間は40mS,2回目のL時間は500mSになっている。
IO0にコンデンサを追加したが、不要かもしれない。
追加したコンデンサの影響で信号の立ち上がりが丸くなっている。
つぎのESPライタではコンデンサなしにしてみよう。

ESP32に書き込み

あー。とうとう書き込みをしてしまった。もう戻れない。
通信エラーを心配してUpload Speedを115kbpsまで落としていたが、Upload Speedはデフォルトのまま(921.6kbps)で問題なかった。ほぼ1MHzだよ。電波だよ。いいのか?
そのような心配は取越苦労だった。LEDチカチカで動作を確認。
念の為LEDの電圧を波形観測する。
ESPCH1:LED電圧(IO13)
H(100mS),L(100mS)
ESPCH1:LED電圧(IO13)
H(100mS),L(100mS)
もうすこしずれるかと思っていたが、duty比50%になっている。
ESPCH1:LED電圧(IO13)
H(100mS),L(100mS)
クロック240MHz(周期4.1667μS)だからミリ秒単位で誤差が出たらおおごとになるかもしれない

MACアドレスを取得

githubにサンプルがあるそうです。そのまま使う。
MACアドレスはシリアルモニタに表示される。
MACアドレスがわかったので、DHCPサーバに登録した。
/*
 * https://github.com/espressif/arduino-esp32/issues/932
 */
#include "esp_system.h"

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  
  // Get MAC address for WiFi station
  uint8_t baseMac[6];
  esp_read_mac(baseMac, ESP_MAC_WIFI_STA);
  char baseMacChr[18] = {0};
  sprintf(baseMacChr, "%02X:%02X:%02X:%02X:%02X:%02X", baseMac[0], baseMac[1], baseMac[2], baseMac[3], baseMac[4], baseMac[5]);

  Serial.print("MAC: ");
  Serial.println(baseMacChr);
}

void loop() {
  // put your main code here, to run repeatedly:
}

[ESP32]
ESPRESSIF (https://www.espressif.com/en)

Lang-ship ESP32シリーズ(無印,S2,S3,C3,...)比較2022年1月(https://lang-ship.com/blog/work/esp32-2022-01/)

[No module named serial]
Stack Exchange arduino IDE import serial ImportError: No module named serial (https://askubuntu.com/questions/1362572/arduino-ide-import-serial-importerror-no-module-named-serial)

Tech控え帳 [Arduino] No module named serial (https://www.chihayafuru.jp/tech/index.php/archives/3827)

[開発環境]
ESP-IDF (https://github.com/espressif/esp-idf)

ESP-IDE Programming Guide (https://docs.espressif.com/projects/esp-idf/en/stable/esp32/get-started/index.html)

TECHMAGIC ESP32をEclipse + ESP-IDFで動かしてみた (https://techmagic.co.jp/blog220322/)

[Arduino IDE]
マイコン技術Navi ESP32の初期設定(Arduino IDEの導入からLチカまでの手順)(https://www.ekit-tech.com/?p=3234)

Indoor Corgi ESP32、ESP-WROOM-32搭載製品の設定とプログラム書き込み方法 (https://www.indoorcorgielec.com/resources/arduinoide%E8%A8%AD%E5%AE%9A/esp-wroom-32%E6%90%AD%E8%BC%89%E8%A3%BD%E5%93%81/)

スマートライフを目指すエンジニア ESP32-WROOM-32Eの開発環境(Arduino IDE)を作り方 (https://smtengkapi.com/engineer-esp32-wroom32-dev)

Leafony ESP32 MCUのArduino IDEの設定 (https://docs.leafony.com/docs/environment/esp32/arduino/)

パーソナルブログメモリ ESP32書き込み ImportError: No module named serial.tools.list_ports (https://blog.goo.ne.jp/field_light/e/b5f54680844c832b437d114decb8603f)

お部屋でモバイル 【ESP32】MACアドレスを取得する方法 (https://mobile.k05.biz/e/2018/12/esp32-mac-addr.html)