Control de 2 motores DC con ESP32 y LN298N

Qué tal, estoy controlando un robot de 2 ruedas con 2 motores DC con un ESP32 y un L298N. Su funcionamiento es que detecte 3 fotorresistencias y al momento de detectar alguna de ellas los motores se muevan. Al momento de cargarle el programa solo me hace la función 1 motor. El otro no responde. Lo curiosos sucede con los puertos ENA1, ENA2 y ENB1 y ENB2. Si conecto ENA1 y ENB2 solo hace la función el motor A pero si conecto ENA2 y ENB1 solo lo hace el B. Si conecto ENA1 y ENB1 o ENA2 y ENB2 no hace nada. A como he investigado esos puertos solo tienen la función de habilitar o deshabilitar los motores y controlarlo por PWM pero sea cual sea no debería de haber problema. Tengo la sospecha de que el programa es el problema, alguien sabría cual puede ser el problema.
Como dato, no sé si sea relevante, el ESP32 y el LN298N tienen alimentación separadas. El ESP32 con pilas (+12V) y el ESP32 con una power bank.
Este es el programa en Arduino IDE:

// Librería para el ESP32
#include <WiFi.h>

// Pines de las fotorresistencias
const int leftSensorPin = 34;
const int middleSensorPin = 35;
const int rightSensorPin = 36;

// Pines del puente H L298N
const int motor1Pin1 = 2;
const int motor1Pin2 = 4;
const int motor2Pin1 = 32;
const int motor2Pin2 = 33;

// Pines de habilitación de los motores (ENA y ENB)
const int enableAPin = 25;  // Puedes asignar cualquier pin disponible
const int enableBPin = 26;  // Puedes asignar cualquier pin disponible

void setup() {
  // Configurar los pines de los motores como salida
  pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(motor2Pin1, OUTPUT);
  pinMode(motor2Pin2, OUTPUT);
  
  // Configurar los pines de habilitación como salida
  pinMode(enableAPin, OUTPUT);
  pinMode(enableBPin, OUTPUT);
  
  // Iniciar la comunicación serial
  Serial.begin(9600);
  
  // Habilitar PWM en los pines de habilitación de los motores
  ledcSetup(0, 5000, 8);  // Canal 0, frecuencia 5000Hz, resolución de 8 bits
  ledcSetup(1, 5000, 8);  // Canal 1, frecuencia 5000Hz, resolución de 8 bits
  ledcAttachPin(enableAPin, 0); // Habilitar PWM en el pin de habilitación del motor A
  ledcAttachPin(enableBPin, 1); // Habilitar PWM en el pin de habilitación del motor B
}

void loop() {
  // Leer los valores de las fotorresistencias
  int leftSensorValue = analogRead(leftSensorPin);
  int middleSensorValue = analogRead(middleSensorPin);
  int rightSensorValue = analogRead(rightSensorPin);
  
  // Mostrar los valores en el monitor serial
  Serial.print("Left Sensor: ");
  Serial.print(leftSensorValue);
  Serial.print(" | Middle Sensor: ");
  Serial.print(middleSensorValue);
  Serial.print(" | Right Sensor: ");
  Serial.println(rightSensorValue);
  
  // Determinar cuál sensor tiene el valor más alto
  int maxValue = max(leftSensorValue, max(middleSensorValue, rightSensorValue));
  
  // Control de los motores según las lecturas de las fotorresistencias
  if (maxValue > 300) { // Activar movimiento solo si algún sensor detecta más de 300
    if (leftSensorValue == maxValue) {
      // Alumbrar fotorresistencia izquierda: gira a la izquierda
      digitalWrite(motor1Pin1, HIGH); // Avance
      digitalWrite(motor1Pin2, LOW); // Reversa
      digitalWrite(motor2Pin1, LOW); // Avance
      digitalWrite(motor2Pin2, HIGH); // Reversa
      // Ajustar la velocidad de los motores
      ledcWrite(0, 255); // Velocidad máxima para motor 1
      ledcWrite(1, 255); // Velocidad máxima para motor 2
    } else if (middleSensorValue == maxValue) {
      // Alumbrar fotorresistencia del medio: avanza hacia adelante
      digitalWrite(motor1Pin1, HIGH); // Avance
      digitalWrite(motor1Pin2, LOW); // Reversa
      digitalWrite(motor2Pin1, HIGH); // Avance
      digitalWrite(motor2Pin2, LOW); // Reversa
      // Ajustar la velocidad de los motores
      ledcWrite(0, 255); // Velocidad máxima para motor 1
      ledcWrite(1, 255); // Velocidad máxima para motor 2
    } else if (rightSensorValue == maxValue) {
      // Alumbrar fotorresistencia derecha: gira a la derecha
      digitalWrite(motor1Pin1, LOW); // Avance
      digitalWrite(motor1Pin2, HIGH); // Reversa
      digitalWrite(motor2Pin1, HIGH); // Avance
      digitalWrite(motor2Pin2, LOW); // Reversa
      // Ajustar la velocidad de los motores
      ledcWrite(0, 255); // Velocidad máxima para motor 1
      ledcWrite(1, 255); // Velocidad máxima para motor 2
    }
  } else {
    // Si ninguno de los sensores detecta más de 300, detener el robot
    digitalWrite(motor1Pin1, LOW);
    digitalWrite(motor1Pin2, LOW);
    digitalWrite(motor2Pin1, LOW);
    digitalWrite(motor2Pin2, LOW);
  }
}

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

¿Has unido la masa (GND) del ESP con la del driver?


Moderador
Lo primero es que si posteas en español debes usar el foro Arduino en Español.
Si posteas en el foro en inglés usa exclusivamente ese idioma en todo, título, comentarios, cuerpo del mensaje o terminarás acá de todos modos.
Lo segundo es que leas las normas del foro ya que no lo has hecho para evitar mas advertencias.
Lo tercero que tu hilo fue movido a Microcontroladores, sección para las cosas no arduino pero que se programan con el mismo estilo.
Nada mas, gracias por tu comprensión.

Pero si te dice que se mueve

O sea.. hay GND conectado.

Si, también dice que tiene 2 alimentaciones y que los pines ENx hacen cosas "raras".

Como no veo el circuito, es mejor preguntar que suponer.

Y así pregunte una obviedad o una reverenda estupidez al PO no le cuesta nada responder.

Qué tal. Ese era el problema tenía 2 GND diferentes y al unirlas funcionó. Muchas gracias. Pero me quedó una duda. ¿Porque pasa esto? ¿Hay alguna diferencia entre tener 2 tierras diferentes a solo 1? ¿En qué circuitos se debe de usar 2 tierras y en cuáles solo 1?

No debes tener 2 tierras. Todo debe referenciarse a la misma tierra.

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