Robot Arduino Uno con L298N

Buenos días, mi nombre es Antonio y soy nuevo en el foro.

Espero que este sea el sitio adecuado (Hardware) para exponer mi problema.

La verdad es que escribo ya un poco desesperado porque llevo semanas intentando solucionar el problema y no logro hacerlo. Estoy haciendo un robot con arduino Uno más un shield Sensor v5.0 y un L298N, con dos motores DC, un sensor IR, 2 servos y un sensor de radiofrecuencia para escanear la distancia hasta un obstáculo y variar la velocidad del robot. Se alimenta a través de 4 pilas AA con un interruptor on-off

El Robot funciona correctamente cuando lo tengo conectado al ordenador a través del USB, pero cuando intento probarlo de manera autónoma, sólo con las 4 pilas no hace nada… los servos apenas se mueven y por supuesto los motores no reaccionan.
He revisado mil veces las conexiones entre las baterías, el L298N, el Shield Sensor v5.0… nada.
Adjunto un esquema de las conexiones para ver si me podeis ayudar en algo, no se si necesitais el código pero ya os comento que conectandolo por USB funciona correctamente.

#include <IRremote.h>
#include <Servo.h>
#include <AsyncTaskLib.h>
#include <Robot.h>

#define PinTrigger A0         //Disparo US
#define PinEcho A1            //Eco US
#define PinIR 4               //Pin 4 sin PWM. frecuencia manualmente.
#define KEY_UP 0xFE30CF       //código en hexadecimal del botón VOL+ (delante) del mando a distancia
#define KEY_DOWN 0xFEB04F     //código en hexadecimal del botón VOL- (atrás) del mando a distancia
#define KEY_RIGTH 0xFE708F    //código en hexadecimal del botón REB (derecha) del mando a distancia
#define KEY_LEFT 0xFEF00F     //código en hexadecimal del botón FORWARD (izquierda) del mando a distancia
#define KEY_STOP 0xFE08F7     //código en hexadecimal del botón PLAY/PAUSE (stop) del mando a distancia
#define PIN_LED_DCHA A4       //Led Derecha
#define PIN_LED_IZQDA A5      //Led Izquierda
#define PIN_BUZZER 13         //Buzzer
#define PinBoton1 2           //Bumper izquierdo / interrupción 1
#define PinBoton2 3           //Bumper derecho / interrupción 2

#define PinEnA 5              //PWM
#define PinEnB 10             //PWM

#define MaxDistancia 100      // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

int velocidad=20;
long duration, distancia;
        

Servo myservo1;               // crea el objeto servo para controlar el servo1
Servo myservo2;               // crea el objeto servo para controlar el servo2
int posFinal = 90;            // variable para almacenar la posición del servo
int pos = 0;                  // variable para almacenar la posición del servo


AsyncTask asyncTask1(50, []() { digitalWrite(PIN_BUZZER, HIGH); });  // La clase AsyncTask puede instanciarse a través de uno de sus constructores
AsyncTask asyncTask2(10, []() { digitalWrite(PIN_BUZZER, LOW); });

IRrecv irrecv(PinIR);         // Variables utilizadas por IRremote
decode_results results;

Robot MiRobot(PinEnA, PinEnB);

void setup() {
  Serial.begin(9600);
  
  pinMode(PinEcho, INPUT);          //A1
  pinMode(PinBoton1, INPUT_PULLUP); //2
  pinMode(PinBoton2, INPUT_PULLUP); //3
  pinMode(PinTrigger, OUTPUT);      //A0
  pinMode(PIN_LED_DCHA, OUTPUT);
  pinMode(PIN_LED_IZQDA, OUTPUT);
  pinMode(PIN_BUZZER, OUTPUT);
  MiRobot.Arranca();
  
  irrecv.enableIRIn();

  digitalWrite(PIN_LED_DCHA, LOW);
  digitalWrite(PIN_LED_IZQDA, LOW);
  Serial.print("Leds apagados");

  myservo1.attach(11);         // indicar el pin del servo
  myservo2.attach(12);         // indicar el pin del servo

  
  attachInterrupt(digitalPinToInterrupt(2), ISRenciendeLedIzqda, CHANGE);    //Interrupcion 1. Enciende el led Izquierdo si se pulsa el botón izquierdo
  attachInterrupt(digitalPinToInterrupt(3), ISRenciendeLedDcha, CHANGE);     //Interrupcion 2. Enciende el led Derecho si se pulsa el boton derecho
}

