こんにちは、イシイです。

前回の「ESP8266を使ってArduinoからネットワーク接続してみる」では、ESP8266を単純にWi-Fiモジュールとしてのみ使用し、スケッチ自体はArduino Uno本体に書き込んだ構成にしていましたが、今回はESP8266にスケッチを書き込んでArduinoとして使用し、ESP-WROOM-02のみでプログラムの実行とネットワーク通信を行います。 また、今回はESP-WROOM-02開発ボードではなく、ESP-WROOM-02ピッチ変換済みモジュール《フル版》の使い方も学びながら進めてみます。

事前準備

使用するもの

ESP-WROOM-02のピンヘッダハンダ付け

ESP-WROOM-02ピッチ変換済みモジュール《フル版》にはピンヘッダが付属していないため、2.54mmピッチのピンヘッダを準備し、ハンダ付けをしておきます。

ESP-WROOM-02にハンダ付け

USBシリアル変換アダプターの電圧設定

手元に用意したUSBシリアル変換アダプターは、ジャンパーブロックで5V/3.3Vの切替が可能なタイプのものなので、ESP-WROOM-02の動作電圧にあわせて、3.3V側にジャンパブロックを移動させます。

USBシリアル変換アダプター

配線図

配線図

ESP-WROOM-02ピン配置

ピン 接続先
3V3 ブレッドボード+
EN ブレッドボード+
IO2 ブレッドボード+
IO0 ブレッドボード+
IO15 ブレッドボード-
GND ブレッドボード-
TXD シリアルアダプタRX
RXD シリアルアダプタTX

USBシリアル変換アダプターピン配置

ピン 接続先
VCC ブレッドボード+
GND ブレッドボード-
RX ESP-WROOM-02TX
TX ESP-WROOM-02RX

ESP-WROOM-02のモードについて

ESP-WROOM-02での接続には2つのモードがあり、ATコマンドでやりとりしたり書き込んだスケッチを実行する「Flash Boot Mode(実行モード)」と、スケッチを書き込んだりファームウェアアップデートを行うための「UART Download Mode(書き込みモード)」があります。
上記の配線図は前者の「Flash Boot Mode」です。「Flash Boot Mode」と「UART Download Mode」の配線の違いは、IO0ピンがLOWなのかHIGHなのかだけなので、ATコマンドを使ったりスケッチを実行する場合には、IO0ピンはHIGH(上記の図で言うとブレッドボードの+)に設置します。
なお、配線図ではRSTピンのジャンパーがどこにも接続していませんが、モードを変える際にリセットするために使用するので、現状は宙ぶらりんのままで問題ありません。リセットは、RSTピンをGNDに落としてLOWにし、その後ピンを外すことで実行されます。

ATコマンドでアクセスポイント接続を試す

まずは、ATコマンドでアクセスポイントを設定し、設定したアクセスポイントに接続できるのかを試してみます。「Flash Boot Mode」でUSBケーブルを接続した状態で、シリアルモニターからATコマンドを実行します。
ESP8266モジュールをアクセスポイントモードにするには

AT+CWMODE=2
OK

で、アクセスポイントの設定は

AT+CWSAP="ESP_WROOM_02","hoge4009",2,3
OK

となります。 「ESP_WROOM_02」がSSID、「hoge4009」がパスワード、「2」がチャネルID、「3」が暗号化方式(WPA2PSK)になります。暗号化方式でWPA2PSKを選んでるせいか、パスワードは英数字混合でないとエラーになってしまいました。

ここまでできたら、MacからESP8266モジュールのアクセスポイントにアクセスできるか試してみます。

アクセスポイント接続

無事接続まででき、ひとまずアクセスポイントが機能することが確認できました。

UDPでのデータ送受信の準備

今度は、同じアクセスポイント内の端末とのUDPデータ送受信のテストをしてみます。

書き込みモードに変更

ESP8266にスケッチを書き込むためには「UART Download Mode」に変更する必要があるため、IO0ピンをブレッドボード-に挿します。また、挿しただけだと切り替わらないため、RSTピンをブレッドボード-に一度挿し、またピンを抜きます。これでリセットがかかって「UART Download Mode」として起動され、書き込みが可能になります。

ボードの取得

ESP8266にArduinoスケッチを書き込めるようにするために、Arduino IDE側でも準備をします。 ここのGithubページ内にある、ボードマネージャーのインストールを行います。

Arduino IDEを開き、Arduino > Preferencesウィンドウを表示し、Additional Board Manager URLsに

http://arduino.esp8266.com/stable/package_esp8266com_index.json

を追加します。既に他の記述がある場合には、カンマ区切りで複数設定することができます。その後、Tools > Boards Manager からesp8266を選択してインストールし、IDE側の準備は完了です。

Boards Manager

これで、必要な環境のインストール作業は完了です。

スケッチの準備

