ESP32でWebからモーター制御 L293D

ESP32シリーズの続きです。

その前に、Fritzingのパーツは、頑張ってGitHUBで公開して、Qiitaで他のESP32のパーツと合わせて紹介しました。

さて、前回、DHT11を使用した温度計、湿度計を試してました。ただ表示しているだけなんだけど、なんかうれしくて、ずっと電源入れっぱなしにしていたりして楽しんでいました。

そろそろ次に進まないと、と、DCモーターの制御を試してみます。
記事にはしていないけど、サーボモーターとかと一緒に以前試してみたのだけど、動作してもあまりうれしいことが無くて放置していました。で、今回は、DCモーターからやり直しです。

DCモーターの実験の目的は、マスコットロボ ハロの耳を動かすこと。
写真の通り、ハロの前側の下にモーターがついています。ここの制御をESP32からやってみるのが最終目標です。


DCモーターの制御ということで、モータードライバが必要となります。今回は、ArduinoのキットについていたL293D を使用します。
 モータードライバが必要なのか?と思って調べてみると、モーターの回転の正方向、逆方向の制御や回転速度の制御、電源関連など苦労するものが多いということが分かったので、素直にモータードライバを使用することにしました。

プログラムはサンプルと、参考サイトのコードを利用しています。

DCモーターとL293Dのサンプル参考サイト:
https://randomnerdtutorials.com/esp32-dc-motor-l298n-motor-driver-control-speed-direction/

Webサーバの参考サイト:
http://mukujii.sakura.ne.jp/esp1.html
https://lastminuteengineers.com/esp32-dht11-dht22-web-server-tutorial/

接続図は下記のような感じ。
電源は両方投入しないといけない。

そして、まだ書きかけの汚いコードだけど、載せておきます。
モーターの frequency が良くわかっていない。


#include <WiFi.h>

// WiFi
const char* ssid     = "ssid";
const char* password = "password";

// WiFi Server
WiFiServer server(80);
String header;  // HTTPリクエストを格納する変数

// Motor Pin
int motor1Pin1 = 27; 
int motor1Pin2 = 26; 
int enable1Pin = 14; 

// Setting PWM properties
const int freq = 1000;
const int pwmChannel = 0;
const int resolution = 8;
int dutyCycle = 200;

void setup() {
  // sets the pins as outputs:
  pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(enable1Pin, OUTPUT);
  
  // configure LED PWM functionalitites
  ledcSetup(pwmChannel, freq, resolution);
  
  // attach the channel to the GPIO to be controlled
  ledcAttachPin(enable1Pin, pwmChannel);

  Serial.begin(115200);

  // WiFi Connect
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // ローカルIPを表示(このIPにスマホなどからアクセスします)
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  server.begin();

}

String SendHTML() {
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="<title>ESP32 DCMoter</title>\n";
  ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
  ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
  ptr +="</style>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="<div id=\"webpage\">\n";
  ptr +="<h1>ESP32 DCMoter Web</h1>\n";
  
  ptr +="<form method='get'>\
<input type='submit' name='le' value='耳停止' />\
<input type='submit' name='ri' value='耳動作' /><br>\
<input type='submit' name='st' value='停止' /><br>\
<br>\
</form></div>";
  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
}

void MoterStop() {
  Serial.println("Motor stopped");
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, LOW);
}

void  Forward() {
  Serial.println("Moving Forward");
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, HIGH); 
  delay(800);
}

void loop() {
  ledcWrite(pwmChannel, dutyCycle);   
//  Motor();
//  Forward();
  
  WiFiClient client = server.available();

  if (client) {
    Serial.println("New Client."); 
    String currentLine = "";             // make a String to hold incoming data from the client
    while (client.connected()) {         // loop while the client's connected
      if (client.available()) {          // if there's bytes to read from the client,
        char c = client.read();          // read a byte, then
        Serial.write(c);                 // print it out the serial monitor
        if (c == '\n') {                 // if the byte is a newline character
          if (currentLine.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            client.print(SendHTML());
            client.println();
            // break out of the while loop:
            break;
          } else {    // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /?le")) {
          Forward();
          MoterStop();
        }
        if (currentLine.endsWith("GET /?ri")) {
          Serial.println("");
          Serial.println("Moving Backwards");
          digitalWrite(motor1Pin1, HIGH);
          digitalWrite(motor1Pin2, LOW); 
        }
        if (currentLine.endsWith("GET /?st")) {
          Serial.println("");
          MoterStop();
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("Client Disconnected.");
  }
}


実際にマスコットロボ ハロの耳を動かすのは、次回。

0 件のコメント:

コメントを投稿