ESP32-WROOM-32 & wifi でタンクを遠隔操作

  • by

スマホでラジコン

wifi接続された機器(スマートフォンなど)のブラウザ上に
コントローラを表示して、遠隔操作をしました。

今回もarduino互換マイコン、ESP32-WROOM-32を使用しています。

Contents

  1. モチベーション
  2. 構成
  3. 必要なもの
  4. 回路
  5. コード
  6. まとめ

1. モチベーション

戦車のプラモデルと組み合わせてラジコンを作りたいなぁ、
と思いトライしてみました。
今回は足回りが動くだけなので、これから戦車っぽくする予定です。

ガールズ&パンツァー最終章第2話も最高でした。

2. 構成、設計

動作のおおざっぱな説明↓(Fig. 1)

  1. ESP32からコントロール画面をHTMLとして出力
  2. wifiルータから同一ネットワークにアクセスした端末のブラウザでHTML表示
  3. 同時に操作ボタンの情報をESP32に送信
  4. 操作ボタンの情報に応じてモータに制御信号を送信
Fig. 1 おおざっぱな構成

実際はモータを動かすためにモータドライバや電源が別途必要となります。

3. 必要なもの

ユニバーサルプレート、ギアボックス、無限軌道セット、電池は千石電商で、
ESP32とモータドライバは秋月電子で買いました。

ユニバーサルプレートにギアボックスを取り付ける際、
プラモデル用のニッパで切り欠きを作って固定します。
(プレートか無限軌道の説明書に書いてあります。)

4. 回路

fritzingでの回路図(Fig. 2)と実際に接続した様子(Fig. 3)

Fig. 2 ラジコンの回路図(powered by fritzing)
Fig. 3 実際に接続した様子

fritzingの電池ボックス、TA7291Pはきむ茶工房ガレージハウスさんから、
ESP32開発ボードはDECOのアヤシいお部屋。さんから、
公開されているものを利用させていただきました。

モータドライバにはTA7291Pを使いました。(Fig. 4)
詳しくは秋月のページにあるデータシートを参考にするのが良いと思います。

Fig. 4 TA7291Pの外観と接続するピン

5、6番ピンに入力するHIGH/LOWの組み合わせで正転/逆転を制御します。

5. コード

#include <WiFi.h>

const char ssid[]="SSID";
const char passwd[] ="PASSWORD";
const char html[]=
"<!DOCTYPE html>\
<html>\
<head>\
<meta http-equiv=”refresh” content=0.1>\
<title>\
Tank control test\
</title>\
</head>\
<body>\
<h1>\
Tank control test\
</h1>\
<p>\
</p>\
<form method='get'>\
<input type='submit' name='stop' value='Stop' />\
<input type='submit' name='go_ahead' value='Go Ahead' />\
<input type='submit' name='turn_left' value='Turn Left' />\
<input type='submit' name='turn_right' value='Turn Right' />\
<input type='submit' name='back' value='Back' />\
</form>\
</body>\
</html>";

WiFiServer server(80);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(16, OUTPUT);
  pinMode(17, OUTPUT);
  pinMode(18, OUTPUT);
  pinMode(19, OUTPUT);
  connectWiFi();

  server.begin();
}

void loop() {
  // put your main code here, to run repeatedly:
  if ( WiFi.status() == WL_DISCONNECTED ) {
        connectWiFi();
  }
  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){
            //getSoundVolume();
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();
            
            client.println(html);
            client.println();
            break;
          }else{
            currentLine = "";
          }
        }else if(c != '\r'){
          currentLine += c;
        }
        if(currentLine.endsWith("GET /?stop")){
          digitalWrite(16, HIGH);
          digitalWrite(17, HIGH);
          digitalWrite(18, HIGH);
          digitalWrite(19, HIGH);
        }
        if(currentLine.endsWith("GET /?go_ahead")){
          digitalWrite(16, LOW);
          digitalWrite(17, HIGH);
          digitalWrite(18, HIGH);
          digitalWrite(19, LOW);
        }
        if(currentLine.endsWith("GET /?turn_left")){
          digitalWrite(16, HIGH);
          digitalWrite(17, LOW);
          digitalWrite(18, HIGH);
          digitalWrite(19, LOW);
        }
        if(currentLine.endsWith("GET /?turn_right")){
          digitalWrite(16, LOW);
          digitalWrite(17, HIGH);
          digitalWrite(18, LOW);
          digitalWrite(19, HIGH);
        }
        if(currentLine.endsWith("GET /?back")){
          digitalWrite(16, HIGH);
          digitalWrite(17, LOW);
          digitalWrite(18, LOW);
          digitalWrite(19, HIGH);
        }

      }
    }
    client.stop();
    Serial.println("client disonnected");
  }  
}

void connectWiFi() {
  WiFi.begin(ssid, passwd);
  Serial.print("WiFi connecting...");
  while(WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(100);
  }
  Serial.print(" connected. ");
  Serial.println(WiFi.localIP());
}

プログラムについてはmgo-tec電子工作さんの記事を参考にしました。
LED点灯の部分をモータの動作に合うように変更しました。

SSIDとPASSWORDを使用する環境に合わせて書き換えてください。

このプログラムを実行し、[ツール]から[シリアルモニタ]を開き、
無事にwifiルータにアクセスできるとIPアドレスが表示されます。

シリアルモニタに表示されたIPアドレスを端末のブラウザに入力すると、
Fig. 5のようなページが開きます。

Fig. 5 端末側の操作画面(html)

動作を示すボタンをタップするとその通りに動き出します。
(ブレッドボードにつないだままの場合は足は浮かせたままにしないと、
暴れまわる危険性があります。)

コードはGithubでも公開しております。

6. まとめ

Video 1 動作した様子

Video 1をご覧の通り、ボタンのタップで操作ができています。
(再生の際は音が出ますのでご注意ください。)

今後は、砲塔旋回ができるようにサーボを追加したり、
実際にプラモデルと組み合わせられるようにしたり、
UDPを使ってwifiルータを介さずコントロールできるようにしたり
したいと思います。

Panzer vor!


とり天

大分名物「とり天」

衣の軽い触感と、鶏肉のたんぱくでありながらジューシーでホクホクとした触感が絶妙にマッチした一品。

さわやかなポン酢の風味も相まって病みつきになること間違いなし。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です