ESP8266 & Servo not responding

Hello! I'm new in here and don't tend to ask questions much but I'm very much stuck. (Apologies for possible mistakes around forum categorizing and such)

I have a servo that works well with Arduino Uno - I run it with batteries/external power source.

The Ardunio have simply two wires to run it - ground and input (I don't need the Analog).

When shifting the wires to the ESP, it simply won't nudge!
The exact same code. I also made sure that I'm choosing the right pin for the Servo - it's simply ground pin and input pin, which I made sure is the correct one!

What am I missing?? I thought it might be insufficient power for the input pin (Arduino is 5v, ESP is 3.3v) but the servo has its own power so I don't understand the issue

See attached video -

In this second video I just return the cables back to the Arduino and everything works again (same code, same connection pins) -

Any thoughts??

Here's the code -

#include <Servo.h>

Servo myservo;

// Control and feedback pins
byte servoPin = 4;
int feedbackPin = A0;

// Calibration values
int minDegrees;
int maxDegrees;
int minFeedback;
int maxFeedback;
int tolerance = 2;  // max feedback measurement error

void calibrate(Servo servo, int analogPin, int minPos, int maxPos) {
    // Move to the minimum position and record the feedback value
    servo.write(minPos);
    minDegrees = minPos;
    delay(2000);  // make sure it has time to get there and settle
    minFeedback = analogRead(analogPin);

    // Move to the maximum position and record the feedback value
    servo.write(maxPos);
    maxDegrees = maxPos;
    delay(2000);  // make sure it has time to get there and settle
    maxFeedback = analogRead(analogPin);
}

int getPos(int analogPin) {
    return abs(map(analogRead(analogPin), minFeedback, maxFeedback, minDegrees, maxDegrees));
}

void ServoSetup() {
    Serial.println("Setting output");
    pinMode(servoPin, OUTPUT);

    Serial.println("Attaching");
    myservo.attach(servoPin);

    Serial.println("Calibrating");
    calibrate(myservo, feedbackPin, 0, 270);
}

void setup() {
    Serial.begin(9600);
    ServoSetup();
}

void loop() {
    Serial.println(analogRead(A0));
    myservo.write(270);
    Serial.println("270");
    delay(2000);
    Serial.println(analogRead(A0));
    myservo.write(0);
    Serial.println("0");
    delay(2000);
}

Thanks,
Shay

Please post the sketch that you are running on the 2 boards

I've added it to the post.

Printing the A0 was just to see that it outputs the data (which it did, but I don't really need that pin).

Did you use literally that code on the ESP8266 ?

If so then you are trying to control the servo with the ESP8266 chip pin number 4, not the ESP board pin number 4 which should be referred to as D4 in the code

But I managed to make this pin work with A PIR sensor (just to validate that it's the right pin I'm referencing).
How would you add a D4 in the code? looking at samples from others I see mostly the use of -
#define servoPin D4

but I get a compilation error for doing this

After more investigation, I understand now that all the pins have very unique purposes and there are very few I can/should actually use.

I also found that it's NodeMCU I'm using, so I changed the board to that and replaced the pin definition to D2, which didn't give me any errors, but the same problem persist.

  • byte 4 is the equivalent of D2, as it's a reference to the GPIO number.

Every couple of minutes the motor jitters, so I do know there's something happening from that pin and that it actually can send signals to the motor, I'm just not sure why it fails.

Post your latest attempt at a sketch for the NodeMCU

/*
Label GPIO
D1 5
D2 4
D3 0
D4 2
D5 14
D6 12
D7 13
D8 15
*/

D3?

D3 didn't work either. I also tried replacing/reinstalling the Servo library for the board and also use different esp8266 boards - all the same outcome of a mild random jitter every couple of minutes.

here's my latest sketch -

#include <Servo.h>

Servo myservo;

// Control and feedback pins
#define servoPin D3
int feedbackPin = A0;

// Calibration values
int minDegrees;
int maxDegrees;
int minFeedback;
int maxFeedback;
int tolerance = 2;  // max feedback measurement error

void calibrate(Servo servo, int analogPin, int minPos, int maxPos) {
    // Move to the minimum position and record the feedback value
    servo.write(minPos);
    minDegrees = minPos;
    delay(2000);  // make sure it has time to get there and settle
    minFeedback = analogRead(analogPin);

    // Move to the maximum position and record the feedback value
    servo.write(maxPos);
    maxDegrees = maxPos;
    delay(2000);  // make sure it has time to get there and settle
    maxFeedback = analogRead(analogPin);
}

int getPos(int analogPin) {
    return abs(map(analogRead(analogPin), minFeedback, maxFeedback, minDegrees, maxDegrees));
}

void ServoSetup() {
    Serial.println("Setting output");
    pinMode(servoPin, OUTPUT);

    Serial.println("Attaching");
    myservo.attach(servoPin);

    Serial.println("Calibrating");
    calibrate(myservo, feedbackPin, 0, 270);
}

void setup() {
    Serial.begin(9600);
    ServoSetup();
}

void loop() {
    Serial.println(analogRead(A0));
    myservo.write(270);
    Serial.println("270");
    delay(2000);
    Serial.println(analogRead(A0));
    myservo.write(0);
    Serial.println("0");
    delay(2000);
}

Based on this article I found, D3 (/0) should not be used - https://lastminuteengineers.com/esp8266-pinout-reference/

GPIO4 & GPIO5 is OK?

I made progress but the mystery gets so much worse...

I replaced the chip with a new ESP32 I own. Feels like it's on steroids compared to 8266.

What I noticed - with the same code! (different pins and libraries) - is that the motor responds fine to the calibration function and after that no response.

I cancelled the calibration function in the code and the motor works perfectly fine!
Same commands as in the calibration function, but outside of it - weirdest thing I've ever seen.

Same code as above works fine with ESP32 but without the calibration function! I think it's due to differences in the Servo libraries for the different chips.

I'm going to stick to the ESP32 as I finally got it to work but if anyone can solve this mystery or even better can help me make this work with the ESP8266, that would be great

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.