Servo not working while DC motors work, ESP32(SOLVED)

Hi! I've been enhancing an RC car project for the last month, at first it was a common esp32 Bluetooth car but I added an ultrasonic sensor and made It work with just logic, but it was quite wonky and It wasn't really accurate when turning (it crashed quite a lot).

So I thought, maybe add 2 more sensors and make it go straight till it finds any obstacle, but it is somewhat hard since where I live there's not a single shop that sells this kind of equipment, so I asked in college and they lent me a servo (actually 2, since they have a really suspicious amount of broken servos and told me that I should try both and see which one works better).

Both servos seemed to work perfectly alone, so I took one randomly and added it to my little car, when I tried just moving the servo and reading the distance it worked correctly, no issues at all, but when I started moving the DC motors AND the servo... well, the little servo seems quite distressed, It stopped working (but in a strange way because It would beep quite a lot and seems like It struggles to rotate, but then suddenly rotates and stays there even though in the code I have it to return to the last position, and starts to get really hot) and It would stay like that until I reset the energy.

Everything seems to work correctly, ESP32 doesn't stop giving me BLE signals, the ultrasonic sensor keeps sending me distance, and both DC motors work correctly and with the speed I requested in the code, It's just the servo that doesn't work correctly. I'm sure It's not an energy problem since I'm powering the servo directly with a 5V power bank (yes all the components have a common ground, anyhow the servo works correctly in any situation yet when I start the other two DC motors)

I'm using 2 DC motors (one for forward and back, one for turning right and left), ESP32, L298N driver, HC-SR04 ultrasonic sensor, and an SG90 micro servo. I was giving power to everything with 2 1200 mAh Li-ion 3.7 batteries (in series, around 7,4-8,4 it depends on the charge level I guess everybody knows) but since I saw the issues with the servo I tried powering everything independently and found out the one with problems was him all this time...

Heres my code:

#include <BluetoothSerial.h> 
#include <ESP32Servo.h>
BluetoothSerial ESP_BT;
Servo servo1;

#define servoPin 25

#define inp3 13
#define inp2 26
#define inp4 12
#define inp1 27

#define r_pwm 33
#define l_pwm 32

#define TrigP 19
#define EchoP 18



bool activo_mano = true;

long duration;
int distance;

int incoming;

int speed = 191;
int speed2 = 121;

const int distanciamin = 25;

void VelDistancia(){
  sensorRead();
  if(distance >= 80){
    speed2 = 100;
  }
  else if(distance >= 60){
    speed2 = 80;
  }
  else if(distance >= 50){
    speed2 = 64;
  }
  else if(distance >= 40){
    speed2 = 55;
  }
}

void ServoFrente(){
  servo1.write(75);
}

void stopC(){
  digitalWrite(inp1, LOW);
  digitalWrite(inp2, LOW);
  digitalWrite(inp3, LOW);
  digitalWrite(inp4, LOW);                     
}

void sensorRead () {
  digitalWrite(TrigP, LOW);
  delayMicroseconds(2);
  digitalWrite(TrigP, HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigP, LOW);
  duration = pulseIn(EchoP, HIGH);
  distance = duration * 0.034 / 2;
}

void Palante(){
        digitalWrite(inp1,LOW);
        digitalWrite(inp2,LOW);
        digitalWrite(inp3,HIGH);
        digitalWrite(inp4,LOW);
        setMotorSpeed();
        //Serial.println("aca andamo ruleta"); debug
}

void Patras(){
        digitalWrite(inp1,LOW);
        digitalWrite(inp2,LOW);
        digitalWrite(inp3,LOW);
        digitalWrite(inp4,HIGH);
        analogWrite(r_pwm,speed);
        analogWrite(l_pwm, 121);
        //Serial.println("smn"); debug
}

void Izquierda(){
        digitalWrite(inp1,HIGH);
        digitalWrite(inp2,LOW);
        digitalWrite(inp3,LOW);
        digitalWrite(inp4,LOW);
        setMotorSpeed();
        //Serial.println("iz"); debug
}

