ESPr Developer 32 で WROOM-32 を Wi-Fi に繋いでみる

 前回 Seeeduino という Arduino Uno 互換ボードで Arduino に初めてさわってみたわけですが、 Arduino Uno は標準ではネットワークインタフェースを持っておらず、 Wi-Fi シールドも技適を通っているものを使うとなると選択肢は少なく、あっても結構高くついてしまうようでした。また、 ESP-WROOM-02 のような Wi-Fi モジュールを使おうと思うと、 Arduino Uno の 3.3V 出力では電流量が足りずに正しく動作しないようなので、それであれば Arduino Uno との組み合わせではなく単体でも Arduino 互換ボードとして動作し、 Wi-Fi だけでなく Bluetooth/BLE にも対応している ESP-WROOM-32 を使ってしまうのが良さそうということで、購入してみました。モジュールのサイトは下記になります。

www.espressif.com

 実際に使うにあたってはモジュール単体よりも開発ボードを買った方が色々とやりやすいので、今回はスイッチサイエンスで販売されている ESPr Developer 32 を購入しました。

www.switch-science.com

 ESP-WROOM-32 の開発ボードの選択肢としては他にも秋月電子で販売されている ESP32-DevKitC などもありますが、ESPr Developer 32 であれば突入電流対策が行われているということでしたので、値段的には ESP32-DevKitC よりも若干高いですが、 ESPr Developer 32 を選んでみました。

akizukidenshi.com

開発環境の準備から動作確認まで

 Seeeduino は Arduino Uno 互換ということで、 Arduino Web Editor を使ったのですが、 WROOM-32 は Web Editor では対応できないようだったので、 Arduino IDE を Mac にインストールして使用しました。インストール手順は下記リンク先で紹介されています。特に難しいことはないと思いますのでここでは詳細は割愛します。

Arduino - MacOSX

 次に、 Arduino IDE で WROOM-32 のファームウェアの開発ができるように、 Arduino core for ESP32 をインストールします。

github.com

$ mkdir -p ~/Documents/Arduino/hardware/espressif
$ cd ~/Documents/Arduino/hardware/espressif
$ git clone https://github.com/espressif/arduino-esp32.git esp32
$ cd esp32
$ git submodule update --init --recursive
$ cd tools
$ python get.py

 インストールが終わったら、 Mac と ESPr Developer 32 を USB ケーブルで接続します。

f:id:akanuma-hiroaki:20180317154120j:plain

 そして Arduino IDE を起動します。起動したら Tools メニューの Board の選択肢から、 ESP32 Dev Module を選択します。

f:id:akanuma-hiroaki:20180317152923p:plain

 これでひとまず環境の準備はできましたので、とりあえず正しく ESPr Developer 32 にファームウェアが書き込めるか確認してみます。下記スケッチを Arduino IDE で作成します。シリアル接続してシリアルモニタに文字を出力するだけのコードです。

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println("Hello World from ESPr Developer 32 :)");
  delay(1000);
}

 コードを入力したらまずは IDE の Verify ボタンでビルドできるか確認します。下記のような感じでエラーなくビルドされれば成功です。 

Sketch uses 162273 bytes (12%) of program storage space. Maximum is 1310720 bytes.
Global variables use 11052 bytes (3%) of dynamic memory, leaving 283860 bytes for local variables. Maximum is 294912 bytes.

 それでは IDE の Update ボタンで ESPr Developer 32 に書き込みます。

Sketch uses 162273 bytes (12%) of program storage space. Maximum is 1310720 bytes.
Global variables use 11052 bytes (3%) of dynamic memory, leaving 283860 bytes for local variables. Maximum is 294912 bytes.
esptool.py v2.1
Connecting....
Chip is ESP32D0WDQ6 (revision 0)
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 8192 bytes to 47...

Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.0 seconds (effective 4364.7 kbit/s)...
Hash of data verified.
Compressed 14128 bytes to 9196...

