ESP-WROOM-32を使ってみる

ESP-WROOM-32

しばらく電子工作はやっていなかったのだけど、暑くて外に出たくない夏ということで、久しぶりにArduinoかWROOM-02でもって何か遊んでみようと思ったら、なんとEspressif社からESP-WROOM-32 というモジュールが出ていて半年も前から世の中に出回っていた。このモジュールでは、WiFiだけではなくBluetoothを使った通信も可能となった。また静電タッチセンサー、D/Aコンバーターなどの入出力機能も追加されており、モジュール単体でのピン数が33から38ピンに増え、GPIOとして利用できるピン数も増えた。

ESP-WROOM-32
ESP-WROOM-32 TELEC(技適)マークついてます。

ざっとデータシートを見ると、ESP-WROOM-32モジュールにはコアにあたるESP32-D0WDQ6、40MHzの水晶オシレータ、4MBytesのSPIフラッシュメモリ、WiFi用のアンテナなどが実装されている。動作電圧は2.2~3.6V(推奨電源電圧は3.3V)、モジュール消費電流は平均80mA、推奨電源能力としては500mA (min) となっているから、それなりにちゃんとした電源が必要でふつうのUSBのVbusではギリギリというところか。

ESP32モジュールの中身はデュアルコア(Xtensa LX6 CPUの二個入り)構成になっていて、おのおのPRO_CPU (Protocol CPU)とAPP_CPU(Application CPU)と呼ばれているらしい  。これらのCPUコアは共通のアドレス空間を使ってメモリや周辺機能にアクセスできるということ。お遊びで使う私のようなユーザーがデュアルコアを意識したプログラミングをする必要はないと思うのだけど、このあたりの話は ESP32テクニカルリファレンス に書いてある。

秋月電子の通販ページを見ると、2017/2/1からモジュール単体が掲載され、3月半ばにメーカー(Espressif社)のリファレンス・デザインV1.1に準拠した”ESP32-DevKitC” という名称の開発ボードが、4月末には安くあげるのに便利なDIP化キットが発売されていた。
開発ボードの回路や使い方については、最初の方にリンクを置いたメーカーのページにドキュメントや回路図が用意されている。

WROOM-02のときと同様に、Arduino IDEでプログラミングするための Arduino core for ESP32 WiFi chip も用意されているから、モジュールに入門するための敷居も低そうである。また、Espressif社は本気で取り組む方向けに ESP-IDF (Espressif IoT Development Framework) という開発環境も用意している。まずは、気軽に使えそうなArduino Coreを利用してみることにする。

開発ボード ESP32-DevKitC

ESP-WROOM-32と書くと長ったらしいので今後はESP32モジュールと表記する。メーカーのページでは、ESP32という表記はコアチップ自体のことをさしているようだが。

ESP32-DevKitC
秋月のESP32開発ボード。ESP32-DevKitC

開発ボードには、ESP32モジュールの他に以下のような周辺デバイスやボタンスイッチが載っている。

  • 3.3V出力LDO電圧レギュレータのNCP1117。外部電源(USBも含む)からモジュール用の+3.3Vを出力する。供給能力は最大1A。データシートによれば、負荷が500mA時のドロップアウトは1Vを超えるようなので、電源側は+4.3V以上はないと困る。モバイルバッテリで駆動するようなときには留意すべき点だろう。
  • USB-UARTブリッジの CP2102。ESP32モジュールのTXD0, RXD0とUSBとの仲立ちをする。
  • USB Micro-B コネクタ。PC他からのUSBケーブルを接続する。Androidスマホに使うタイプのケーブルを用いる。
  • リセットボタン(ENボタン)。モジュールのリセット用。
  • ダウンロード用ボタン(Bootボタン)。このボタンを押したままリセットボタンを押すと、プログラム転送用のダウンロードモードとなる。ダウンロードボタンの押下中はGPIO0にLレベルが与えられる。
  • 外部5V電源に連動したパワーLED。Arduinoボードにあるような、GPIOに接続されているLEDはない。
  • CP2102からのDTRおよびRTSを使った、シリアル信号線の上げ下げによってダウンロードモードを開始するための回路。

