kur.jp

バイオリンと自転車をこよなく愛するkurのチラシの裏。たまには技術的なことを書いたりするかも知れません。

格安WIFIモジュールESP8266をArduino Unoで使う

Arduinoで何かを作ろうとする時にデータをインターネットから取得したりだとか、またはインターネットに対して送信したりだとか、そういうことがしたくなる時がある。

こういった時に選択肢はいくつかある。

  1. Arduino用のWiFIシールドを用意する
  2. Arduino YUN等の、WiFI標準搭載のArduinoを使用する
  3. シリアル接続のWiFIモジュールを使用する。

1に関しては、下記のページにあるように純正品が存在するのだけれど、Amazonやスイッチサイエンスでも2016年6月10日現在は取り扱っていないようだし、少なくとも日本国内では入手困難にであるように思われます。

Arduino - ArduinoWiFiShield

Arduion YUNは日本でも容易に入手可能ではあるものの1万円程度と、結構な値段がしてしまう。

Arduino YÚN

Arduino YÚN


そこで、有力な選択肢となるのが、ESP8266である。Amazonだと一個500円程度かな。

もし急がないようであれば、Aliexpressで送料込で1個2ドル弱からある。

www.aliexpress.com

この値段でArduinoをWiFi対応に出来るのであるから、非常にコストパフォーマンスが高いと言えるのだが、実際に使えるようになるまで色々と詰まってしまったので、備忘録代わりにここに手順を書き残して置く。

1. ライブラリのダウンロードとインストールし、コードの修正

github.com

上記からArduinoからESP8266を使用するためのライブラリを取得し、ライブラリフォルダに展開する。

なお、注意点として、Arduino UNOの場合はソフトウェアシリアルを使用する事になるので、27行目にある下記の1行をアンコメントしておくこと。

#define ESP8266_USE_SOFTWARE_SERIAL

2. ESP8266を Arduinoに接続する(RX、TXをピン0、1に)

接続する必要があるのは合計5本。Arduino UNOは5V駆動、EPS8266は3.3V駆動なので、RX/TXに分圧抵抗等を入れている例もネットにはある。本当は入れたほうがいいのだけれど、私は入れていない。心配な方はどうぞ。

www.mauroalfieri.it

2. ESP8266のbaud rateを9600bpsに設定する

Arduinoにはシリアル端子が付いているのだけれど、この端子はデバッグ時に使用したいので無線モジュールとはソフトウェア的にシリアル通信をさせたい。しかしながら、ESP8266のデフォルトボーレートは115200bpsで、Arduino UNOのソフトウェアシリアルは115200bpsに対応出来ない。厳密には設定自体は出来るのだけれど、ビットエラーが多く使いものにならない。そこで、ボーレートを9600bpsまで落として使用する事にする。

Arduinoにからのスケッチをアップロードして、シリアルコンソールを出し、下記のコマンドを打てば良い。

AT+UART_DEF=9600,8,1,0,0

3. ArduinoとESP8266の接続を変更する

RX、TXをピン12、11などに接続を変更する。これはソフトウェアシリアルを使用するためであるけれど、特にどこのピンでも問題無いように思われる。

4. Arduinoでコードを書く

ほぼライブラリのexampleからのコピペなのだけれど、下記のようなコードを書く。SSIDとパスワードは環境に合わせて。
github.com

#include "ESP8266.h"
#define SSID "XXXX"
#define PASSWORD "XXXX"

SoftwareSerial mySerial(12, 11); /* RX:D12, TX:D11 */
ESP8266 wifi(mySerial);
void setup(void)
{
Serial.begin(9600);
Serial.print("setup begin\r\n");

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


if (wifi.setOprToStation()) {
Serial.print("to station ok\r\n");
} else {
Serial.print("to station 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");
}

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

void loop(void)
{
}

これでArduinoあらWiFIが使用出来るようになる。書いて見ると簡単なのだけれど、ボーレート設定の所に気が付かず、半日以上かかってしまった。どうやら以前出荷されたESP8266はデフォルトボーレートが9600bpsになっていたようで、繋げばすぐに使える状態だったようです。最近のもの、と言ってもいつごろからかはわからないのだけれど、デフォルトが115200bpsになっているようで、Arduino UNOからは使用しにくくなってしまったという事らしい。