Writing at 0x00001000... (100 %)
Wrote 14128 bytes (9196 compressed) at 0x00001000 in 0.1 seconds (effective 1022.1 kbit/s)...
Hash of data verified.
Compressed 163424 bytes to 84070...

Writing at 0x00010000... (16 %)
Writing at 0x00014000... (33 %)
Writing at 0x00018000... (50 %)
Writing at 0x0001c000... (66 %)
Writing at 0x00020000... (83 %)
Writing at 0x00024000... (100 %)
Wrote 163424 bytes (84070 compressed) at 0x00010000 in 1.4 seconds (effective 929.0 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 122...

Writing at 0x00008000... (100 %)
Wrote 3072 bytes (122 compressed) at 0x00008000 in 0.0 seconds (effective 1712.6 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting...

 書き込みが成功すると自動的にプログラムが実行され、シリアルモニタでは下記のように文字列の出力が繰り返されます。

f:id:akanuma-hiroaki:20180318121723p:plain

Wi-Fi 接続確認

 ひとまず動作確認ができたので、 Wi-Fi への接続も確認してみます。とりあえず Wi-Fi に接続して、Webサーバへのリクエストを投げてみます。接続先としては同じ LAN に接続している Mac で下記のように HTTP サーバを起動しておきます。

$ python -m SimpleHTTPServer                                                                                                                                                                                                          
Serving HTTP on 0.0.0.0 port 8000 ...

 ESPr Developer 32 で動かすコードは下記のようになります。 Wi-Fi への接続自体は WiFi.begin() で SSID とパスワードを指定するだけでOKで、あとは WiFi.status() で接続ステータスが WL_CONNECTED になれば接続完了です。 loop() の処理としては先ほど動かした HTTP サーバに GET リクエストを投げてレスポンスを表示しているだけの単純なものです。

#include <WiFi.h>
#include <HTTPClient.h>

const char SSID[] = "aterm-xxxxxx-g";
const char PASSWORD[] = "xxxxxxxxxxxxx";
const char URL[] = "http://192.168.10.5:8000/";

void setup() {
  Serial.begin(115200);
  while(!Serial);

  WiFi.begin(SSID, PASSWORD);
  Serial.printf("Connecting to the WiFi AP: %s ", SSID);

  while(WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }

  Serial.println(" connected.");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  HTTPClient http;
  http.begin(URL);

  Serial.printf("Response: %d\n", http.GET());
  String body = http.getString();
  Serial.print("Response Body: ");
  Serial.println(body);

  delay(1000);
}

 これを Verify して問題なければ Upload で ESPr Developer 32 に書き込みます。書き込みが終わって起動すると、下記のようにシリアルモニタに出力され、 Wi-Fi へ接続して HTTP サーバからコンテンツを取得していることがわかります。

Connecting to the WiFi AP: aterm-xxxxxx-g ......... connected.
IP address: 192.168.10.10
Response: 200
Response Body: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
<h2>Directory listing for /</h2>
<hr>
<ul>
</ul>
<hr>
</body>
</html>

 HTTP サーバ側でも下記のようにリクエストを受信しているログが出力されます。

192.168.10.10 - - [17/Mar/2018 16:30:09] "GET / HTTP/1.1" 200 -
192.168.10.10 - - [17/Mar/2018 16:30:09] "GET / HTTP/1.1" 200 -
192.168.10.10 - - [17/Mar/2018 16:30:10] "GET / HTTP/1.1" 200 -

まとめ

 ネットワークインタフェースを搭載していないボードの場合、まずネットワークに接続できるようになるまでで結構苦労しそうですが、 ESPr Developer 32 のようなネットワークモジュールを積んだ開発ボードを使うことで簡単にネットワークに接続できてしまいます。値段的にも Arduino Uno やその互換ボードと比べても高くないですし、特に理由がなければ WROOM-32 などを最初から使ってしまう方が良さそうです。 ESPr Developer 32 にはピンヘッダがついていないので、今後自分ではんだ付けしてセンサー等との連携も試してみたいと思います。