void loop() {
  if (irrecv.decode(&results))
     {
     Serial.println(results.value,HEX);                     //imprime recibido en hexadecimal
     asyncTask1.Start();                                    // Activa/desactiva el buzzer
     asyncTask2.Start();                                    // Activa/desactiva el buzzer
     switch (results.value)                                 //selección según código en hexadecimal
     {
     case KEY_UP:
        myservo1.write(90);                                 // dile la posición a la que ir el servo1
        delay(25);                                          // espera 15 ms para que el servo encuentre la posición
        myservo2.write(90);                                 // dile la posición a la que ir el servo2
        delay(25);                                          // espera 15 ms para que el servo encuentre la posición
        
        Ping(PinTrigger, PinEcho);
        ModificarVelocidad(distancia);
        if (distancia<5) {MiRobot.Para();}
        while (distancia>=5)
        {
          asyncTask1.Update(asyncTask2);              
          asyncTask2.Update(asyncTask1);              
          MiRobot.Adelante(velocidad);
          delay(50);
          Ping(PinTrigger, PinEcho);
          ModificarVelocidad(distancia);
        }
        break;
     case KEY_DOWN:
        myservo1.write(90);                
        delay(25);    
        myservo2.write(90);                
        delay(25);    
        
        asyncTask1.Update(asyncTask2);              
        asyncTask2.Update(asyncTask1);              
        MiRobot.Atras(255);
        break;
     case KEY_RIGTH:
        myservo1.write(45);                
        delay(25);    
        myservo2.write(90);                
        delay(25);    
        
        Ping(PinTrigger, PinEcho);
        Serial.print("DISTANCIA....");
        Serial.println(distancia);
        ModificarVelocidad(distancia);
        while (distancia>=5)
        {
          asyncTask1.Update(asyncTask2);              
          asyncTask2.Update(asyncTask1);              
          MiRobot.Derecha(velocidad);
          
          delay(50);
          Ping(PinTrigger, PinEcho);
          Serial.print("DISTANCIA....");
          Serial.println(distancia);
          ModificarVelocidad(distancia);
        }
        break;
     case KEY_LEFT:
        myservo1.write(135);                
        delay(25);    
        myservo2.write(90);                
        delay(25);    
        
        Ping(PinTrigger, PinEcho);
        Serial.print("DISTANCIA....");
        Serial.println(distancia);
        ModificarVelocidad(distancia);
        while (distancia>=5)
        {
          asyncTask1.Update(asyncTask2);              
          asyncTask2.Update(asyncTask1);              
          MiRobot.Izquierda(velocidad);
          
          delay(50);
          Ping(PinTrigger, PinEcho);
          Serial.print("DISTANCIA....");
          Serial.println(distancia);
          ModificarVelocidad(distancia);
        }
        break;
     case KEY_STOP:
        myservo1.write(90);                
        delay(25);    
        myservo2.write(90);                
        delay(25);    
        
        asyncTask1.Stop();
        asyncTask2.Stop();
        MiRobot.Para();
        break;         
     default:
        Serial.println("Opcion incorrecta");
    }
  
  irrecv.resume();                                          //recibir próximo valor
  }
}  

void ISRenciendeLedIzqda()                                  // ISR pin 2, Enciende el led izquierdo
{
  digitalWrite(PIN_LED_IZQDA, HIGH);
  digitalWrite(PIN_LED_DCHA, LOW);
}

void ISRenciendeLedDcha()                                   // ISR pin 3, Enciende el led derecho
{
  digitalWrite(PIN_LED_IZQDA, LOW);
  digitalWrite(PIN_LED_DCHA, HIGH);
}

int Ping(int TriggerPin, int EchoPin) 
{
   digitalWrite(TriggerPin, LOW);                           //para generar un pulso limpio ponemos a LOW 4us
   delayMicroseconds(4);
   digitalWrite(TriggerPin, HIGH);                          //generamos Trigger (disparo) de 10us
   delayMicroseconds(10);
   digitalWrite(TriggerPin, LOW);
   
   duration = pulseIn(EchoPin, HIGH);                       //medimos el tiempo entre pulsos, en microsegundos
   
   distancia = duration * 10 / 292/ 2;                      //convertimos a distancia, en cm
   return distancia;
}

int ModificarVelocidad(int distancia)
{
  if (distancia>=50) 
  {
    velocidad=100;
  }                 
  if (distancia>=20&&distancia<50)  
  {
    velocidad=50;
  } 
  if (distancia>=5&&distancia<20) 
  {
    velocidad=20;
  }
  return velocidad;
}

Robot_5_bb.pdf (836 KB)

Hi,
Yo no creo que puedas alimentar todo el systema con esa baterias. Haz una prueba y lee el voltaje de las betria cuando corras el programa. Asi sabras si las bateriia pueden suplir el volataje necesario para los motores.Si te trabaja con el USB y cuando conectas las bateria no trabaja quire decr que las baterias no pueden suplir el voltaje/correitne para el sistema.

Como bien dice @tauro0221, tienes un problema de tensión y otro de corriente.
La tensión de 4 baterias llega excasamente a 6V y no son suficientes para alimentar un uno que requiere de 6.5 a 7V de modo que puede que funcione pero muy en el límite. En cuanto decaigan las baterías te quedas sin funcionamiento.
El otro problema es el consumo de motores, mas arduino, mas drivers.
4 baterias AA no son suficientes salvo tal vez para una primer prueba y luego quedan fuera de servicio.

Entonces busca un pack LiPO de 7.4V por ejemplo de al menos 3000mAh como para darte cierta autonomía o mejor. Tambien puedes usar baterías LiPO 18650 en serie.