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.");
}
}
実際にマスコットロボ ハロの耳を動かすのは、次回。