ESP8266 WROOM-02でArduinoにwifi機能を追加

ステッピングモーターやサーボを使った電動雲台をスマホやPCからwifi経由で制御するため、Arduinoにwifi機能を追加しようとしているが、第一歩としてwifiモジュールの追加と簡単なテストを行った。

AE-WROOM-02

秋月電子のAE-WROOM-02 DIP化キットを通販で取り寄せてwifiモジュールとして使うことにした。この製品は、ESP8266というwifiモジュールを、2.54mmピッチの18ピンICソケットに載せるための基板に実装したもので、左右9ピンずつのピンヘッダをハンダ付けすれば、写真のような小さなブレッドボード上で回路を組める。

ESP-WROOM-02

構成

ブレッドボードの上は、以下のような回路になっている(電源確認用のLEDは省略)。

ESP-WROOM-02

WROOM-02の電源電圧は3.3Vであり、データシートによると通信時に170mA流れることもあるとか。今使っているArduino ADKも3.3Vを供給可能だが、流していいのは最大50mAまでということなので、ブレッドボード上に三端子レギュレータ(TA48033S)を置いて3.3Vを生成することにした。
三端子レギュレータを使う際には、少なくとも[入力側と出力側の電位差×負荷電流分]の熱が発生するから、発熱を気にするならば [出力電圧 + 三端子の最小入出力間電圧差]に近い入力電圧を選択した方がよい。今回は、Arduino ADKの+5Vピンから得ることにした。仕様によれば、+5Vピンは750mAまでの負荷をぶら下げてよいということなので余裕だろう。

