ESP-WROOM-02とArduino UNOでhttp通信

Arduino UNOとESP-WROOM-02をSoftware Serialで接続します。ESP-WROOM-02は前の記事で9600bpsに通信速度を設定してあります。Software.Serialを使いATコマンドを文字列として送信すれば良いのですが、通信の様々な処理を考えるとライブラリを使った方が楽です。

ITEADLIB_Arduino_WeeESP8266

こちらのページからDownload ZIPでファイルをダウンロードしてきます。

Arduinoのポートは5V、ESP-WROOM-02のポートは3.3Vです。そのため5Vと3.3Vの変換を行うロジックレベルコンバータが必要になります。秋月やスイッチサイエンスで商品としてありますが、できるだけ小さくしたかったのでBSS138を使い自作する事にしました。参考にした回路図はコチラ。感光基板で基板を作成して部品をハンダ付けします。BSS138は秋月で購入。NchチップMOS-FET BSS138

基板はCADを使うまでもないのでAdobe Illustratorで作りました。抵抗は10KΩの2016サイズ。パターンは下図の通りです。PDFを印刷して透明フィルムに印刷して感光基板で作れます。表面実装なので、字が反転しています。基板になった時には正常な向きになります。LVが3.3V、HVが5Vになります。

ロジックレベルコンバータPDF
スクリーンショット 2015-08-28 22.14.11

完成したロジックレベルコンバータは下の写真のようになります。ハンダが汚いけど動いているのでこれでオッケーにしてください。

IMG_4319

ロジックレベルコンバータのLVに3.3V、HVに5Vを接続します。Arduino UNOのSoftware Serialで指定したポートからロジックレベルコンバータのHV側につながり、反対のLV側からESP-WROOM-02に繋がります。

IMG_4325

Arduinoのプログラムで

[c]
SoftwareSerial mySerial(12, 11);
[/c]

として12番ポートをRX、11番をTXポートに指定しています。

つぎにSoftware Serialの通信速度を設定します。この部分はライブラリのヘッダファイルを編集する必要があります。ライブラリフォルダ(user/document/Arduino/ITEADLIB_Arduino_WeeESP8266-master/)のESP8266.hを開き、40行あたりにあるUSER_SEL_VERSIONをVERSION_18としておきます。このライブラリはESP-WROOM-02のファームウェアバージョンにより通信速度を変えています。VERSION_18では通信速度が9600bpsでした。現在流通しているファームウェアはVer.24ですが、通信速度を落とすために前のバージョンを指定します。

[c]
#define USER_SEL_VERSION VERSION_18
[/c]

ライブラリのexamplesを改良して以下の様なスケッチを作成しました。

[c]
#include "ESP8266.h"
#include <SoftwareSerial.h>

//Arduino UNOとESP8266をシリアルで繋いで通信。
//UNOとESP8266はSoftware Serialで通信。

#define SSID "mkb-home"
#define PASSWORD "matsutaro"
#define HOST_NAME "mkbtm.jp"
#define HOST_PORT 80

SoftwareSerial mySerial(12, 11); /* RX:12, TX:11 */
ESP8266 wifi(mySerial);
//software serialの速度はESP8266.hで設定

void setup(void)
{
//Serial.begin(9600);
Serial.begin(57600);
Serial.print("setup begin\r\n");

Serial.print("FW Version:");
Serial.println(wifi.getVersion().c_str());

if (wifi.setOprToStationSoftAP()) {
Serial.print("to station + softap ok\r\n");
} else {
Serial.print("to station + softap err\r\n");
}

if (wifi.joinAP(SSID, PASSWORD)) {
Serial.print("Join AP success\r\n");
Serial.print("IP:");
Serial.println( wifi.getLocalIP().c_str());
} else {
Serial.print("Join AP failure\r\n");
}

if (wifi.disableMUX()) {
Serial.print("single ok\r\n");
} else {
Serial.print("single err\r\n");
}

Serial.print("setup end\r\n");
}

void loop(void)
{
uint8_t buffer[512] = {0};

if (wifi.createTCP(HOST_NAME, HOST_PORT)) {
Serial.print("create tcp ok\r\n");
} else {
Serial.print("create tcp err\r\n");
}

char *hello = "GET / HTTP/1.0\r\n User-Agent: arduino\r\n\r\n";

wifi.send((const uint8_t*)hello, strlen(hello));

uint32_t len = wifi.recv(buffer, sizeof(buffer), 10000);
if (len > 0) {
Serial.print("Received:[");
for(uint32_t i = 0; i < len; i++) {
Serial.print((char)buffer[i]);
}
Serial.print("]\r\n");
}

delay(5000);
}

[/c]

実行した結果はシリアルモニタに出て来ます。
スクリーンショット 2015-08-29 5.54.20

[c]
char *hello = "GET / HTTP/1.0\r\n User-Agent: arduino\r\n\r\n";
[/c]

がhttpサーバへのリクエストになります。最後の改行が2回ありますが、2回目の改行でリクエストが実行されます。User-Agentにarduinoという設定をしていますが、User-Agentが無いとBad requestとなって受け付けてもらえません。User-Agentの名前はなんでも良いみたいです。
ターミナルで試してみると分かりやすいかと思います。

スクリーンショット 2015-08-29 6.14.09