Ramesh G

Jan 10, 20213 min

NodeMCU Web Server Controlled Servo Motor

Updated: Jul 2, 2021

Here to show you how to build a web server with the ESP8266 12E that controls the shaft’s position of a servo motor using a Web page slider.

Connecting the Servo Motor to the ESP8266

Servo motors have three wires: power, ground, and signal.

Servo Wire Color

Power-Red

GND-Black, or brown

Signal-Yellow, orange, or white

When using a small servo like the SG90 as shown in the figure below, you can power it directly from the ESP8266.

If you’re using a small servo like the SG90, you need to connect:

  • GND -> ESP8266 GND pin;

  • Power -> ESP8266 Vin pin;

  • Signal -> GPIO 5 (or any PWM pin).

Installing the ESP8266_Arduino_Servo_Library

The ESP32 Arduino Servo Library makes it easier to control a servo motor with your ESP8266, using the Arduino IDE. Follow the next steps to install the library in your Arduino IDE:

Download the ESP32_Arduino_Servo_Library. You should have a .zip folder in your Downloads folder, Unzip the .zip folder and you should get ESP32-Arduino-Servo-Library.

After installing the library, go to your Arduino IDE. Make sure you have the Nodemcu 1.0 ESP-12E board selected, and then, Copy and Paste code in Arduino IDE.

Subscribe and Download code.

#include <ESP8266WiFi.h>

#include <WiFiClient.h>

#include <ESP8266WebServer.h>

//Include the Servo Library

#include <Servo.h>

#include "PageIndex.h"; //--> Include the contents of the User Interface Web page, stored in the same folder as the .ino file

#define ServoPort D1 //--> Defining Servo Port

//Make a wifi name and password as access point

const char* ssid = "TP-Link_3200"; // your SSID

const char* password = "9500112137"; //WIFI Password

//

Servo myservo; //--> create servo object to control a servo

ESP8266WebServer server(80); //--> Server on port 80

//This routine is executed when you open NodeMCU ESP8266 IP Address in browser

void handleRoot() {

String s = MAIN_page; //Read HTML contents

server.send(200, "text/html", s); //Send web page

}

//Procedure for handling servo control

void handleServo(){

String POS = server.arg("servoPOS");

int pos = POS.toInt();

myservo.write(pos); //--> Move the servo motor according to the POS value

delay(15);

Serial.print("Servo Angle:");

Serial.println(pos);

server.send(200, "text/plane","");

}

void setup() {

Serial.begin(115200);

delay(500);

myservo.attach(ServoPort); //--> attaches the servo on D1 to the servo object

WiFi.begin(ssid, password);

Serial.print("Connect your wifi laptop/mobile phone to this NodeMCU Access Point : ");

Serial.println(ssid);

Serial.println("Connecting to WiFi");

while (WiFi.status() != WL_CONNECTED) {

delay(1000);

Serial.println(".");

}

// Print ESP8266 Local IP Address

Serial.println(WiFi.localIP());

//Initialize Webserver

server.on("/",handleRoot); //--> Routine to handle at root location. This is to display web page.

server.on("/setPOS",handleServo); //--> Sets servo position from Web request

server.begin();

Serial.println("HTTP server started");

}

void loop() {

server.handleClient();

}

Creating the HTML Page

we need to include the HTML file PageIndex.h in the sketch and rotate the servo accordingly.

const char MAIN_page[] PROGMEM = R"=====(

<!DOCTYPE html>

<html>

<head>

<meta name="viewport" content="width=device-width, initial-scale=1">

<style>

html {

font-family: Arial;

display: inline-block;

margin: 0px auto;

text-align: center;

}

.slidecontainer {

width: 100%;

}

.slider {

-webkit-appearance: none;

width: 50%;

height: 15px;

border-radius: 5px;

background: orange;

outline: none;

opacity: 0.5;

-webkit-transition: .2s;

transition: opacity .2s;

}

.slider:hover {

opacity: 2;

}

.slider::-webkit-slider-thumb {

-webkit-appearance: none;

appearance: none;

width: 25px;

height: 25px;

border-radius: 50%;

background: brown;

cursor: pointer;

}

.slider::-moz-range-thumb {

width: 25px;

height: 25px;

border-radius: 50%;

background: #4CAF50;

cursor: pointer;

}

</style>

</head>

<body>

<h1>NodeMCU ESP8266 Web Server Controlled Servo Motor</h1>

<br><br>

<div class="slidecontainer">

<input type="range" min="0" max="180" value="50" class="slider" id="myRange">

<p>Servo angle: <span id="demo"></span></p>

</div>

<script>

function sendData(pos) {

var xhttp = new XMLHttpRequest();

xhttp.onreadystatechange = function() {

if (this.readyState == 4 && this.status == 200) {

console.log(this.responseText);

}

};

xhttp.open("GET", "setPOS?servoPOS="+pos, true);

xhttp.send();

}

var slider = document.getElementById("myRange");

var output = document.getElementById("demo");

output.innerHTML = slider.value;

slider.oninput = function() {

output.innerHTML = this.value;

sendData(output.innerHTML);

}

</script>

</body>

</html>

)=====";

Upload the Code

Now, upload the code to your ESP8266. Make sure you have the right board and COM port selected.

After uploading, open the Serial Monitor at a baud rate of 115200. Press the ESP8266 reset button. The ESP8266 IP address should be printed in the serial monitor.

Finally Result.

    33951
    0