トラ技にESP32の特集があったので、それを参考にしてWiFiコントロール・カーを製作してみました。
その忘備録です。
SimpleWiFiServerを利用して、WiFiコントロール・カーを製作しました。
なお、今回使用したESP32は、アリババで購入したESP32-DEVKIT ESP-WROOM-32開発ボード($7で800円前後)を
使用しました。
・Arduino IDEを取得。
・Arduino IDEでESP-WROOM-32を使用するためのライブラリをインストール。
・サンプルスケッチ「SimpleWiFiServer」を書き換える。
・ESP32-DevKitとモーター駆動回路
・Webを通してWiFiコントロール・カーを前後左右に動かす。
以下のような手持ちの部品を使用して作りました。
・ESP32-DEVKIT ESP-WROOM-32開発ボード
・DCモータードライバーMP4212を2個
・ピンソケット2X19 PIN(ESP32-DEVKIT挿入用)
・ピンソケット2X10 PIN(MP4212用)
・基板1枚
・ちびモーターギア+プーリー、タイヤセット 2セット
「ちっちゃいものくらぶ」 tiisai.dip.jp/?page_id=449 で
販売されているもの。
・モバイルバッテリー
・USB電源ケーブル
・なんでもキャスター1個
・スペーサー4個
・台木
左図は、WiFiコントロール・カーを遠隔操作するためのWeb画面です。
各ボタンをクリックすることにより、Wi-Fiを通してWiFiコントロール・カーを動かします。
1.次の画面が表示されます。
2.画面上のタブ「SOFTWARE」をクリックすると、次の「Download the Arduino IDE」画面が
表示されますので、右上の「Windows installer」をクリックします。
3.次の「Contribute to the Arduino Software」画面が表示されますので、画面下の
「JUST DOWNLOAD」をクリックしてダウンロードします。
4.2017/11月現在で、「arduino-1.8.5-windows.exe」がダウンロードされます。
5.この「arduino-1.8.5-windows.exe」をダブルクリックして、「Arduino IDE」を
インストールします。
6.使用許諾の画面では、「I Agree」をクリック。
7.次のインストール・オプション画面では、「Next」をクリックします。
8.インストール先の画面では、インストール先を「C:\Arduino」に変更します。
(Windowsのユーザ・アクセス制御機能の影響を受けないようにするため)
9.「Install」をクリックします。
Arduino IDEにはESP-WROOM-32を開発するためのライブラリは入っていないので、 自分でダウンロードしてArduino IDEに追加インストールします。
1.GitHub のWebページを開き、
画面右の「Clone or download」をクリックし、「Download ZIP」をクリックしてZIPファイルを
ダウンロードします。
2.「Arduino core for the ESP32」は、Arduino IDEの機能に対応していないので手動で
インストールします。
(1) C:\Arduino\hardware フォルダにespressifフォルダを作成。
(2) espressifフォルダの中に、esp32フォルダを作成。
(3) esp32フォルダの中に、「Arduino core for the ESP32」のZIPファイルを解凍。
(4) 解凍したファイルの中の「tools」フォルダを開き、その中の「get.exe」を管理者権限で実行。
(5) コマンドプロンプトが表示されて実行されるので、終了するまで待ってコマンドプロンプトをEnd。
3.Arduino IDEを起動し、ボードを「ESP32 Dev Module」を選択します。
(1)「ツール」、「ボード」、「ESP32 Dev Module」の順で選択。
4.シリアルポートを選択
(1) ESP32-DevKitを接続していない状態で、「ツール」?「シリアルポート」で表示されている
ポートを確認します
(2) ESP32-DevKitを接続し、同様に「シリアルポート」を確認すると新たに増えた番号が
ESP32-DevKitのシリアルポートなので選択します。
1.「ファイル」⇒「スケッチ例」⇒「ESP32 Dev Module用のスケッチ例 WiFi」⇒「SimpleWiFiServer」
の順にクリックするとサンプルプログラム「SimpleWiFiServer」が開きます。
2.次のように「SimpleWiFiServer」を書き換えます。
なお、const char* ssid = "yokohama";の" "の中には、使用しているWiFiルーターのSSIDを入れ、
const char* password = "12345678";の" "の中には、使用しているWiFiルーターのパスワードを入れます。
/* WiFi-Control-Car */ #include <WiFi.h> const char* ssid = "yokohama"; //アクセスポイントのSSID const char* password = "12345678"; //アクセスポイントのパスワード const char html[] = "<!DOCTYPE html><html lang='ja'><head><meta charset='UTF-8'>\ <style>input {margin:8px;width:80px;}\ div {font-size:16pt;color:red;text-align:center;width:400px;border:groove 40px orange;}</style>\ <title>WiFi_Car Controller</title></head>\ <body><div><p>Tank Controller</p>\ <form method='get'>\ <input type='submit' name='le' value='左' />\ <input type='submit' name='fo' value='前' />\ <input type='submit' name='ri' value='右' /><br>\ <input type='submit' name='st' value='停止' /><br>\ <input type='submit' name='bl' value='後左' />\ <input type='submit' name='ba' value='後ろ' />\ <input type='submit' name='br' value='後右' /><br><br>\ </form></div></body></html>"; void stop(){ digitalWrite(0, LOW); digitalWrite(2, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); } WiFiServer server(80); void setup() { Serial.begin(115200); pinMode(0, OUTPUT); pinMode(2, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); delay(10); Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected."); Serial.println("IP address: "); Serial.println(WiFi.localIP()); server.begin(); } void loop(){ WiFiClient client = server.available(); if (client) { Serial.println("New Client."); String currentLine = ""; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); if (c == '\n') { if (currentLine.length() == 0) { client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println(); client.print(html); client.println(); break; } else { currentLine = ""; } } else if (c != '\r') { currentLine += c; } if (currentLine.endsWith("GET /?fo")) { stop(); digitalWrite(0, HIGH); digitalWrite(4, HIGH); } if (currentLine.endsWith("GET /?le")) { stop(); digitalWrite(0, HIGH); } if (currentLine.endsWith("GET /?ri")) { stop(); digitalWrite(4, HIGH); } if (currentLine.endsWith("GET /?ba")) { stop(); digitalWrite(2, HIGH); digitalWrite(5, HIGH); } if (currentLine.endsWith("GET /?bl")) { stop(); digitalWrite(2, HIGH); } if (currentLine.endsWith("GET /?br")) { stop(); digitalWrite(5, HIGH); } if (currentLine.endsWith("GET /?st")) { stop(); } } } client.stop(); Serial.println("Client Disconnected."); } }
1.ESP32-DevKitをUSBでパソコンに接続します。
*USBドライバーはパソコンに入っているものとします。
*ESP32-DevKitをパソコンに接続する際、USBハブに接続しないで直接パソコンのUSBに接続した方が
無難だと思います。
WiFiに接続する際に500~800mAの電流が流れるようなので、その方が良いかと思います。
2.上記プログラムをESP32に書き込みます。「ツール」をクリックして、
(1)ボードは、「ESP32 Dev Module」を選択。
(2)シリアルポートを選択。
(3)ツールバーの「→」をクリックするとコンパイルと書き込みを一度に行います。
3.不具合について
(1)コンパイラ中に、下段のメッセージ欄に「libraries/BLEに無効なライブラリ」と表示されると思います。
その原因と対処法が次のWebサイトで丁寧に説明されていますので確認してください。
Arduino core for the ESP32 の
インストール方法
(2)プログラムの書込み中に、「複数のライブラリがあります」とエラーが表示されます。
原因は、メニューの「スケッチ」⇒「ライブラリーをインクルード」をクリックすると、ライブラリーの一覧
が表示され、その下の方に「WiFi」が2つ表示されています。
Arduino IDEに初めから入っているWiFiライブラリーとESP32のメーカーEspressif社提供のWiFiライブラリーが
同じ名前「wifi」で表示されています。
今回は、Espressif社提供のWiFiライブラリーを使いますので、Arduino IDEに初めから入っているWiFiライブラリーを
次の手順で削除しました。
①「C:\Arduino\libraries」にある「WiFi」ホルダーを他のディレクトリに移動しました。(後で使用するかも
しれないので残しておく)
②「C:\Arduino\hardware\espressif\esp32\libraries」にある「WiFi」ホルダーはそのままです。
③ それぞれのライブラリーに入っているヘッダーファイル「WiFi.h」は互換性が無いようです。
4.画面右にあるツールバーの「虫眼鏡」をクリックするとシリアルモニターが開き、正しくWiFi
接続されていると、IPアドレスが次のように表示されます。記録しておきます。
シリアルモニターの表示内容
Connecting to <yokohama> ・・・・・・ WiFi connected. IP address: 192.168.0.5
1.モーターは、ちびモーターを使用しました。
*ちびモーターの駆動には30mA程の電流が流れるようです。
2.モータードライバーは、MP4212を使用しました。(現在販売中止)
3.左右のモーターは、基台に逆に取り付けています。
1.WiFiコントロール・カーの電源を入れます。
2.ブラウザーに、記録したIPアドレスを入力します。
3.次のWebコントロール画面が表示されます。
4.各ボタンをクリックすると、その通りにWiFiコントロールカーが動きます。