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に入れた。

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/ を参考にさせていただいた。なお、コマンドはすべて大文字で送信する必要がある。

ファームウェアバージョン取得

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

(追記)

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

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

リセットコマンド(AT+RST)

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

wifi接続情報およびIPアドレス

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)に接続している。

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

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

きょうのまとめ

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

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