ホーム > カテゴリ > ロボット・電子工作・マイコン >

ラジコンカーを作成する(無線LAN/サーバー)

今回はスマートフォンで操作する事ができる「ラジコンカー」を作成しました。マイコンボードは2015年頃から流行したWifi対応の「ESP-WROOM-02」(¥650)を使用しています。

ラジコンカーの機能は「前進、後進、左旋回、右旋回」の4つです。

Arduinoのように使用できる「ESP-WROOM-02」が、はじめての方は先に次の関連記事をご覧ください。

モーターを操作するモータードライバーの扱い方は次の記事です。

写真

[横]

[表]

[裏]

[後]

※裏にある白い「ミニブレッドボード」は未使用です。

試作品のブレッドボードですので配線やマスキングテープなどで粗雑です。また、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本
¥50ESP-WROOM-02用
ジャンパーワイヤー付バッテリースナップ(縦型)¥409V電池用。

この商品のピンは太くて固いので通常のバッテリースナップでも良いかもです。

秋月電子の通販コード(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・ラズパイ等)でユーザー同士で情報を共有して下さい。

関連記事



公開日:2017年04月19日 最終更新日:2017年08月20日
記事NO:02332