概要
ちょっと前にESP-WROOM-32にSPI接続のEthernetモジュール、USR-ES1をつないでみたところ、標準的に結線するだけでスケッチから有線LANを使うことができた。では、ESP-WROOM-02Dではどうなのかと思って試してみた。
結果としては、やはり特別な工夫もなくLANを利用することができた。すでにESP32でやっていることなので、今回やったのは以下の3項目だけだった。
- ESP-WROOM-02用の結線図を書いてブレッドボードに載せたこと。
- ESP32用に作った性能測定用のスケッチをESP8266用にビルドし直したこと。
- スケッチの定数変更と、1行の追加。
回路
スイッチサイエンスのピッチ変換基板(フル版)に、ESP-WROOM-02Dをはんだ付けし以下のような回路をブレッドボードに載せた。
WROOM-02のRESETピンはGPIO16につなぐだけにし、リセット操作はENピンに接続したEN-SWで行う。
スイッチサイエンスのフル版ピッチ変換基板の下に抵抗やジャンパワイヤを配置することで、WROOM-02周りはすっきりできるようになった。
電源は、ボード上に+3.3Vで1Aを供給可能な定電圧レギュレータのADP3338-A33を載せ、+5V 3AのACアダプターをつないだ。
電源周りとUSR-ES1を幅のひろいブレッドボードに収めようとしたが、LANケーブルの接続もあるのであきらめ、USR-ES1は写真のようにミニブレッドボードに載せた。
右側のミニブレッドボードは、スケッチの投入や実行時のシリアルモニタへの表示を行うための USB-シリアル変換用のAE-FT231Xを載せたもの。
SPIについて
Arduino Core for ESP8266 のSPIライブラリでは、SPI接続に使うピンを指定しなかった場合以下のような接続を前提としている。
- GPIO12 = SPI MISO
- GPIO13 = SPI MOSI
- GPIO14 = SPI SCLK
- GPIO15 = SPI SS (※ ハードウェアCSの場合)
SPIのスレーブセレクトをESP8266の内部機構(ハードウェアCS)によって行うならば、SPI SSとして使えるピンはGPIO15に限定されるようだ。ハードウェアCSを用いるならば、SPI.setHwCs(true); を呼ぶ。
今回用いるEthernet2ライブラリのように、ライブラリ内部でのI/Oピン操作によってスレーブセレクトするならば、SPIライブラリはSSピンには関与しないようである。なので空いているGPIOピンを使うことになる。
おそらく、SPI.setHwCs(true); とした方がSPIでの転送は高速になると思われるが、スレーブセレクト操作を含んだライブラリを使うので指定できない。SPIライブラリの初期値としては、ハードウェアCSは使わないことになっているから、その旨を指定する必要もない。
今回は、スレーブセレクト用にGPIO4を使い、USR-ES1のリセット用にGPIO5を使った。
スケッチ
今回も、Windows 7 が動いているノートPCで待受側プログラムを動かし、TCP接続して10MBytesのデータを送信したときの時間を測ってみた。待受側プログラムやESP32用のスケッチについてはこちらのページを参照。WROOM-02のためには「ESP32 + USR-ES1用テストスケッチ(有線接続)」の定数を変更する共に、以下に記す1行だけ追加する必要があった。
ESP32で動いたものを定数を変更してビルドし直すだけですんなり動くと思ったら、EthernetClient.connect(); が成功した直後にウォッチドッグにひっかかってリセットされてしまった。これはよくあることなので、ESP32用スケッチの60行目あたりを以下のようにした。
1 2 3 4 5 |
while(transed_bytes < TRANSFER_BYTES) { ESP.wdt_feed(); // ESP8266用の追加。 size_t n = client.write(buffer, sizeof(buffer)); if (n == 0) { ... |
この追加により、ESP32のときと同様に10MBytesの繰り返し送信ができるようになった。
なお、スケッチの最初の方にある定数定義は以下のように変更している。
1 2 3 |
#define LED 2 #define ETH_RESET 5 #define SPI_SS 4 |
実行結果
ESP32で試したときEthernet2ライブラリに以下のような修正を入れていた。
- SPIクロックを24MHzに
- write() メソッドをバースト転送風に
具体的な修正内容については前の投稿を参照。今回はライブラリを元に戻さずそのまま使うことにした。
1 2 3 4 5 6 7 8 9 10 11 |
start 1 : send 10485760 bytes completed. 7797 msec. 1.34 MBytes/sec start 2 : send 10485760 bytes completed. 7818 msec. 1.34 MBytes/sec start 3 : send 10485760 bytes completed. 7809 msec. 1.34 MBytes/sec start 4 : send 10485760 bytes completed. 7818 msec. 1.34 MBytes/sec start 5 : send 10485760 bytes completed. 7823 msec. 1.34 MBytes/sec start 6 : send 10485760 bytes completed. 7958 msec. 1.32 MBytes/sec start 7 : send 10485760 bytes completed. 8024 msec. 1.31 MBytes/sec start 8 : send 10485760 bytes completed. 7955 msec. 1.32 MBytes/sec start 9 : send 10485760 bytes completed. 7954 msec. 1.32 MBytes/sec start 10 : send 10485760 bytes completed. 8009 msec. 1.31 MBytes/sec average = 1.33 MBytes/sec |
平均転送レートは1.33MBytes/secという結果だった。ESP32では1.44MBytes/secだったので若干遅い。
きょうのまとめ
ESP32と同様に、ESP8266(WROOM-02)でもEthernetシールドとEthernet2ライブラリの組合せでLANが利用できることが分かった。SPIによるデータ出力が処理の中心なので、転送レートに若干の差がついたのがちょっと不思議な気もする。
もともと、ESP32を使ったESP-NOWのスレーブ側でWiFiステーション機能を使わずに済ますために始めた調査だったのだが、ESP32とUSR-ES1の組合せでは電源が悩ましかったので、WROOM-02を使った方が有利なように思えてきた。今回の構成でESP-NOWのスレーブも動かしてみる予定。