UDPで受信したデータをシリアルモニターに表示し、送信元に「ok」を返すだけのスケッチを用意します。

#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
 
//Access Point Setting
const char *APSSID = "ESP_WROOM_02";
const char *APPASS = "hoge4009";
unsigned int localPort = 8888;
 
WiFiUDP UDP;
char packetBuffer[255];

static const char *udpReturnAddr = "192.168.4.2";
static const int udpReturnPort = 8889;
 
void setup() {
 
  Serial.begin(115200);
  Serial.println();
 
  WiFi.softAP(APSSID, APPASS);
 
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  UDP.begin(localPort);
 
}
 
void loop() {
 
  int packetSize = UDP.parsePacket();
 
  if (packetSize) {
 
    int len = UDP.read(packetBuffer, packetSize);
    //終端文字設定
    if (len > 0) packetBuffer[len] = '\0';
 
    Serial.print(UDP.remoteIP());
    Serial.print(" / ");
    Serial.println(packetBuffer);
 
    UDP.beginPacket(udpReturnAddr, udpReturnPort);
    UDP.write("ok");
    UDP.endPacket();  
    
  } 
 
}

スケッチ書き込みの設定

Arduino IDEの書き込みボードに「Generic ESP8266 Module」を選択すると、いくつかのオプションが表示されますので、それぞれ下記のように設定します。

オプション 既定値からの変更有無
Flash Mode QIO 有り
Flash Frequency 40MHz 無し
Upload Using Serial 無し
CPU Frequency 80 MHz 無し
Flash Size 4M(3M SPIFFS) 有り
Reset Method nodemcu 有り
Upload Speed 115200 無し
Port 接続しているUSB 有り

これで、コンパイルチェックとスケッチのアップロードができます。

スケッチ書き込み

およそ10秒くらいかかって、スケッチアップロードの完了です。

スケッチアップロード

動作テスト

スケッチを実行するには「Flash Boot Mode(実行モード)」にする必要があるため、IO0ピンをブレッドボード+に挿し、RSTピンをブレッドボード-に一度挿し、またピンを抜いてリセットを行います。これで「Flash Boot Mode」で起動されたので、この状態でシリアルモニターを立ち上げると、スケッチが実行されて

AP IP address: 192.168.4.1

が表示されています。残すはUDP送受信のテストです。

UDP送受信プログラムの準備

簡易的な送受信テストを行うプログラムをNode.jsで準備してみます。

/*
Send Message To ESP-WROOM-02 
*/
var ESP_HOST = '192.168.4.1';
var ESP_PORT = 8888;

var dgram = require('dgram');
var sender = dgram.createSocket('udp4');
var message = new Buffer('test message');

sender.send(message, 0, message.length, ESP_PORT, ESP_HOST, function(err, bytes) {
    if (err) throw err;
    sender.close();
    });

/*
Receive Message From ESP-WROOM-02 
*/
var NODE_HOST = '192.168.4.2';
var NODE_PORT = 8889;

var receiver = dgram.createSocket('udp4');

receiver.on('message', function (message, remote) {
    console.log('From ESP_Module Message : ' + message);

    });

receiver.bind(NODE_PORT, NODE_HOST);

プログラムの実行

Macで、設定したSSID「ESP_WROOM_02」に接続し、ESP8266とローカルで実行するNode.jsを同じネットワーク内に接続します。Node.jsのプログラムを実行すると、Arduinoのシリアルコンソールには

192.168.4.2 / test message

が表示され、Node.jsを実行したコンソールには

From ESP_Module Message : ok

が表示され、UDP送受信の動作確認ができました。

感想

ESP-WROOM-02開発ボードでは、「Flash Boot Mode」と「UART Download Mode」の切替やリセットなどの機能が吸収されていて、ボードをIDEに追加してボードオプションを設定する以外には何もせずに、マイクロUSBケーブルを挿すだけでスケッチの書き込みも実行もできるので、今回使用したESP-WROOM-02ピッチ変換済みモジュール《フル版》に比べて手間が少なく便利ですが、開発ボードに比べて安価で(といっても、シリアルUSBアダプタも用意すると、1枚だけでは差がつきませんが)、小型化や軽量化の際には開発ボード以外のものも使う可能性が出てくるので、今回は違うものを使用してみました。

設定さえ済ませて慣れてしまえば、容易にArduinoスケッチを利用することができ、この小型のモジュール内でプログラムもネットワーク機能も使用できるので、ESP8266モジュールは非常に有用に思われます。ただし、ここでは触れてはいませんが、やはりArduino Unoなどに比べて出力電流が弱かったり、アナログピンが使いにくかったりと、他のArduinoモジュールのすべてを満たす代替品になるわけではないので、やはり用途によっての使い分けが必要そうですが、安価でありながら小型でネットワーク機能を持ったこのモジュールは、色々なシーンで使えそうです。