Issue when working with both the Motor Driver (L298N) and Servo (SG90) at the same time (the Servo stops working).

innocent546
Posts: 1
Joined: Fri Jul 12, 2024 1:29 pm

Issue when working with both the Motor Driver (L298N) and Servo (SG90) at the same time (the Servo stops working).

Postby innocent546 » Sun Jul 14, 2024 8:40 pm

Background

I'm working on a robot car project using an ESP32 Devkit V1 (likely a generic dev board). We have 2 DC motors for moving the robot and a servo motor for a lifting mechanism.

I made a program to turn the servo motor (SG90 - non-continuous) to a given angle. The program worked fine. and the servo moved as expected.

I already had my main program made to make the robot move. This is done by giving PWM pulses to the ENA and ENB pin values of the L298n motor drivers, which change the DC motor speeds. This program works fine as well.

Code: Select all

//L298N speed change
analogWrite(ENA, speedA);
analogWrite(ENB, speedB);
The problem

However, things changed when I tried to add the servo code to the main program. I'm moving the servo using <ESP32Servo.h> with the following code:

Code: Select all

// Define the servo pin
const int servoPin = 32;
// Create a Servo object
Servo myServo;

void Setup() {
  Serial.begin(115200);
  // Attach the servo to the servo pin
  myServo.attach(servoPin);
  
}

void moveServoToAngle(int angle) {
  // Check if the input is a valid angle
  if (angle >= 0 && angle <= 180) {
    // Move the servo to the specified angle
    myServo.write(angle);
    Serial.print("Moving to ");
    Serial.print(angle);
    Serial.println(" degrees");
    delay(500);
  } 
}
After integrating the code with my main code, the servo motor doesn't work.

What I figured out

After some testing and experimentation, I realized that once the analogWrite() is called on any GPIO pin (in this case, pins for ENA and ENB), the servo.write() stops working indefinitely until the board resets. Consider this sample code.

Code: Select all

#include <ESP32Servo.h>

#define IN1 25
#define IN2 26
#define IN3 27
#define IN4 14
#define ENA 12 //Right Motor Speed
#define ENB 13 //Left Motor Speed

int speedA = 0;
int speedB = 0;

Servo myServo;  // Create a servo object

void setup() {
  Serial.begin(115200);
  myServo.attach(32);  // Attach the servo on pin 32
  Serial.println("Servo attached to pin 32");
}

void loop() {
  for (int pos = 0; pos <= 60; pos++) {  // Move the servo from 0 to 180 degrees
    myServo.write(pos);              // Tell servo to go to position in variable 'pos'
    delay(15);                       // Wait 15 ms for the servo to reach the position
  }
  for (int pos = 60; pos >= 0; pos--) {  // Move the servo back from 180 to 0 degrees
    myServo.write(pos);              // Tell servo to go to position in variable 'pos'
    delay(15);                       // Wait 15 ms for the servo to reach the position
  }

  analogWrite(ENA, speedA);
  analogWrite(ENB, speedB);
  delay(100);
}
For example, in the above code, the servo motor works once in the first iteration of the main loop (as analogWrite is called at the end). Then it reaches the analogWrite(ENA, speedA); and analogWrite(ENB, speedB);. After that, myServo.write(pos); doesn't work anymore. For instance, the servo doesn't move in any iteration after the initial iteration of the main loop.

Servo does move again and again indefinitely, as expected, without issues when I comment out the analogWrite(); lines.

Questions
  • What are the possible causes of this problem?
    How to make both the motor driver and the servo work at the same time. At least, what are the things I could try?
I attached the relevant components of my schematic
Attachments
Schematic_Marquer1_2024-07-15.png
Schematic of relevant components
Schematic_Marquer1_2024-07-15.png (118.13 KiB) Viewed 939 times

Who is online

Users browsing this forum: No registered users and 59 guests