格安wifiモジュールESP-WROOM-02(ESP8266)をArduinoから操作して通信してみました。
今回はとりあえず動作確認ということでArduinoからSoftwareSerialで弄ってますが、最終的には単品で動かしたいなーと考え中(電源どうしよう)
※後で配線の画像足します。
※スケッチちゃんと確認してないや……
ESP-WROOM-02とは
Arduinoっぽいマイコンが搭載されたwifiボードです。
しかもお値段1000円程度と破格です。
ただ、電気とか物理とかからっきしな身としてはSwitchScienceにピンソケットにUSB⇆シリアル変換を合体させたESPr Developerというのがありますので、そっちのが楽だったなーと思いました。
用意するもの
- ESP-WROOM-02
- Arduino uno
- ブレッドボード
- ピンヘッダ
- 1kΩ抵抗
- その他配線用の線達
- ハンダセット
ESP-WROOM-02の元々は端子の幅が狭くブレッドボードに刺さりません。
上のリンクのはブレッドボード用に幅を広げた基盤に乗せた版なのでこれを使いました。
ただし、これはピンヘッダもピンソケットもついてないのでそのままだと配線できず、自分でなんとかするしかありません。
足を生やす
まずはピンヘッダをハンダ付けします。
以上。
線をつなぐ
さて、Arduino、ESP-WROOM-02、ブレッドボードをつなぎます。
配線時の注意として、上で挙げたESP-WROOM-02のフル版は普通のブレッドボードの幅一杯使うので、ESPの下にワイヤーを先に刺しておいてからESPを乗せるようにします。
電源
まずは電源系です。
- Arduinoの3.3VをESPの3v3に
- Arduinoの3.3VをESPのENに
- Arduinoの3.3Vを1kΩ挟んでESPのRSTに
- ArduinoのGNDをESPのGNDに
注意点として、どうもArduinoの3.3Vでは電流が足りてないようで、無理をさせると不安定になるようです。
私がやったときは特に問題ありませんでしたが長時間稼働させると変わるのかもしれません。
以上です。
シリアル転送
次にシリアル転送用の配線です。
- Arduinoの適当なデジタルピンをESPのTXDに
- Arduinoの適当なデジタルピンをESPのRXDに
以上です。
ジャンパ
一番よくわからないジャンパの設定です。
ESPは一部の端子の電気のとおり具合で動作モードとファーム書き換えモードが切り替わるようになっているようです。
Arduinoから操作するときは動作モードで起動させます。
- Arduinoの3.3Vを1kΩを挟んでESPのIO02に (実際の配線見ると10kに見える……)
- Arduinoの3.3Vを1kΩを挟んでESPのIO00に
- ArduinoのGNDをESPのIO015に
※書き込みモードはIO00をGNDにつなぐみたいです。
適当に書いた配線は以下のとおりです。ESPはブレッドボードを覆うように刺して、
その下にジャンパ線を刺していきます。
↓ESPが邪魔なのでどけた版
※画像の抵抗では線が220Ωだけど実際は1kΩを刺しています。
ESP-WROOM-02は右上に3v3が来るように刺してください。ブレッドボード全体を覆うように刺さります。
FritzingにはESP-WROOM-02と1kΩがプリインでなかったのでそれっぽいのを代用しています……
シリアル転送速度を変更する
ArduinoからESPにシリアル通信する際に速度を少し落とした方がいいようです。
以下のスケッチをArudinoに転送してESPの速度を変更します。
#include <SoftwareSerial.h> const int kWifiRXPin = 4; const int kWifiTXPin = 5; SoftwareSerial wifi(kWifiRXPin, kWifiTXPin); void setup() { Serial.begin(115200); while (!Serial) { ; } Serial.println("startup"); wifi.begin(115200); Serial.write("AT+UART_DEF=9600,8,1,0,0\n"); } void loop() { if (wifi.available()) { Serial.write(wifi.read()); } }
PINの番号はそれぞれRXDとTXDにつないだデジタルピンの番号を指定します。
ATコマンドをシリアルに流し込んでESPの動作を変更しています。
ESP用ライブラリを設定
ソフトウェアシリアルを支援するライブラリがありますので、それを使います。
適当にダウンロードしたら、ESP8266.hと.cppをスケッチ → ファイルを追加…から選択します。
アクセスポイントとして稼働させる
#include <ESP8266.h> #include <SoftwareSerial.h> const char* kSSID = "なにかSSID"; const char* kPassword = "なにかパスワード"; const int kWifiRXPin = 4; // 接続したピンの番号 const int kWifiTXPin = 5; // 接続したピンの番号 SoftwareSerial wifiSerial(kWifiRXPin, kWifiTXPin); ESP8266 wifi(wifiSerial); void setup() { Serial.println("begin - setup"); // startup arduino Serial.begin(9600); while (!Serial) { ; } // setup wifi if (wifi.setOprToSoftAP()) { Serial.println("to soft ap ok"); } else { Serial.println("to soft ap error"); } if (wifi.setSoftAPParam(kSSID, kPassword, 7, 4)) { Serial.println("connect success"); } else { Serial.println("connect error"); } delay(100); if (wifi.enableMUX()) { Serial.println("enable mux success"); } else { Serial.println("enable mux error"); } if (wifi.startTCPServer(8080)) { Serial.println("start server success"); } else { Serial.println("start server error"); } Serial.println(wifi.getLocalIP()); Serial.println(wifi.getIPStatus()); Serial.println("end - setup"); } void recv() { uint8_t id = 0xff; uint8_t buffer[128]; int size = wifi.recv(&id, buffer, 128); if (size > 0) { Serial.println("OK!"); } if (id <= 4) { wifi.releaseTCP(id); } } void loop() { recv(); }
setOprToSoftAP
これによってソフトウェアアクセスポイントモードに切り替えます。
この状態は他の端末から接続されるのを待ちます。ESPから別のアクセスポイントへ接続することは出来ません。
setSoftAPParam
APモードの設定ですSSIDとかパスワードとかを設定します。
3つめと4つめは、wifiに使用するチャンネルと暗号化の方式ですがこのままで問題ないです。
enableMUX
複数同時接続の設定です。
APモードなので有効化しています。
startTCPServer
ポートを指定してTCPによる通信を受け付けるようにしています。
getLocalIP
この端末のIPアドレスが取得できるのでここ宛に通信する事になります。
recv
mux有効の場合は第一引数に接続者のIDが設定されます。0~4のどれかのようです。(つまり6端末以上は同時接続できない。)
第二引数にクライアントから送られたデータが格納されます。
終わったらreleaseTCPしてリソースを破棄します。
実行
実行すると指定したSSIDがスマホなんかのwifiの一覧に出現すると思います。
それに接続し、IPアドレスをブラウザで開くとシリアルにOKとでる。……はず。
注意点
DHCPが無いので、wifiをつなごうとしても上手くいかないことがあります。
その際はESPのIPアドレスを参考に、適当なIPアドレスやらを設定してください。
コメント
> ATコマンドをシリアルに流し込んでESPの動作を変更しています。
表示しているだけのように見えますが…
今はもう遙か昔の事なのであまり記憶にありませんが、ばーと一通り動かしたあとにあまり確認せずにココに書いてたような気がします。
おそらく試行錯誤途中の奴を貼り付けてるのかもしれません。
wifi.にして動けば良いなーという感じではあります。