ラジコンカーを作成する(無線LAN/サーバー)
今回はスマートフォンで操作する事ができる「ラジコンカー」を作成しました。マイコンボードは2015年頃から流行したWifi対応の「ESP-WROOM-02」(¥650)を使用しています。
ラジコンカーの機能は「前進、後進、左旋回、右旋回」の4つです。
Arduinoのように使用できる「ESP-WROOM-02」が、はじめての方は先に次の関連記事をご覧ください。
データを送受信をするIoTデバイスの作り方
ESP-WROOM-02をWebサーバーにする
スマホでLEDを点灯させる (Webサーバー版)
モーターを操作するモータードライバーの扱い方は次の記事です。
写真
[横]

[表]

[裏]

[後]

※裏にある白い「ミニブレッドボード」は未使用です。
試作品のブレッドボードですので配線やマスキングテープなどで粗雑です。また、1つのブレッドボードが無駄に長いのは、それしか余っていなかった為です。
システムの概要
ESP-WROOM-02のWebサーバーを起動して、スマートフォンでそのURLにアクセスします。スマホから直にマイコンボード(ESP-WROOM-02)にアクセスできますので、リアルタイムで操作を行う事が可能です。

※IPアドレスは各自の環境に合わせてください。
※スマホの回線はWebサーバーと同じ環境にして下さい。
使用部品・材料
総額で約3000円です。(ESP-WROOM-02本体の値段を除く)
部品/材料 | 値段 | 備考 |
---|---|---|
ブレッドボード 2個 | ¥270 | 秋月電子の通販コード(P-00315) |
モータードライバ(TA7291P) 2個セット | ¥150 | 秋月電子の通販コード(I-02001) |
カーボン抵抗器 | 数円 | 10kΩ(3個)を使用 |
前輪用のキャスター | ¥100 | ホームセンターで白いキャスターを購入。 実際に試してはいませんが、秋月電子だとK-10372(300円)も検討すると良いかもです。 |
タミヤ ユニバーサルプレート 2枚セット (70157) | ¥468 | |
タミヤ ツインモーターギヤーボックス (70097) | ¥587 | 今回は低速ギヤー比203:1のCタイプのギアを使用しています。 |
タミヤ マンモスダンプ 17013 | ¥819 | タイヤ2個と単3電池ボックスのみを使用しています。 [使用例] ![]() |
3mmプラネジ(7mm)+六角スペーサー(14mm)セット | ¥50 | 基盤やユニバーサルプレートの連結用。 秋月電子の通販コード(P-01861) |
9V電池 | ¥100 | モーターとモータードライバーの回路用 |
単3電池 2本 | ¥50 | ESP-WROOM-02用 |
ジャンパーワイヤー付バッテリースナップ(縦型) | ¥40 | 9V電池用。 この商品のピンは太くて固いので通常のバッテリースナップでも良いかもです。 秋月電子の通販コード(P-09032) |
コネクタ付コード(みの虫×ジャンパーワイヤ) | ¥110 | 単3電池ボックス用。 秋月電子の通販コード(C-08916) |
マスキングテープ | 任意 | ブレッドボードなどを固定する為に、使用しています。青色の「ガラス、サッシ用」を好んで使用しています。 |
配線図

