ステッピングモーターやサーボを使った電動雲台をスマホやPCからwifi経由で制御するため、Arduinoにwifi機能を追加しようとしているが、第一歩としてwifiモジュールの追加と簡単なテストを行った。
AE-WROOM-02
秋月電子のAE-WROOM-02 DIP化キットを通販で取り寄せてwifiモジュールとして使うことにした。この製品は、ESP8266というwifiモジュールを、2.54mmピッチの18ピンICソケットに載せるための基板に実装したもので、左右9ピンずつのピンヘッダをハンダ付けすれば、写真のような小さなブレッドボード上で回路を組める。
構成
ブレッドボードの上は、以下のような回路になっている(電源確認用のLEDは省略)。
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の内蔵フラッシュから制御プログラムが起動され、シリアル通信が可能となる(はず)。
Arduino ADKと接続するとこんな具合である。最終的には野外で使う予定なので、Arduinoの二階にボードを載せて必要な回路をしっかりハンダ付けしてしまう予定だが、WROOM-02については18ピンか20ピンのICソケットに載せればいいかな、と思っている。
スケッチ
PC側のArduino IDEのシリアルモニタを用いてWROOM-02の動作を確認するため、以下のようなスケッチを描いてArduino ADKに入れた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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で制御する。おのおののシリアルポートから文字を受信したら、それをもう一方に送信する、というだけのコードである。
シリアルモニタを開いて、上部の入力欄に AT と入力して送信をクリックしたところ。エコーバックの改行のあと、OK と帰ってくる。行末文字としては、CRおよびLF を選択しておく必要がある。
ATコマンド
WROOM-02を使ってwifi通信を行う際には、ATコマンドによって設定やコマンドを与えることになる。TTYエミュレータとヘイズATコマンドでパソコン通信していた時代を思い出してしまう。WROOM-02のATコマンドについては、http://ja.docs.jumpwire.io/ESP8266Reference/ATCommands/ を参考にさせていただいた。なお、コマンドはすべて大文字で送信する必要がある。
ファームウェアバージョン取得
1 2 3 4 5 |
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 を入手したところ、
1 |
AT+AUTOCONN=0 |
を与えることで、電源投入時の自動接続は禁止できた。ただ、既にうちのWROOM-02からの拡張も進んでいるようで、微妙に内容が違っていたりする(APモード時のssid hiddenとか)。
リセットコマンド(AT+RST)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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アドレス
1 2 3 4 5 6 |
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)に接続している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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は、復帰コードと改行コードを示している)。
1 2 3 |
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
みたいなリクエストで雲台がジージーッと動けばよい。ぼちぼちやっていきます。