본문 바로가기
MCU/NodeMCU

NodeMCU - 두 개의 서보모터 wifi 제어

by 시샐 2020. 3. 8.

 

서보모터를 본격적으로 사용하려면 보통 한 개만으로는 부족하므로, 두 개의 서보를 제어하는 프로그램을 만들어 보기로 했다.

웹서버를 사용하므로 HTML이나 자바를 사용하는데, 이쪽 전문이 아니라서 방법을 알아내는데 좀 애를 먹었다.

어쨌거나 결국 두 개의 서보를 제어할 수 있게 되었다.

 

모터 4 개가 필요한 Otto 로봇에 두 개의 선만 연결하고 테스트 중.

 

 

slider2.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
    <h2>Servo Control Page</h2>
    Servo 0 : <span id="servo0Text">90</span>
    <input type="range" style="width:90%;" min="0" max="180" id="servoSlider0" onchange="servoWrite(0,this.value)">
    Servo 1 : <span id="servo1Text">90</span>
    <input type="range" style="width:90%;" min="0" max="180" id="servoSlider1" onchange="servoWrite(1,this.value)">
    <script>
        var slider0 = document.getElementById("servoSlider0");
        var servoPos0 = document.getElementById("servo0Text");
        var slider1 = document.getElementById("servoSlider1");
        var servoPos1 = document.getElementById("servo1Text");
        slider0.oninput = function() {
            slider0.value = this.value;
            servoPos0.innerHTML = this.value;
        }
        slider1.oninput = function() {
            slider1.value = this.value;
            servoPos1.innerHTML = this.value;
        }
        $.ajaxSetup({timeout:1000});
        function servoWrite(num,pos) {
            $.get("/num=" + num + "," + "pos=" + pos + "d");
            {Connection: close};
        }
</script>
</body>
</html>

 

 

브라우저에서 열면 다음과 같은 형태가 된다.

 

 

소스코드도 앞서 하나의 서보 모터를 제어하는 경우와같은 맥락인데, 서보 모터 인스턴스를 두 개 정의하고, 웹으로부터 포지션 정보와 함께 서보 번호도 같이 가져 오는게 포인트가 되겠다.

 

servo_web2.ino

#include <ESP8266WiFi.h>
#include <Servo.h>

#define ND_D0 16
#define ND_D1 5
#define ND_D2 4
#define ND_D3 0
#define ND_D4 2
#define ND_D5 14
#define ND_D6 12
#define ND_D7 13
#define ND_D8 15
#define ND_RX 3
#define ND_TX 1

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

WiFiServer server(80);
Servo servo0, servo1;
String servoNum, servoPos;

void setup() {
  Serial.begin(115200);
  servo0.attach(ND_D0);
  servo0.write(90);
  servo1.attach(ND_D1);
  servo1.write(90);  
     
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
     delay(500);
     Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.print("Use this URL to connect: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("Server started");
}

void loop() {
  WiFiClient client = server.available();
  if(!client) return;
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
  String request = client.readStringUntil('\r');
  Serial.println("request: ");
  Serial.println(request);
  client.flush();
   
  while(client.available()) {
     client.read();
  }

  if(request.indexOf("/num=") >= 0) {
    int pos1 = request.indexOf("/num=");
    int pos2 = request.indexOf(',');  
    servoNum = request.substring(pos1+5, pos2);
  }
    
  if(request.indexOf("pos=") >= 0) {
    int pos1 = request.indexOf("pos=");
    int pos2 = request.indexOf('d');   
    servoPos = request.substring(pos1+4, pos2);

    if(servoNum.toInt()==0)
      servo0.write(servoPos.toInt());
    else
      servo1.write(servoPos.toInt());   
  }
  Serial.println(servoNum);
  Serial.println(servoPos);
  client.print("<!DOCTYPE html>");
  client.print("<html>");
  client.print("<head>");
  client.print("<meta charset=\"UTF-8\">");
  client.print("<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js\"></script>");
  client.print("</head>");
  client.print("<body>");
  client.print("<h2>Servo Control Page</h2>");
  client.print("Servo 0 : <span id=\"servo0Text\">90</span>");
  client.print("<br>");
  client.print("<input type=\"range\" style=\"width:90%;\" min=\"0\" max=\"180\" id=\"servoSlider0\" onchange=\"servoWrite(0,this.value)\">");
  client.print("<br>");
  client.print("Servo 1 : <span id=\"servo1Text\">90</span>");
  client.print("<br>");
  client.print("<input type=\"range\" style=\"width:90%;\" min=\"0\" max=\"180\" id=\"servoSlider1\" onchange=\"servoWrite(1,this.value)\">");
  client.print("<br>");  
  client.print("<script>");
  client.print("var slider0 = document.getElementById(\"servoSlider0\");");
  client.print("var servoPos0 = document.getElementById(\"servo0Text\");");
  client.print("var slider1 = document.getElementById(\"servoSlider1\");");
  client.print("var servoPos1 = document.getElementById(\"servo1Text\");");
  client.print("slider0.oninput = function() {");
  client.print("slider0.value = this.value;");
  client.print("servoPos0.innerHTML = this.value;}");
  client.print("\n");    
  client.print("slider1.oninput = function() {");
  client.print("slider1.value = this.value;");
  client.print("servoPos1.innerHTML = this.value;}");
  client.print("\n");  
  client.print("$.ajaxSetup({timeout:1000});");
  client.print("function servoWrite(num,pos) {");
  client.print("$.get(\"/num=\" + num + \",\" + \"pos=\" + pos + \"d\");");
  client.print("{Connection: close};");
  client.print("}");
  client.print("</script>");  
  client.print("</body>");
  client.print("</html>");
  
  delay(1);
  Serial.println("Client disonnected");
  Serial.println("");
}
반응형

'MCU > NodeMCU' 카테고리의 다른 글

미니 워터펌프 모터 전류 측정  (0) 2020.03.16
NodeMCU - 10 개의 서보모터 wifi 제어  (0) 2020.03.08
NodeMCU - 서보모터 wifi 제어  (0) 2020.03.08
NodeMCU - 서보 모터 제어를 위한 셋업  (0) 2020.03.08
NodeMCU 설정  (0) 2020.03.08