Hey folks,
In this tutorial we will learn how to interface Servo motor with NodeMcu(ESP8266)module and operate it with the Blynk app. Servos are controlled by sending an electrical pulse of variable width, or pulse width modulation (PWM), through the control wire. There is a minimum pulse, a maximum pulse, and a repetition rate. A servo motor can usually only turn 90° in either direction for a total of 180° movement.
servo Motor (Back view) |
Follow the image below for circuit connection reference.
(Servo Motor connecting with NodeMcu) |
In this circuit, we have connected the output pin to the D0 pin of the NodeMcu module. If want to control the servo motor manually then connect a 10K potetiometer .
The 10K potentiometer will work as a voltage divisor, changing the analog input level on NodeMCU (A0) from 0 to 3.3V. Internally, the 10 bits ADC (Analog-Digital converter) will generate a digital value (from 0 to 1023), the PotReading, equivalent to the analog voltage input.
After making the circuit dump the code given below.
/*NodeMCU */
#include <ESP8266WiFi.h>
char ssid [] = "Tenda_43DA50";
char pass [] = "Karkhana";
/* Blynk */
#include <BlynkSimpleEsp8266.h>
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
char auth [] = "c21215a557a24272b44230f0c6f8370c"; // Servo Control Project // Servo Control Project
/* Servo */
#include <Servo.h>
Servo servo1;
#define servo1Pin D0
/* Initial pot reading and servo position set the position to neutral */
//#define potPin A0
int potReading = 1023 / 2;
int servo1Angle = 0;
/* Reads slider in the Blynk app and writes the value to "potReading" variable */
BLYNK_WRITE(V0)
{
potReading = param.asInt();
}
/* Display servo position on Blynk app */
BLYNK_READ(V1)
{
Blynk.virtualWrite(V1, servo1Angle);
}
void setup ()
{
Serial.begin(115200);
servo1.attach(servo1Pin);
displaySetup();
Blynk.begin(auth, ssid, pass);
}
void loop()
{
Blynk.run();
// potReading = analogRead(A0); // Read Analog data from potenciometer not used here
servo1Angle = map(100, 0, 1023, 0, 45); // Map the pot reading to an angle from 0 to 180
servo1.write(servo1Angle); // Move the servo to a position
displayAngle();
Serial.println(servo1Angle);
delay (500);
}
/* Initiate and display setup data on OLED */
void displaySetup()
{
display.init(); // initialize display
display.clear(); // Clear display
display.display(); // Put data on display
}
/* Display Servo position */
void displayAngle()
{
display.clear();
display.setFont(ArialMT_Plain_16);
display.drawString(10, 0, "Servo Control");
display.drawString(0, 45, "POSITION:" );
display.setFont(ArialMT_Plain_24);
display.drawString(80, 40, String(servo1Angle));
display.display();
}
/*NodeMCU */
#include <ESP8266WiFi.h>
char ssid [] = "Tenda_43DA50";
char pass [] = "Karkhana";
/* Blynk */
#include <BlynkSimpleEsp8266.h>
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
char auth [] = "c21215a557a24272b44230f0c6f8370c"; // Servo Control Project // Servo Control Project
/* Servo */
#include <Servo.h>
Servo servo1;
#define servo1Pin D0
/* Initial pot reading and servo position set the position to neutral */
//#define potPin A0
int potReading = 1023 / 2;
int servo1Angle = 0;
/* Reads slider in the Blynk app and writes the value to "potReading" variable */
BLYNK_WRITE(V0)
{
potReading = param.asInt();
}
/* Display servo position on Blynk app */
BLYNK_READ(V1)
{
Blynk.virtualWrite(V1, servo1Angle);
}
void setup ()
{
Serial.begin(115200);
servo1.attach(servo1Pin);
displaySetup();
Blynk.begin(auth, ssid, pass);
}
void loop()
{
Blynk.run();
// potReading = analogRead(A0); // Read Analog data from potenciometer not used here
servo1Angle = map(100, 0, 1023, 0, 45); // Map the pot reading to an angle from 0 to 180
servo1.write(servo1Angle); // Move the servo to a position
displayAngle();
Serial.println(servo1Angle);
delay (500);
}
/* Initiate and display setup data on OLED */
void displaySetup()
{
display.init(); // initialize display
display.clear(); // Clear display
display.display(); // Put data on display
}
/* Display Servo position */
void displayAngle()
{
display.clear();
display.setFont(ArialMT_Plain_16);
display.drawString(10, 0, "Servo Control");
display.drawString(0, 45, "POSITION:" );
display.setFont(ArialMT_Plain_24);
display.drawString(80, 40, String(servo1Angle));
display.display();
}
After dumping the code the output is shown on the video below:-
Thinking?
Comments