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

スマホでラジコン

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!


とり天

大分名物「とり天」

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

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

広告

「ESP32-WROOM-32 & wifi でタンクを遠隔操作」への9件のフィードバック

  1. こんにちは、ページを読ませていただきました。
    質問です。
    こちらのページと同じ回路に同じプログラムを書き込んだのですが、client disconnectというエラーが出てきます。
    スマホはiphone12と接続して使っているのですが、他の機器を使ったほうが良いのでしょうか?

    1. トミー様

      本ブログお読みいただきありがとうございます!
      現状を確実に把握しきれていないのでうまくいくかわかりませんが、
      一応お答えします。

      「client disconnect」というエラーは、
      本文のプログラムの107行目で記述しています。
      このエラーが出るケースは、本文のプログラムの49行目、
      WiFiClient client = server.available();
      で定義しているclientという変数がfalseのときにあたります。
      つまりは現状ではwifi接続がうまくいってない可能性が考えられます。
      つきましてはご使用になられているルーターの設定
      (ssid, password)の確認から始めるのがよろしいかと思います。

      またうまくいかない場合はお知らせください。

  2. 返信ありがとうございます。

    現状を説明するとシリアルモニタを確認するとマイコンの実行ボタンを押すとIPアドレスが表示されるのですがそのIPアドレスにスマホでアクセスするとnew clientと表示されたあとに、client disconnectと表示されます。

    スマホにはコントロール画面が表示されます。

    やはりルーター設定がいけないんでしょうか?

  3. すいません、報告したいことがあります。

    マイコンのGNDとボードのマイナスが繋がっていないのが原因でした。

    お騒がせしてすいませんでした。

    では、これにて失礼します。

    1. トミー様

      無事動いたようでよかったです!
      ご丁寧に報告ありがとうございます!

      改めて記事を確認したところFig.2がどうやら間違っているかもです…
      ご迷惑おかけしてすみませんでした…

  4. こんにちは。
    お久しぶりでございます。
    今回は一つお許しが頂きたく連絡させて頂きます。
    実は、本サイトの内容を学校の卒業論文、卒業研究に利用させて頂いてもよろしいでしょうか?
    よろしくお願いします。

  5. すいません、つたないコメントをしてしまいました。要するに参考にしてもよろしいでしょうか?ということです。
    よろしくお願いします。

    1. トミー様

      弊ブログ活用いただきありがとうございます。
      卒業研究のお役に立てていただくことに関しては
      特に問題ございません。

      今後ともよろしくお願いします。

  6. 大きいとうもろこし。

    こんばんは。

    配線をFig.2を見て作りましたが動きませんでした。
    間違えているかもしれないとのコメントを見たので、
    どこを間違えているのか教えていただきたいです。

    プログラムは上手くいき、IPアドレスの確認やその後の操作画面を表示することなどはできたので、配線に問題があると思い質問させていただきました。

コメントを残す

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