見出し画像

四足歩行ロボットが作りたいのでサーボモーターから始めてみる③

前回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("");
 }
}

いいなと思ったら応援しよう!