Arduinoのロジックと接続する必要があるのは、11番ピンのRxD(Arduinoからの受信)と12番ピンのTxD(Arduinoへの送信) の2本だけ。これらをそれぞれ、Arduino ADKの18番ピン(Tx1)と19番ピン(Rx1)に接続する。ただし、Arduinoの出力(Tx1)はTTLレベル(0~5V)であるため、WROOM-02のRxDへの接続では3.3kΩと2.2kΩの抵抗を使った分圧回路で約3.3Vレベルに落としている。
EN(#2, Enable)やRST(#15, Reset)は10kΩでプルアップしておき6番ピンのGPIO15をGNDに接続しておく。 これによって電源オンでWROOM-02の内蔵フラッシュから制御プログラムが起動され、シリアル通信が可能となる(はず)。

ESP-WROOM-02Arduino ADKと接続するとこんな具合である。最終的には野外で使う予定なので、Arduinoの二階にボードを載せて必要な回路をしっかりハンダ付けしてしまう予定だが、WROOM-02については18ピンか20ピンのICソケットに載せればいいかな、と思っている。

スケッチ

PC側のArduino IDEのシリアルモニタを用いてWROOM-02の動作を確認するため、以下のようなスケッチを描いてArduino ADKに入れた。

void setup() {
  Serial.begin(115200);
  Serial.print("\r\nStart\r\n");
  Serial1.begin(115200);
}

void loop() {
  if (Serial1.available() > 0) {
    byte c = Serial1.read(); 
    Serial.write(c);
  }
  if (Serial.available() > 0) {
    byte c = Serial.read(); 
    Serial1.write(c);
  }
}

ArduinoはUSBでPCに接続しており、通信はSerialで制御する。WROOM-02との接続はSerial1で制御する。おのおののシリアルポートから文字を受信したら、それをもう一方に送信する、というだけのコードである。

シリアルモニタ1シリアルモニタを開いて、上部の入力欄に AT と入力して送信をクリックしたところ。エコーバックの改行のあと、OK と帰ってくる。行末文字としては、CRおよびLF を選択しておく必要がある。

ATコマンド

WROOM-02を使ってwifi通信を行う際には、ATコマンドによって設定やコマンドを与えることになる。TTYエミュレータとヘイズATコマンドでパソコン通信していた時代を思い出してしまう。WROOM-02のATコマンドについては、http://ja.docs.jumpwire.io/ESP8266Reference/ATCommands/ を参考にさせていただいた。なお、コマンドはすべて大文字で送信する必要がある。

ファームウェアバージョン取得
AT+GMR 
AT version:0.40.0.0(Aug 8 2015 14:45:58)
SDK version:1.3.0
compile time:Aug 11 2015 17:02:18
OK

上記のサイトに記載されている手順により、wifiアクセスポイントへの接続はすんなり成功したのだが(詳細は省略)、その後リセットコマンド(AT+RST)を発行したり、WROOM-02に電源を投入するたびごとに、自動的にアクセスポイントに接続するようになってしまった。SSIDもパスワードも覚えてしまうんですね。全貌が把握できていないので、ちょっと気持ち悪い。

(追記)

この記事を載せた翌日、今年の10月にメーカーが出していた、ESP8266 AT Instruction Set Version 1.4 を入手したところ、

AT+AUTOCONN=0

を与えることで、電源投入時の自動接続は禁止できた。ただ、既にうちのWROOM-02からの拡張も進んでいるようで、微妙に内容が違っていたりする(APモード時のssid hiddenとか)。

リセットコマンド(AT+RST)
AT+RST
OK
WIFI DISCONNECT
ets Jan 8 2013,rst cause:1, boot mode:(3,7)
load 0x40100000, len 1396, room 16 
tail 4
chksum 0x89
load 0x3ffe8000, len 776, room 4 
tail 4
chksum 0xe8
load 0x3ffe8308, len 540, room 4 
tail 8
chksum 0xc0
csum 0xc0
2nd boot version : 1.4(b1)
SPI Speed : 40MHz
SPI Mode : QIO
SPI Flash Size & Map: 8Mbit(512KB+512KB)
jump to run user1 @ 1000
rl祉s�
ready
WIFI CONNECTED
WIFI GOT IP

wifiの切断、内部情報の表示のあと、再度wifi接続してIPアドレスをもらっている。

wifi接続情報およびIPアドレス
AT+CIFSR 
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"1a:fe:34:ef:0e:86"
+CIFSR:STAIP,"192.168.11.116"
+CIFSR:STAMAC,"18:fe:34:ef:0e:86"
OK

STAIPがステーション側(WROOM-02側)の現在のIPアドレスだろう。接続中のwifiルーターは、”192.168.11.0/24″というネットワークのアドレスを提供するようにしており”192.168.11.116″をもらっている。STAMACとはステーション側(WROOM-02側)のMACアドレスと思われる。前半24ビット(18:fe:34)から、上海の Espressif Inc. がベンダーだということが分かる。
APIP、APMACは、いずれもローカルアドレスなので、アクセスポイントモード時の自局用なのだろう。

TCP接続とHTTP GETの実行

AT+CIPSTARTというコマンドにより、TCPまたはUDPにより、指定のホストに指定のポート番号で接続できる。以下の例では、このブログのhttp(80)に接続している。

AT+CIPSTART="TCP","okiraku-camera.tokyo",80 
CONNECT
OK
AT+CIPSEND=18
OK
> 
Recv 18 bytes
SEND OK
+IPD,335:HTTP/1.1 200 OK
Date: Sun, 25 Oct 2015 09:17:18 GMT
Server: Apache
Last-Modified: Sun, 30 Nov 2014 11:55:05 GMT
ETag: "26801a1-52-509122a29d840"
Accept-Ranges: bytes
Content-Length: 82
Connection: close
Content-Type: text/html; charset=UTF-8

<HTML>
<HEAD>
<meta http-equiv="refresh" content="0; url=/blog">
</HEAD>
</HTML>
CLOSED

接続成功を表すCONNECT、OKの次のAT+CIPSEND=18は、「これから送る18バイトの文字列を接続先にsendしてくれ」というコマンド。このコマンドが受け付けられると、”>” というプロンプトが出てくる。
エコーバックされていないが、ここでは、
  GET / HTTP/1.0\r\n\r\n
という18バイトを送信している(\r\nは、復帰コードと改行コードを示している)。

Recv 18 bytes
SEND OK
+IPD,335:

はWROOM-02からの応答であり、”>”プロンプトに対して受け取った文字列のバイト数、それを接続先に送信できたこと、接続先から335バイトの文字列(httpレスポンス)を得たことを示している。
そして、受信したhttpレスポンスを表示してくれる。

きょうのまとめ

今のところ、wifiモジュールは好調に動作している。ブレッドボード上の三端子レギュレータの発熱もほとんどないので、ヒートシンクは省略してもよさそう。WROOM-02自体がほんのり温もっているが、気になるほどではない。

あとはWROOM-02をアクセスポイントとして動作させ、Arduino上で簡易httpdを動作させればよいだろう。例えば、
  GET /cmd?roll=45&pitch=90
みたいなリクエストで雲台がジージーッと動けばよい。ぼちぼちやっていきます。