void Derecha(){
        digitalWrite(inp1,LOW);
        digitalWrite(inp2,HIGH);
        digitalWrite(inp3,LOW);
        digitalWrite(inp4,LOW);
        setMotorSpeed();
        //Serial.println("de"); debug
}

void Palanteizquierda(){
        digitalWrite(inp1,HIGH);
        digitalWrite(inp2,LOW);
        digitalWrite(inp3,HIGH);
        digitalWrite(inp4,LOW);
        setMotorTurnSpeed();
       // Serial.println("izq");
}

void Palantederecha(){
        digitalWrite(inp1,LOW);
        digitalWrite(inp2,HIGH);
        digitalWrite(inp3,HIGH);
        digitalWrite(inp4,LOW);
        setMotorTurnSpeed();
       // Serial.println("der");
}

void Patrasderecha(){
        digitalWrite(inp1,LOW);
        digitalWrite(inp2,HIGH);
        digitalWrite(inp3,LOW);
        digitalWrite(inp4,HIGH);  
        setMotorTurnSpeed();
        //Serial.println("Patder");
}

void Patrasizquierda(){
        digitalWrite(inp1,HIGH);
        digitalWrite(inp2,LOW);
        digitalWrite(inp3,LOW);
        digitalWrite(inp4,HIGH);
        setMotorTurnSpeed();
        //Serial.println("Patiz");
}

void setMotorSpeed() {
  analogWrite(r_pwm, speed);
  analogWrite(l_pwm, speed2);
}
void setMotorTurnSpeed(){
  analogWrite(r_pwm,speed);
  analogWrite(l_pwm, 130);
}

void VerifyDeath(){
  incoming = ESP_BT.read();
  sensorRead();
   if(incoming == 'L'){
    activo_mano = false;
    stopC();
    servo1.write(75);
   }
  
}

void setup(){
  Serial.begin(9600);
  ESP_BT.begin("ESP32CAR");

  pinMode(inp1, OUTPUT);
  pinMode(inp2, OUTPUT);
  pinMode(inp3, OUTPUT);
  pinMode(inp4, OUTPUT);   
  pinMode(TrigP, OUTPUT);
  pinMode(EchoP, INPUT);
  servo1.attach(servoPin, 1000, 2000);
  servo1.setPeriodHertz(50);
  servo1.write(75);
}

void loop(){
  if(ESP_BT.available()){
    incoming = ESP_BT.read();
      if(incoming == 'B'){
        stopC();
        delay(2000);
        esp_deep_sleep_start();
      }

      
      if(incoming == 'F'){   //Start carrito run run
        activo_mano = true;
        //Serial.println(incoming); //(debugging flag humilde)
        sensorRead();
        while (activo_mano) {
          if(distance > distanciamin){
            VelDistancia();
            Palante(); 
            VerifyDeath();
            Serial.println(distance);
          }
          else{
            stopC();
            delay(300);
            servo1.write(5);
            delay(1000);
            sensorRead();
            Serial.print("distancia derecha = ");
            Serial.println(distance);
            servo1.write(75);
            delay(100);}
            /*if(distance > distanciamin){
              ServoFrente();
              Patras();
              delay(700);
              Palantederecha();
              delay(1400);
            }
            else if(distance <= distanciamin){
              servo1.write(180);
              sensorRead();
              Serial.print("distancia izquierda = ");
              Serial.println(distance);
              if(distance > distanciamin){
                ServoFrente();
                Patras();
                delay(700);
                Palanteizquierda();
                delay(1400);
              }
              else if(distance <= distanciamin){
                ServoFrente();
                Patras();
                delay(200);
                
              }
            }
          }
          /*else{
            stopC();
            delay(400);
            Patras();
            delay(1400);
            Palantederecha();
            delay(1750);
            Izquierda();
            delay(20);
            Serial.print("Distancia 1 = ");
            sensorRead();
            Serial.println(distance);
          if(distance <= distanciamin){     
              Patrasderecha();
              delay(1750);
              Izquierda();
              delay(20);              
              Palanteizquierda();
              delay(1750);
              Derecha();
              delay(20); 
              Serial.print("Distancia 2 = ");
              sensorRead();
              Serial.println(distance);
              if(distance <= distanciamin){
                Patrasizquierda();
                delay(1750);
                Derecha();
                delay(20); 
                Patras();
                delay(1400);
                Palantederecha();
                delay(1700);
                Izquierda();
                delay(20); 
                Serial.print("Distancia 3 = ");
                sensorRead();
                Serial.println(distance);
              }
            }
          }*/
          VerifyDeath();
          //Serial.println(incoming);  //(debugging flag humilde)
        }

      }
  } 
}

