
四足歩行ロボットが作りたいのでサーボモーターから始めてみる③
前回1個のサーボは遠隔でWebから動かせたので、次は4つということで。
ESP32と普通の9gサーボを使用
前回と同じやつでスライダーを増やす→Servoに値を送るをイメージしてたがスライダーを増やした後どうすれば値を送信できるのかよくわからん。
基盤4つ使うとか力業はしたくないので、2時間くらいの悪戦苦闘の結果このサイトを参考にすることで落ち着いた。
これをLED→サーボ出力に替えるので2時間
表示替えるので1時間
4つに増やすので10時間
いらないとこ消したりコンパイルエラーと戦うのに2時間
と丸二日くらいかかった。
以下できたもの
ちゃんとプログラム描けるようになってから見たらどう思うんだか。
これでやっと次はハードづくりかな。
可変抵抗で似たの作って動きをフォローさせるとかもやってみたい。
#include <WiFi.h>
#include <Servo.h>
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
// 使用するWi-Fiとそのパスワードに書き換えてください
const char* ssid = "SSIDに替える";
const char* password = "パスワードに替える";
// ポート80番を使用
WiFiServer server(80);
// HTTPリクエストを格納する変数
String header;
// 値の設定に使用する変数
String valueString = String(5);
int pos1 = 0;
int pos2 = 0;
void setup() {
myservo1.attach(13);
myservo2.attach(14);
myservo3.attach(15);
myservo4.attach(16);
Serial.begin(115200);
// Wi-Fiに接続
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();
}
void loop(){
WiFiClient client = server.available(); // Listen for incoming clients
if (client) { // If a new client connects,
Serial.println("New Client."); // print a message out in the serial port
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
header += c;
if (c == '\n') { // if the byte is a newline character
// if the current line is blank, you got two newline characters in a row.
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
// HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
// and a content-type so the client knows what's coming, then a blank line:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
// Display the HTML web page
client.println("<!DOCTYPE html><html>");
client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title>Dai's ESP32 for Servo</title>");
client.println("<link rel=\"icon\" href=\"data:,\">");
// CSS to style the on/off buttons
// Feel free to change the background-color and font-size attributes to fit your preferences
client.println("<style>body { text-align: center; font-family: \"Trebuchet MS\", Arial; margin-left:auto; margin-right:auto;}");
client.println(".slider { width: 300px; }</style>");
client.println("<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js\"></script>");
// Web Page
client.println("</head><body><h1>Dai's ESP32 for Servo</h1>");
//R slide bar
client.println("<p>Angle of Servo:No.1: <span id=\"servoPosR\"></span></p>");
client.println("<input type=\"range\" min=\"0\" max=\"180\" class=\"slider\" id=\"servoSliderR\" onchange=\"servo(this.value,'R')\" value=\""+valueString+"\"/>");
//G slide bar
client.println("<p>Angle of Servo:No.2: <span id=\"servoPosG\"></span></p>");
client.println("<input type=\"range\" min=\"0\" max=\"180\" class=\"slider\" id=\"servoSliderG\" onchange=\"servo(this.value,'G')\" value=\""+valueString+"\"/>");
//B slide bar
client.println("<p>Angle of Servo:No.3: <span id=\"servoPosB\"></span></p>");
client.println("<input type=\"range\" min=\"0\" max=\"180\" class=\"slider\" id=\"servoSliderB\" onchange=\"servo(this.value,'B')\" value=\""+valueString+"\"/>");
//z slide bar
client.println("<p>Angle of Servo:No.4: <span id=\"servoPosZ\"></span></p>");
client.println("<input type=\"range\" min=\"0\" max=\"180\" class=\"slider\" id=\"servoSliderZ\" onchange=\"servo(this.value,'Z')\" value=\""+valueString+"\"/>");
client.println("<script>");
//send R value
client.println("var sliderR = document.getElementById(\"servoSliderR\");");
client.println("var servoPR = document.getElementById(\"servoPosR\"); servoPR.innerHTML = sliderR.value;");
client.println("sliderR.oninput = function() { sliderR.value = this.value; servoPR.innerHTML = this.value; }");
//send G value
client.println("var sliderG = document.getElementById(\"servoSliderG\");");
client.println("var servoPG = document.getElementById(\"servoPosG\"); servoPG.innerHTML = sliderG.value;");
client.println("sliderG.oninput = function() { sliderG.value = this.value; servoPG.innerHTML = this.value; }");
//send B value
client.println("var sliderB = document.getElementById(\"servoSliderB\");");
client.println("var servoPB = document.getElementById(\"servoPosB\"); servoPB.innerHTML = sliderB.value;");
client.println("sliderB.oninput = function() { sliderB.value = this.value; servoPB.innerHTML = this.value; }");
//send Z value
client.println("var sliderZ = document.getElementById(\"servoSliderZ\");");
client.println("var servoPZ = document.getElementById(\"servoPosZ\"); servoPZ.innerHTML = sliderZ.value;");
client.println("sliderZ.oninput = function() { sliderZ.value = this.value; servoPZ.innerHTML = this.value; }");
//HTTP getのための関数
client.println("$.ajaxSetup({timeout:1000}); function servo(pos,color) { ");
client.println("$.get(\"/?value\" + color + \"=\" + pos + \"&\"); {Connection: close};}</script>");
client.println("</body></html>");
//HTTPリクエストの処理部分,サーボの駆動
if(header.indexOf("GET /?valueR=")>=0) {
pos1 = header.indexOf('=');
pos2 = header.indexOf('&');
valueString = header.substring(pos1+1, pos2);
myservo1.write(valueString.toInt());
Serial.println(valueString);
}
if(header.indexOf("GET /?valueG=")>=0) {
pos1 = header.indexOf('=');
pos2 = header.indexOf('&');
valueString = header.substring(pos1+1, pos2);
myservo2.write(valueString.toInt());
Serial.println(valueString);
}
if(header.indexOf("GET /?valueB=")>=0) {
pos1 = header.indexOf('=');
pos2 = header.indexOf('&');
valueString = header.substring(pos1+1, pos2);
myservo3.write(valueString.toInt());
Serial.println(valueString);
}
if(header.indexOf("GET /?valueZ=")>=0) {
pos1 = header.indexOf('=');
pos2 = header.indexOf('&');
valueString = header.substring(pos1+1, pos2);
myservo4.write(valueString.toInt());
Serial.println(valueString);
}
// HTTPレスポンスの終了
client.println();
// Break out of the while loop
break;
} else {
currentLine = "";
}
} else if (c != '\r') {
currentLine += c;
}
}
}
// Clear the header variable
header = "";
// 接続を切断
client.stop();
Serial.println("Client disconnected.");
Serial.println("");
}
}