コーヒーとチョコレート

好きなことをつらつらと書きます。下手でもやりたいことやってみるよ!

ESP32でローバーの基板を作ったお話

 

f:id:kesikasuapple:20181030011323j:plain

 皆さんこんにちわ、よろずです。今回ローバーの電子基板を四苦八苦しながら、サイトを右往左往しながら作った話です。

 


 

1. 目的

 ローバーを動作させるための電子系(基板)を作成します。

f:id:kesikasuapple:20181026220817j:plain

2. 概要

2.1 全般

 現在、想定するローバーの動作としては基本的な動作として前進・後退・右回転・左回転・スタビライザーの開閉。これらをWIFI通信で遠隔操作させます。自立駆動させたいっちゃさせたいのですが、ちゃんと動作するか確認するためにまずは信号を送信しラジコンのように動作させます。ブロック図を図示します。

f:id:kesikasuapple:20181024012644j:plain

2.2 電源系統

 ESP32開発ボードの動作には3.3Vの電源が必要ですが5Vピンに3.3Vに降圧するレギュレータがついています。5Vピンに9Vの電源を接続し3.3Vに降圧します。使用されているレギュレータASM1117-3.3を調べましたら15Vまで入れておkでした。

参考:http://www.advanced-monolithic.com/pdf/ds1117.pdf

モーターの動作には1.5V~3.3Vの電源が必要となります。3.3Vピンからモータードライバーを経由してモーターの給電をします。サーボ電源も3.3Vピンから給電します。

参考:http://akizukidenshi.com/catalog/g/gP-06437/


akizukidenshi.com

2.3 通信系統

 ESP32に搭載されているWIFI通信機を使用します。今回はWIFIルーターを経由して通信します。HTMLで作製した操作ページから制御を行います。

f:id:kesikasuapple:20181024012923j:plain

3. 作製

3.1 基盤作製

 今回はユニバーサル基盤で作成します。以下の写真に作製した基盤を載せます。以下に使用部品を記載します。

主な使用部品

以下にパワーポイントで無理やり書いた回路図を記載します。 

f:id:kesikasuapple:20181027012835j:plain

3.2 プログラム

以下にプログラムを記載します。

#include <WiFi.h>
#include "esp_system.h"
const int servo = 22; //サーボのピン番号22pin
const int frequ = 50; //周波数50Hz
const int Amotor1 = 17;
const int Amotor2 = 16;
const int Bmotor1 = 19;
const int Bmotor2 = 18;
const char* ssid = "xxxxxxxxxxx"; //ご自分のルーターのSSIDに書き換えてください。
const char* password = "xxxxxxxxxxx"; //ご自分のルーターのパスワードに書き換えてください。
 
WiFiServer server(80);
 