As you can see I have a good amount of code as a commentary, at first I thought the servo would work so I just changed a bit the code I had for the car with just the sensor and waited for It to work correctly, the current code in use is just for finding out why the servo won't work, I read some things about changing the PWM channels and some talk about the library ESP32Servo using specific channels and recommending GPIO but I think I've got all that checked. I'm a noobie with all this, this is a project for college so welp, I'd like your help :slight_smile:

You found Google Translate! Good. Refrain from posting multiple topics with the same suject.

While trying quite some stuff I came across the LED control (LEDC, LEDC article espressif)

I made some trys with other pwm channels and resolutions, now It's working, here's the code:

#include <BluetoothSerial.h> 
#include <ESP32Servo.h>
BluetoothSerial ESP_BT;
Servo servo1;

#define servoPin 25

#define inp3 13
#define inp2 26
#define inp4 12
#define inp1 27

#define r_pwm 33
#define l_pwm 32

#define TrigP 19
#define EchoP 18



bool activo_mano = true;

long duration;
int distance;

int incoming;

int speed = 191;
int speed2 = 121;

const int distanciamin = 25;

void VelDistancia(){
  sensorRead();
  if(distance >= 80){
    speed2 = 100;
  }
  else if(distance >= 60){
    speed2 = 80;
  }
  else if(distance >= 50){
    speed2 = 64;
  }
  else if(distance >= 40){
    speed2 = 55;
  }
}

void ServoFrente(){
  servo1.write(75);
}

void stopC(){
  digitalWrite(inp1, LOW);
  digitalWrite(inp2, LOW);
  digitalWrite(inp3, LOW);
  digitalWrite(inp4, LOW);                     
}

void sensorRead () {
  digitalWrite(TrigP, LOW);
  delayMicroseconds(2);
  digitalWrite(TrigP, HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigP, LOW);
  duration = pulseIn(EchoP, HIGH);
  distance = duration * 0.034 / 2;
}

void Palante(){
        digitalWrite(inp1,LOW);
        digitalWrite(inp2,LOW);
        digitalWrite(inp3,HIGH);
        digitalWrite(inp4,LOW);
        setMotorSpeed();
        //Serial.println("aca andamo ruleta"); debug
}

void Patras(){
        digitalWrite(inp1,LOW);
        digitalWrite(inp2,LOW);
        digitalWrite(inp3,LOW);
        digitalWrite(inp4,HIGH);
        analogWrite(r_pwm,speed);
        analogWrite(l_pwm, 121);
        //Serial.println("smn"); debug
}

void Izquierda(){
        digitalWrite(inp1,HIGH);
        digitalWrite(inp2,LOW);
        digitalWrite(inp3,LOW);
        digitalWrite(inp4,LOW);
        setMotorSpeed();
        //Serial.println("iz"); debug
}

void Derecha(){
        digitalWrite(inp1,LOW);
        digitalWrite(inp2,HIGH);
        digitalWrite(inp3,LOW);
        digitalWrite(inp4,LOW);
        setMotorSpeed();
        //Serial.println("de"); debug
}

void Palanteizquierda(){
        digitalWrite(inp1,HIGH);
        digitalWrite(inp2,LOW);
        digitalWrite(inp3,HIGH);
        digitalWrite(inp4,LOW);
        setMotorTurnSpeed();
       // Serial.println("izq");
}

void Palantederecha(){
        digitalWrite(inp1,LOW);
        digitalWrite(inp2,HIGH);
        digitalWrite(inp3,HIGH);
        digitalWrite(inp4,LOW);
        setMotorTurnSpeed();
       // Serial.println("der");
}