ダウンロードモードは、GPIO0 = L、GPIO2 = Lとしてリセットする( EN = Lとする )と開始する。GPIO0はESP32モジュール(チップ)内でプルアップされ、GPIO2はプルダウンされているから、先に書いたボタンの操作を行い、他に何も接続していなければダウンロードモードが開始することになる。アプリケーション回路で別の用途にこれらのピンを使っていて、なおかつプログラムのダウンロードも行いたいときには注意が必要だろう。このあたりはWROOM-02と同様。

上の写真でわかるように、ふつうのブレッドボードに載せると外側には回路を追加する余地がないから、基板の下のスペースを使って配線用のワイヤを貼ることになる。

ESP32-DevKitC
ESP32-DevKitC

カメラ内深度合成(フォーカスステップ10)で撮影したが、フォーカスステップの谷間に入る面積が広いから、この大きさだと基板上にピントが合ってないパーツが見えてしまう。

Arduino IDEのセットアップと動作確認

プログラミングのための環境として、ESP-IDFとArduino IDE + Arduino core for the ESP32 の二者が選択可能なのだけど、まずはArduino IDEを使ってみることにした。この6月から使っているPCには、まだ導入していなかったからちょうどいい。以下のような手順で導入した。

  • Arduino IDEのダウンロードと導入。
    Arduino.ccのサイトからWindowsインストーラー版の最新パッケージ (https://downloads.arduino.cc/arduino-1.8.3-windows.exe) をダウンロードし、ふつうに実行して導入。
    導入後、ファイル/環境設定にて、「スケッチブックの保存場所」を自分の都合の良いディレクトリに変更する。例えば、”D:\src\arduino” としておく。
  • Arduino core for the ESP32のダウンロード。
    GitHubからzip (https://github.com/espressif/arduino-esp32/archive/master.zip) をダウンロード。展開する前に、次のように格納用ディレクトリを作成する。
  • Arduino core for the ESP32用のディレクトリの作成。
    スケッチを置くディレクトリに、”hardware\espressif\esp32” という名前のサブディレクトリを作成。今回の例では、 “D:\src\arduino\hardware\espressif\esp32” を作成することになる。
  • zipの展開。
    先ほどダウンロードしたmaster.zipを展開し、arduino-esp32-master というディレクトリの中身(arduino-esp32-masterの下階層)すべてを “D:\src\arduino\hardware\espressif\esp32″ にコピーする。
  • D:\src\arduino\hardware\espressif\esp32\tools\get.exe” を実行。
    メーカーのサイトから、
    ESP32の中に入っている xtensa プロセッサ用のコンパイラやリンカ他のツール群をダウンロードし、適切なディレクトリに配置してくれる。

Windowsへの導入はGitHub内にある手順書を参考に、Gitツールを使う部分を省略して行った。これで準備完了なので、さっそく開発ボードをPCにつないでみた。

注意:2018年7月に最初の安定版(1.0)がリリースされ、上記の手順はおそらく無効になりました。上記の手順書のページも削除されたようです。安定版の導入については、こちらを参照してください。また、安定版の導入についての投稿も追加しました。

ボードの選択

まずはツールメニューの「ボード」において、”ESP32 Dev Module”を選択する。次に「シリアルポート」から開発ボードのUSB-シリアルに割り当てられたポート(うちの場合は COM3 )を選択し、シリアルモニタを開く。通信速度115200bpsを選択してボードのリセットボタン(ENボタン)をクリックすると、以下のようなメッセージが表示された。

先頭の方で、リスタートした理由(POWERON_RESET)とブートモード(SPI_FAST_FLASH_BOOT) を確認できる。ただ、RTCウォッチドッグ・タイマーによってもう一度リセットがかかっている(RTCWDT_RTC_RESET) のがちょっと気になるが。

hello espressif ESP32! 以降の部分にはエスケープシーケンスによる修飾もついているのでteratermで表示してみると、以下のように色付きでした。

この状態で、WiFi SoftAPはreadyのようなので、試しにスマホからつないでみると、シリアルモニタには以下のように表示された。

MACアドレスの先頭24bitからシャープ製のスマホとわかる(下位24bitは隠してます)。

当然ながら、スマホ側もESP32モジュールのWiFiに接続成功。ちゃんと動いているようである。

SSCコマンド

そういえば、WROOM-02のフラッシュメモリにはWiFi機能をモデムのATコマンドに似た体系で制御するためのプログラムが仕込まれていたが、ESP32モジュールではWiFi機能のテストに限定されたSSCコマンドのインタプリタが書き込まれている。SSCコマンドの使い方は、ESP32 Getting Started Guide for SDK based on FreeRTOS.pdf にちょっと書かれていた。今となっては古めのドキュメントなので、これがSSCコマンドのすべてなのかどうかは不明。

リセット直後にArudino IDEのシリアルモニタでWiFiのモード変更とスキャンをしてみた。

コマンドなのか応答なのかわかりにくいので、シリアルモニタの入力フィールドからコマンドとして与えた部分は [ ] でくくった。また、余計な空行を削除しご近所のWiFi-APのスキャン結果は若干修正した。

ssidを指定して接続し、その後切断すると以下のような具合になる。

SSCコマンドを勉強してもあまり得るものはない。今回購入した開発ボードのWiFiはちゃんと動いてることが確認できたのでオーケーとする。

いちおうフラッシュ内容をファイルにする

これから自作のスケッチをダウンロードしてやると、出荷時にフラッシュメモリに仕込まれているSSCコマンドインタプリタは消えてしまうので、Arduino core for the ESP32 のアーカイブにふくまれている D:\src\arduino\hardware\espressif\esp32\tools\esptool.exe を使って吸い上げておくことにした。esptool の使い方はGitHubのESP8266 and ESP32 serial bootloader utility を参照。

Windows10のコマンドプロンプトを開いて、D:\src\arduino\hardware\espressif\esp32\toolsをカレントドライブ/カレントディレクトリにして実行。

1行目が入力したコマンドで、シリアルポートのCOM3から921600bpsで、SPIフラッシュの0番地から4MBytes分をtest.binにダウンロードしろ、という意味になる。実行が成功すると、ちょうど4MBytesのtest.binファイルが作成されるので、このファイルをとっておくことで出荷時に近いSPIフラッシュの内容を保存しておくことができる。

気になっていることは、read_flashを何度かやって同じ内容をもつはずのファイルを作り、”fc /b” コマンドによって比較してやると一致しない部分が一部生じてしまうこと。どうもWiFI機能の活動内容がフラッシュに書き込まれていくようだ。書き込まれている内容には、WiFiアクセスポイントのSSIDや事前共有キー(パスワード)も含まれているから、使わなくなった開発ボードを他の人にあげたりする際には、フラッシュの内容をちゃんと消去しておいた方がいいだろう。

追記

これを書いている時点でのパーティションテーブルによれば、読み出したフラッシュイメージのうち0x9000からの0x5000バイトはnvs(non volatile storage) 領域のようで、そこにWiFiに対する操作内容が書かれているようである。使われ方がまだ分からないので、ちょっと気持ち悪い。

きょうのまとめ

スマホ操作でLEDをチカチカさせようと思っていたが、ドキュメント読みとセットアップで力尽きてしまった。ただ、さすがに開発ボードを使うとハンダ着けは不要で回路も特に考える必要もなさうだから、マイ・ファースト・スケッチはすぐにできると思いますが。