void setup()
{
    delay(1000);
    Serial.begin(115200);
    
  //サーボのPWMの設定チャンネル、ピン、周波数の定義
   ledcSetup(0, frequ, 8);  // 0ch 50 Hz 8bit resolution
   ledcAttachPin(servo, 0); // 15pin, 0ch
   //モーターの設定、ピン番号
    pinMode(Amotor1,OUTPUT); //set Amotor1 
    pinMode(Amotor2,OUTPUT); //set Amotor2
    pinMode(Bmotor1,OUTPUT); //set Bmotor1
    pinMode(Bmotor2,OUTPUT); //set Bmotor2
 
    delay(10);
  //シリアルモニタ表示
    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);
    
  //wifiの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();
 
}
//モーター制御変更時0.5sだけ停止
void stop(){
          digitalWrite(Amotor1, LOW);
          digitalWrite(Amotor2, LOW);
          digitalWrite(Bmotor1, LOW);
          digitalWrite(Bmotor2, LOW);
          delay(500);
}
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.println("<!DOCTYPE html>");
            client.println("<html>");
            client.println("<head>");
            client.println("<meta name='viewport' content='initial-scale=1.5'>");
            client.println("</head>");
            client.println("<body>");
            client.println("<form method='get'>");
            client.println("<font size='4'>ESP-WROOM-32<br>");
            client.println("</font><br>");
            client.println("<br>");
            client.println("<center>");
            client.println("<input type='submit' name=0 value='F' style='background-color:#248; color:#fff;border-style: none; height:50px; width:50px; '>");
            client.println("</center>");
            client.println("<p style='padding-top':15px;>");
            client.println("</p>");
            client.println("<center>");
            client.println("<input type='submit' name=2 value='L' style='background-color:#248; color:#fff;border-style: none; height:50px; width:50px; '>");
            client.println("<input type='submit' name=4 value='S' style='background-color:#be0000; color:#fff;border-style: none; height:50px; width:50px; '>");
            client.println("<input type='submit' name=3 value='R' style='background-color:#248; color:#fff;border-style: none; height:50px; width:50px; '>");
            client.println("</center>");
            client.println("<p style='padding-top':15px;>");
            client.println("</p>");            
            client.println("<center>");
            client.println("<input type='submit' name=1 value='B' style='background-color:#248; color:#fff;border-style: none; height:50px; width:50px; '>");
            client.println("</center>");
            client.println("<p style='padding-top':15px;>");
            client.println("<center>");
            client.println("<input type='submit' name=5 value='open' style='background-color:#666666; color:#fff;border-style: none; height:50px; width:50px; '>");
            client.println("<input type='submit' name=6 value='close' style='background-color:#666666; color:#fff;border-style: none; height:50px; width:50px; '>");
            client.println("</center>");
            client.println("</form>");
            client.println("</body>");
            client.println("</html>");
             client.println();
            break;
          } else {
            currentLine = "";
          }
        } else if (c != '\r') {
          currentLine += c;
        }
 
    //モーター制御文
        if (currentLine.endsWith("GET /?0=F")) {
          stop();
          digitalWrite(Amotor1, HIGH);
          digitalWrite(Bmotor1, HIGH);   
        }
        if (currentLine.endsWith("GET /?1=B")) {
          stop();
          digitalWrite(Amotor2, HIGH);
          digitalWrite(Bmotor2, HIGH);
        }
         if (currentLine.endsWith("GET /?3=R")) {
          stop();
          digitalWrite(Amotor1, HIGH);
          digitalWrite(Bmotor2, HIGH); 
         }
         if (currentLine.endsWith("GET /?2=L")) {
          stop();
          digitalWrite(Amotor2, HIGH);
          digitalWrite(Bmotor1, HIGH);  
         }
         if (currentLine.endsWith("GET /?4=S")) {
         stop();
         }
         //サーボ制御文(制御パルス:0.5ms~2.4ms PMWサイクル20mS )
         
         if (currentLine.endsWith("GET /?5=open")) {
         delay(50);
         ledcWrite(0,30);    //(最大パルス値*PMW最大値)/PMWサイクル≒30
         }
         if (currentLine.endsWith("GET /?6=close")) {
         delay(50);
         ledcWrite(0,6);  //(最小パルス値*PMW最小値)/PMWサイクル≒6     
         }
      }
    }
     
    client.stop();
    Serial.println("client disonnected");
  }
}

3.3 操作ページ

 操作ページはESP32のプログラム内で編集します。3.2.のプログラム内の行目から行目のHTML文が操作ページの編集となります。操作ページを以下に表します。前進をF(Front)後退をB(Back)右回転をR(Right)左回転をL(Left)停止をS(Stop)サーボの開閉をO(Open)C(Close)ボタンとしました。

f:id:kesikasuapple:20181006230354j:plain

 WIFI通信でESP32を制御するにはESP32をWIFIルーターのネットワーク内に入れる必要があります。そのためにはWIFIルーターIPアドレスとパスワードをESP32のプログラム内の11行目12行目に登録すればおkです。

 

 WebブラウザからESP32に接続します。接続する機器はネットワーク内にあるスマートフォンかパソコンで行います。ブラウザを開き、ESP32のIPアドレス(例192.168.○○○.○○○)を入力します。すると操作ページが表示されます。

 

4. 動作確認

タイムラグがほぼなく動作することを確認しました。モーターの動作を行いながらサーボの動作もできます。やったで


 

5. まとめ

 ローバーをWIFIで操作するために必要な基板を作りました

6. 参考文献

WIFI設定やプログラムをかく時に参考にした記事

ESP-WROOM-32 ( ESP32 ) で Wi-Fi スマホ LED スイッチ作り | ページ 4 / 4 | mgo-tec電子工作

ESP32-DevKitCを使ってWiFiコントロール

HTMLを組む時の参考記事

HTMLタグリファレンス(目的別)

 
HTMLの要素!属性、属性値とは!?class名を複数設定するHTMLの書き方付 | ビバ★りずむ