void Patrasderecha(){
        digitalWrite(inp1,LOW);
        digitalWrite(inp2,HIGH);
        digitalWrite(inp3,LOW);
        digitalWrite(inp4,HIGH);  
        setMotorTurnSpeed();
        //Serial.println("Patder");
}

void Patrasizquierda(){
        digitalWrite(inp1,HIGH);
        digitalWrite(inp2,LOW);
        digitalWrite(inp3,LOW);
        digitalWrite(inp4,HIGH);
        setMotorTurnSpeed();
        //Serial.println("Patiz");
}

void setMotorSpeed() {
  analogWrite(r_pwm, speed);
  analogWrite(l_pwm, speed2);
}
void setMotorTurnSpeed(){
  analogWrite(r_pwm,speed);
  analogWrite(l_pwm, 130);
}

void VerifyDeath(){
  incoming = ESP_BT.read();
  sensorRead();
   if(incoming == 'L'){
    activo_mano = false;
    stopC();
    servo1.write(75);
   }
  
}

void setup(){
  Serial.begin(9600);
  ESP_BT.begin("ESP32CAR");
  ledcAttachChannel(r_pwm, 50, 8, 2);
  ledcAttachChannel(l_pwm, 50, 8, 3);
  ledcAttachChannel(servoPin, 50, 10, 1);
  pinMode(inp1, OUTPUT);
  pinMode(inp2, OUTPUT);
  pinMode(inp3, OUTPUT);
  pinMode(inp4, OUTPUT);   
  pinMode(TrigP, OUTPUT);
  pinMode(EchoP, INPUT);
  servo1.attach(servoPin, 1000, 2400);
  servo1.write(75);
}

void loop(){
  if(ESP_BT.available()){
    incoming = ESP_BT.read();
      if(incoming == 'B'){
        stopC();
        delay(2000);
        esp_deep_sleep_start();
      }

      
      if(incoming == 'F'){   //Start carrito run run
        activo_mano = true;
        //Serial.println(incoming); //(debugging flag humilde)
        sensorRead();
        while (activo_mano) {
          if(distance > distanciamin){
            VelDistancia();
            Palante(); 
            VerifyDeath();
            Serial.println(distance);
          }
          else{
            stopC();
            delay(300);
            servo1.write(5);
            delay(1000);
            sensorRead();
            Serial.print("distancia derecha = ");
            Serial.println(distance);
            servo1.write(75);
            delay(100);}
            /*if(distance > distanciamin){
              ServoFrente();
              Patras();
              delay(700);
              Palantederecha();
              delay(1400);
            }
            else if(distance <= distanciamin){
              servo1.write(180);
              sensorRead();
              Serial.print("distancia izquierda = ");
              Serial.println(distance);
              if(distance > distanciamin){
                ServoFrente();
                Patras();
                delay(700);
                Palanteizquierda();
                delay(1400);
              }
              else if(distance <= distanciamin){
                ServoFrente();
                Patras();
                delay(200);
                
              }
            }
          }
          /*else{
            stopC();
            delay(400);
            Patras();
            delay(1400);
            Palantederecha();
            delay(1750);
            Izquierda();
            delay(20);
            Serial.print("Distancia 1 = ");
            sensorRead();
            Serial.println(distance);
          if(distance <= distanciamin){     
              Patrasderecha();
              delay(1750);
              Izquierda();
              delay(20);              
              Palanteizquierda();
              delay(1750);
              Derecha();
              delay(20); 
              Serial.print("Distancia 2 = ");
              sensorRead();
              Serial.println(distance);
              if(distance <= distanciamin){
                Patrasizquierda();
                delay(1750);
                Derecha();
                delay(20); 
                Patras();
                delay(1400);
                Palantederecha();
                delay(1700);
                Izquierda();
                delay(20); 
                Serial.print("Distancia 3 = ");
                sensorRead();
                Serial.println(distance);
              }
            }
          }*/
          VerifyDeath();
          //Serial.println(incoming);  //(debugging flag humilde)
        }

      }
  } 
}

Moderator
Thread closed due to cross-posting.