※大きい配線図はZIPで提供しています。
スケッチ(プログラム)
SSID、パスワード、IP情報は各自の環境に合わせてください。
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> const char* ssid = "xxx"; const char* password = "xxx"; IPAddress ip(192, 168, 1, 33); IPAddress gateway(192, 168, 1, 1); IPAddress netmask(255, 255, 255, 0); // 左 const int PIN_2 = 2; // IO2 const int PIN_4 = 4; // IO4 const int PIN_5 = 5; // IO5 // 右 const int PIN_12 = 12; // IO12 const int PIN_13 = 13; // IO13 const int PIN_14 = 14; // IO14 String html = ""; ESP8266WebServer server(80); void setup(void){ pinMode(PIN_4,OUTPUT); pinMode(PIN_5,OUTPUT); pinMode(PIN_13,OUTPUT); pinMode(PIN_14,OUTPUT); // モーターの回転速度を最大にする // ※analogWrite()はpinMode()で設定しなくて良い analogWrite(PIN_2,255); analogWrite(PIN_12,255); html = "<!DOCTYPE html>\ <html>\ <head>\ <meta charset=\"UTF-8\">\ <meta name=\"viewport\" content=\"width=device-width,initial-scale=1,minimum-scale=1\">\ <style>\ table td{\ padding:15px;\ }\ </style>\ </head>\ <body>\ <br>\ <br>\ <br>\ <table>\ <tr><td></td><td><input type=\"button\" value=\"前進\" style=\"font-size:32px;\" onclick=\"location.href='/forward';\"></td><td></td></tr>\ <tr><td><input type=\"button\" value=\"左\" style=\"font-size:32px;\" onclick=\"location.href='/left';\"></td><td><input type=\"button\" value=\"停止\" style=\"font-size:32px;\" onclick=\"location.href='/stop';\"></td><td><input type=\"button\" value=\"右\" style=\"font-size:32px;\" onclick=\"location.href='/right';\"></td></tr>\ <tr><td></td><td><input type=\"button\" value=\"後進\" style=\"font-size:32px;\" onclick=\"location.href='/back';\"></td><td></td></tr>\ </table>\ </body>\ </html>"; Serial.begin(115200); // WIFI_AP, WIFI_STA, WIFI_AP_STA or WIFI_OFF WiFi.mode(WIFI_STA); WiFi.config(ip, gateway,netmask); WiFi.begin(ssid, password); Serial.println(""); // Wifi接続ができるまで待機 while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("IPアドレス: "); Serial.println(WiFi.localIP()); // ローカルネットワーク内のみ有効のmDNS(マルチキャストDNS)を開始 // bool MDNSResponder::begin(const char* hostname){} if (MDNS.begin("petitmonte")) { Serial.println("mDNSレスポンダーの開始"); } // トップページ server.on("/", [](){ // HTTPステータスコード(200) リクエストの成功 server.send(200, "text/html", html); }); // 前進 server.on("/forward", [](){ // 左タイヤ digitalWrite(PIN_4,HIGH); digitalWrite(PIN_5,LOW); // 右タイヤ digitalWrite(PIN_13,HIGH); digitalWrite(PIN_14,LOW); server.send(200, "text/html", html); }); // 左旋回 server.on("/left", [](){ digitalWrite(PIN_4,LOW); digitalWrite(PIN_5,LOW); digitalWrite(PIN_13,HIGH); digitalWrite(PIN_14,LOW); server.send(200, "text/html", html); }); // 右旋回 server.on("/right", [](){ digitalWrite(PIN_4,HIGH); digitalWrite(PIN_5,LOW); digitalWrite(PIN_13,LOW); digitalWrite(PIN_14,LOW); server.send(200, "text/html", html); }); // 後進 server.on("/back", [](){ digitalWrite(PIN_4,LOW); digitalWrite(PIN_5,HIGH); digitalWrite(PIN_13,LOW); digitalWrite(PIN_14,HIGH); server.send(200, "text/html", html); }); // 停止 server.on("/stop", [](){ digitalWrite(PIN_4,LOW); digitalWrite(PIN_5,LOW); digitalWrite(PIN_13,LOW); digitalWrite(PIN_14,LOW); server.send(200, "text/html", html); }); server.begin(); Serial.println("Webサーバーの開始"); } void loop(void){ // Webサーバの接続要求待ち server.handleClient(); }
最後に
この「Webサーバー」によるリアルタイムでマイコンを制御する手法は、ロボットなど幅広く応用できると思います。
掲示板
ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。