ESP-WROOM-32
しばらく電子工作はやっていなかったのだけど、暑くて外に出たくない夏ということで、久しぶりにArduinoかWROOM-02でもって何か遊んでみようと思ったら、なんとEspressif社からESP-WROOM-32 というモジュールが出ていて半年も前から世の中に出回っていた。このモジュールでは、WiFiだけではなくBluetoothを使った通信も可能となった。また静電タッチセンサー、D/Aコンバーターなどの入出力機能も追加されており、モジュール単体でのピン数が33から38ピンに増え、GPIOとして利用できるピン数も増えた。
ざっとデータシートを見ると、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モジュールの他に以下のような周辺デバイスやボタンスイッチが載っている。
- 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と同様。
上の写真でわかるように、ふつうのブレッドボードに載せると外側には回路を追加する余地がないから、基板の下のスペースを使って配線用のワイヤを貼ることになる。
カメラ内深度合成(フォーカスステップ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ボタン)をクリックすると、以下のようなメッセージが表示された。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
ets Jun 8 2016 00:22:57 rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) ets Jun 8 2016 00:22:57 rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0x00 clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3ffc0000,len:0 load:0x3ffc0000,len:2304 load:0x40078000,len:3788 ho 0 tail 12 room 4 load:0x40098000,len:532 entry 0x4009813c [1;36m [0m[1;36m************************************** [0m[1;36m* hello espressif ESP32! * [0m[1;36m* 2nd boot is running! * [0m[1;36m* version (V0.1) * [0m[1;36m************************************** [0m[0;36mcompile time 18:16:58 |
先頭の方で、リスタートした理由(POWERON_RESET)とブートモード(SPI_FAST_FLASH_BOOT) を確認できる。ただ、RTCウォッチドッグ・タイマーによってもう一度リセットがかかっている(RTCWDT_RTC_RESET) のがちょっと気になるが。
hello espressif ESP32! 以降の部分にはエスケープシーケンスによる修飾もついているのでteratermで表示してみると、以下のように色付きでした。
この状態で、WiFi SoftAPはreadyのようなので、試しにスマホからつないでみると、シリアルモニタには以下のように表示された。
1 2 3 4 5 6 7 8 9 10 |
!!!ready!!! mode : softAP(32:ae:a4:05:62:f4) dhcp server start:(ip: 192.168.4.1, mask: 255.255.255.0, gw: 192.168.4.1) +WIFI:AP_START n:1 0, o:1 0, ap:1 1, sta:255 255, prof:1 add 1 station: 24:31:84:xx:xx:xx join, AID = 1, n, 20 +SOFTAP:STACONNECTED,24:31:84:xx:xx:xx |
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のモード変更とスキャンをしてみた。
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 |
!!!ready!!! mode : softAP(32:ae:a4:05:62:f4) dhcp server start:(ip: 192.168.4.1, mask: 255.255.255.0, gw: 192.168.4.1) +WIFI:AP_START ---------------- リセット直後はここまで [op -Q] WiFiモードの問い合わせ +CURMODE:2 2 == SoftAPモード +MODE:OK :> [op -S -o 1] STAモードに変更。 mode : sta(30:ae:a4:05:62:f4) mode : sta(30:ae:a4:05:62:f4) +MODE:OK :> +WIFI:AP_STOP +WIFI:STA_START [sta -S] STAモードにてWiFiスキャンを実行 +SCAN_DONE:OK! :> +SCAN:Baffalo-XXXXXX,00:1d:73:xx:xx:xx,4,2,-56,0,0 +SCAN:HUMAX-0XXX,cc:4e:ec:xx:xx:xx,4,1,-78,0,0 +SCAN:Buffalo-G-XXXX,cc:e1:d5:xx:xx:xx,4,9,-93,0,0 +SCANDONE |
コマンドなのか応答なのかわかりにくいので、シリアルモニタの入力フィールドからコマンドとして与えた部分は [ ] でくくった。また、余計な空行を削除しご近所のWiFi-APのスキャン結果は若干修正した。
ssidを指定して接続し、その後切断すると以下のような具合になる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[sta -C -s ssid -p password] 接続コマンド +JAP:OK :>n:2 0, o:1 0, ap:255 255, sta:2 0, prof:1 n:2 0, o:2 0, ap:255 255, sta:2 0, prof:1 state: 0 -> 2 (b0) state: 2 -> 3 (0) state: 3 -> 5 (10) add 0 +JAP:WIFICONNECTED 接続完了。もらったアドレスを表示 ip: 192.168.1.225, mask: 255.255.255.0, gw: 192.168.1.200 +JAP:CONNECTED,ssid [sta -D] 切断 state: 5 -> 0 (0) n:2 0, o:2 0, ap:255 255, sta:2 0, prof:1 +QAP:OK :> +JAP:DISCONNECTED,0,8 |
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
> esptool --port COM3 --baud 921600 read_flash 0 0x400000 test.bin esptool.py v2.0-beta3 Connecting..... Detecting chip type... ESP32 Uploading stub... Running stub... Stub running... Changing baud rate to 921600 Changed. 4194304 (100 %) 4194304 (100 %) Read 4194304 bytes at 0x0 in 58.8 seconds (570.7 kbit/s)... Hard resetting... > |
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をチカチカさせようと思っていたが、ドキュメント読みとセットアップで力尽きてしまった。ただ、さすがに開発ボードを使うとハンダ着けは不要で回路も特に考える必要もなさうだから、マイ・ファースト・スケッチはすぐにできると思いますが。