2016.04.25
- 人×技術
ESP8266にArduinoスケッチを書き込んでUDPデータ送受信
こんにちは、イシイです。
前回の「ESP8266を使ってArduinoからネットワーク接続してみる」では、ESP8266を単純にWi-Fiモジュールとしてのみ使用し、スケッチ自体はArduino Uno本体に書き込んだ構成にしていましたが、今回はESP8266にスケッチを書き込んでArduinoとして使用し、ESP-WROOM-02のみでプログラムの実行とネットワーク通信を行います。 また、今回はESP-WROOM-02開発ボードではなく、ESP-WROOM-02ピッチ変換済みモジュール《フル版》の使い方も学びながら進めてみます。
事前準備
使用するもの
- ESP-WROOM-02ピッチ変換済みモジュール《フル版》
- FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)
- 2.54mmピッチ ピンヘッダ(ESP-WROOM-02にハンダ付け)
- ジャンパーピン
- ブレッドボード
- マイクロUSBケーブル(シリアル通信用)
ESP-WROOM-02のピンヘッダハンダ付け
ESP-WROOM-02ピッチ変換済みモジュール《フル版》にはピンヘッダが付属していないため、2.54mmピッチのピンヘッダを準備し、ハンダ付けをしておきます。
USBシリアル変換アダプターの電圧設定
手元に用意したUSBシリアル変換アダプターは、ジャンパーブロックで5V/3.3Vの切替が可能なタイプのものなので、ESP-WROOM-02の動作電圧にあわせて、3.3V側にジャンパブロックを移動させます。
配線図
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側の準備は完了です。
これで、必要な環境のインストール作業は完了です。
スケッチの準備
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モジュールのすべてを満たす代替品になるわけではないので、やはり用途によっての使い分けが必要そうですが、安価でありながら小型でネットワーク機能を持ったこのモジュールは、色々なシーンで使えそうです。