ESPr Developer をスマホからWiFi経由で操作する方法を試しました。
ESPr DeveloperをWebサーバとして使用するのですが、そこで表示するHTMLファイルはESPr Developer内のFLASHメモリに格納します。
FLASHメモリへのデータの書き込みにはSPIFFSというものを用いるため、Arduino IDE(開発環境)にSPIFFSをインストールしました。
インストール後、スケッチと同じ場所に「data」フォルダを作り、この下にHTMLファイルを置いた状態で「ツール」→「ESP8266 Sketch Data Upload」を実行すると、HTMLファイルをFLASHメモリにアップロードすることができます。
動作確認のためにLEDを光らせるので、ESPr Developerの12番, 13番, 5番, 4番出力ピンとグランドの間に、それぞれ、LEDと抵抗(330Ω)を直列に接続します。
スケッチとHTMLファイルは、他の方のブログに載っていたものを、ほとんどそのまま使用させていただきました。
スケッチは以下のとおりです。
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <FS.h> const char *ssid = "robot02"; const char *password = "robot02"; const char *path_root = "/index.html"; uint8_t buf[16384]; const int FLPin = 12; const int BLPin = 13; const int FRPin = 5; const int BRPin = 4; ESP8266WebServer server(80); void handleRoot() { server.send(200, "text/html", (char *)buf); } void ForwardLeft() { digitalWrite(FLPin, HIGH); digitalWrite(FRPin, LOW); digitalWrite(BLPin, LOW); digitalWrite(BRPin, LOW); server.send(200, "text/html", "FL"); } void Forward() { digitalWrite(FLPin, HIGH); digitalWrite(FRPin, HIGH); digitalWrite(BLPin, LOW); digitalWrite(BRPin, LOW); server.send(200, "text/html", "FF"); } void ForwardRight() { digitalWrite(FLPin, LOW); digitalWrite(FRPin, HIGH); digitalWrite(BLPin, LOW); digitalWrite(BRPin, LOW); server.send(200, "text/html", "FR"); } void Stop() { digitalWrite(FLPin, HIGH); digitalWrite(FRPin, HIGH); digitalWrite(BLPin, HIGH); digitalWrite(BRPin, HIGH); server.send(200, "text/html", "SS"); } void BackLeft() { digitalWrite(FLPin, LOW); digitalWrite(FRPin, LOW); digitalWrite(BLPin, HIGH); digitalWrite(BRPin, LOW); server.send(200, "text/html", "BL"); } void Back() { digitalWrite(FLPin, LOW); digitalWrite(FRPin, LOW); digitalWrite(BLPin, HIGH); digitalWrite(BRPin, HIGH); server.send(200, "text/html", "BB"); } void BackRight() { digitalWrite(FLPin, LOW); digitalWrite(FRPin, LOW); digitalWrite(BLPin, LOW); digitalWrite(BRPin, HIGH); server.send(200, "text/html", "BR"); } void setup() { delay(1000); pinMode(FLPin, OUTPUT); pinMode(FRPin, OUTPUT); pinMode(BLPin, OUTPUT); pinMode(BRPin, OUTPUT); SPIFFS.begin(); File htmlFile = SPIFFS.open(path_root, "r"); size_t size = htmlFile.size(); htmlFile.read(buf, size); htmlFile.close(); WiFi.softAP(ssid, password); IPAddress myIP = WiFi.softAPIP(); delay(500); server.on("/", handleRoot); server.on("/FL/", ForwardLeft); server.on("/FF/", Forward); server.on("/FR/", ForwardRight); server.on("/SS/", Stop); server.on("/BL/", BackLeft); server.on("/BB/", Back); server.on("/BR/", BackRight); server.begin(); } void loop() { server.handleClient(); }
HTMLファイル(index.html)は以下のとおりです。
<!DOCTYPE HTML> <html lang="ja"> <head> <meta charset="utf-8"> <title>Robot02 WiFi Controller</title> <script> function send(url){ var xhr = new XMLHttpRequest(); xhr.open("GET", url, true); xhr.send(); } </script> <style type="text/css"> <!-- body { font-family: sans-serif; font-size: 50px; font-weight: bold; } .stebtn { font-size: 50px; font-weight: bold; width: 250px; height: 200px; } --> </style> </head> <body> <table width="800" border="0" align="center" cellpadding="2"> <tr> <td colspan="3" align="center">Robot02 WiFi Controller</td> </tr> <tr> <td align="center"><input type="button" class="stebtn" onClick="send('/FL/')" value="←"></td> <td align="center"><input type="button" class="stebtn" onClick="send('/FF/')" value="↑"></td> <td align="center"><input type="button" class="stebtn" onClick="send('/FR/')" value="→"></td> </tr> <tr> <td></td> <td align="center"><input type="button" class="stebtn" onClick="send('/SS/')" value="ー"></td> <td></td> </tr> <tr> <td align="center"><input type="button" class="stebtn" onClick="send('/BL/')" value="←"></td> <td align="center"><input type="button" class="stebtn" onClick="send('/BB/')" value="↓"></td> <td align="center"><input type="button" class="stebtn" onClick="send('/BR/')" value="→"></td> </tr> </table> </body> </html>
スマホのWiFi設定メニューで、アクセスポイントとして「robot02」を選択した後、パスワートに「robot02」を入力します。
その後、スマホのWebブラウザを起動し、URL欄に「192.168.4.1」を入力します。
ボタンがいくつか並んだWebページが表示されますので、そのボタンを押すと、対応するLEDが光りました。
これを、子供が昔遊んでいたフェラーリのラジコンに組み込んで動かそうとしたのですが、子供に提供を拒否されたので実現できませんでした。どうやって遊ぶかはおいおい考えることにします。