Arduino + Puente h (l298n) + motores dc, anda un poco y se enloquese

Saludos amigos, vengo a pedirles un poco de ayuda antes de volverme loco.

Mi configuración es la siguiente:

Arduino hecho en casa: http://arduino.cc/en/pmwiki.php?n=Main/Standalone
Puente H (l298n) : http://www.haoyuelectronics.com/Attachment/L298N_module/1.jpg
2 motores Dc
8 pilas AA

La conexion es asi:
De arduino al puente h => pines 2,3,4,5 para controlar los motores
Al puente H le pongo las baterias y conecto tierra con el arduino

El problema: El Robot anda bien un tiempo, pero despues los motores se quedan girando y hay que reiniciar el arduino para que pare.

Les agradesco mucho su ayuda he invertido mucho tiempo en este proyecto y me empieso a sentir frustrado

Varias preguntas:

  1. El código o crees que somos magos para imaginar el problema?
  2. Qué fuente usas para alimentar el ARduino?
  3. Mediste la tensión de la batería cuando los motores se ponen locos?
  4. Mediste las corrientes consumidas por los motores?
  5. Que motores? Datos de tensión y corriente.
  6. Pasa algo raro ademas de lo que ilustras, hay temperatura en algun elemento?

Perdon pero

Hola surbyte gracias por tu respuesta, a continuacion respondo tus preguntas

  1. MI codigo es el siguiente:
#include <Servo.h>
Servo myservo;
//////////////
int led_front = 6;
int led_side = 7;
int led_back = 8;
int led_up = 13;
int led_head = 14;
//////////////
const int Motor1Pin1 = 3;
const int Motor1Pin2 = 2;
const int Motor2Pin1 = 5;
const int Motor2Pin2 = 4;
//////////////
void setup(){
  //
  myservo.attach(9);
  myservo.write(90);
  //
  pinMode(led_front, OUTPUT); 
  pinMode(led_side, OUTPUT); 
  pinMode(led_back, OUTPUT); 
  pinMode(led_up, OUTPUT);
  pinMode(led_head, OUTPUT);
  //
  SetUp_Motores();
  //
  Serial.begin(9600); 
  Serial.println(":::Robi-2 [OnLine]");
  //
}
void loop(){
  while (Serial.available()){
    char dato = Serial.read();
    switch(dato){
    case '1':    
      {
        digitalWrite(led_front, !digitalRead(led_front));
        break;
      }
    case '2':    
      {
        digitalWrite(led_side, !digitalRead(led_side));
        break;
      }
    case '3':    
      {
        digitalWrite(led_back, !digitalRead(led_back));
        break;
      }
      case '4':    
      {
        digitalWrite(led_up, !digitalRead(led_up));
        break;
      }
      case '5':    
      {
        digitalWrite(led_head, !digitalRead(led_head));
        break;
      }
      //
    case 'S':
      {
        StopM();
        Serial.println("Stop");
        break;
      }
    case 'w':
      {
        GoForward();
        Serial.println("GoForward");
        break;
      }
    case 's':    
      {
        GoBackward();
        Serial.println("GoBackward");
        break;
      }
    case 'a':    
      {
        GoLeft();
        Serial.println("GoLeft");
        break;
      }
    case 'd':    
      {
        GoRight();
        Serial.println("GoRight");
        break;
      }
      //
    case 'z':    
      {
        myservo.write(20);
        break;
      }
    case 'x':    
      {
        myservo.write(90);
        break;
      }
    case 'c':    
      {
        myservo.write(160);
        break;
      }
      //
    }
  }
}
//////////////
void SetUp_Motores(){
  pinMode(Motor1Pin1, OUTPUT);   
  pinMode(Motor1Pin2, OUTPUT);   
  pinMode(Motor2Pin1, OUTPUT);   
  pinMode(Motor2Pin2, OUTPUT); 
}
//////////
void GoForward(){
  digitalWrite(Motor1Pin2, LOW);
  digitalWrite(Motor1Pin1, HIGH);  
  digitalWrite(Motor2Pin2, LOW);
  digitalWrite(Motor2Pin1, HIGH);
}
void GoBackward(){
  digitalWrite(Motor1Pin1, LOW);
  digitalWrite(Motor1Pin2, HIGH);
  digitalWrite(Motor2Pin1, LOW);
  digitalWrite(Motor2Pin2, HIGH);
}
void GoLeft(){  
  digitalWrite(Motor1Pin1, LOW);
  digitalWrite(Motor1Pin2, HIGH);
  digitalWrite(Motor2Pin2, LOW);
  digitalWrite(Motor2Pin1, HIGH);
}
void GoRight(){  
  digitalWrite(Motor1Pin2, LOW);
  digitalWrite(Motor1Pin1, HIGH);
  digitalWrite(Motor2Pin1, LOW);
  digitalWrite(Motor2Pin2, HIGH);
}
//
void StopM(){
  digitalWrite(Motor1Pin2, LOW);
  digitalWrite(Motor1Pin1, LOW);
  digitalWrite(Motor2Pin1, LOW);
  digitalWrite(Motor2Pin2, LOW);
}
  1. Al Arduino lo alimento con una pila cuadrada de 9 voltios
  2. Si la medi y se baja, me he dado cuenta que a medida que las pilas se descargan el error se repite
  3. Amigo no se como medir esas corrientes, me das una ayuda por fa!
  4. Adjunto una foto de los motores, por que no se sus tensiones y corrientes, son de los muy comunes
  5. Mira cuando la bateria de los motores esta apagada, no se presenta el problema, y otra cosa rara es que el problema no pasa (Muy a menudo) cuando no hay uso del serial, es decir cuando cargo un programa que mueve por si solo el robot, Y las temperaturas de todo son normales nada se sobrecalienta

Muchas gracias por tu atencion

Saludos

Prueba con este codigo

#include <Servo.h>
Servo myservo;
//////////////
int led_front = 6;
int led_side = 7;
int led_back = 8;
int led_up = 13;
int led_head = 14;
//////////////
const int Motor1Pin1 = 3;
const int Motor1Pin2 = 2;
const int Motor2Pin1 = 5;
const int Motor2Pin2 = 4;
//////////////
void setup(){
  //
  myservo.attach(9);
  myservo.write(90);
  //
  pinMode(led_front, OUTPUT); 
  pinMode(led_side, OUTPUT); 
  pinMode(led_back, OUTPUT); 
  pinMode(led_up, OUTPUT);
  pinMode(led_head, OUTPUT);
  //
  SetUp_Motores();
  //
  Serial.begin(9600); 
  Serial.println(":::Robi-2 [OnLine]");
  //
}
void loop(){
  while (Serial.available()>0){
    char dato = Serial.read();
    switch(dato){
    case '1':    
      digitalWrite(led_front, !digitalRead(led_front));
      break;
    case '2':    
      digitalWrite(led_side, !digitalRead(led_side));
      break;
    case '3':    
      digitalWrite(led_back, !digitalRead(led_back));
      break;
    case '4':    
      digitalWrite(led_up, !digitalRead(led_up));
      break;
    case '5':    
      digitalWrite(led_head, !digitalRead(led_head));
      break;
    case 'S':
      StopM();
      Serial.println("Stop");
      break;
    case 'w':
      GoForward();
      Serial.println("GoForward");
      break;
    case 's':    
      GoBackward();
      Serial.println("GoBackward");
      break;
    case 'a':    
      GoLeft();
      Serial.println("GoLeft");
      break;
    case 'd':    
      GoRight();
      Serial.println("GoRight");
      break;
    case 'z':    
      myservo.write(20);
      break;
    case 'x':    
      myservo.write(90);
      break;
    case 'c':    
      myservo.write(160);
      break;
      //
    }
  }
}
//////////////
void SetUp_Motores(){
  pinMode(Motor1Pin1, OUTPUT);   
  pinMode(Motor1Pin2, OUTPUT);   
  pinMode(Motor2Pin1, OUTPUT);   
  pinMode(Motor2Pin2, OUTPUT); 
}
//////////
void GoForward(){
  StopM();
  digitalWrite(Motor1Pin1, HIGH);  
  digitalWrite(Motor2Pin1, HIGH);
}
void GoBackward(){
  StopM();
  digitalWrite(Motor1Pin2, HIGH);
  digitalWrite(Motor2Pin2, HIGH);
}
void GoLeft(){  
  StopM();
  digitalWrite(Motor1Pin2, HIGH);
  digitalWrite(Motor2Pin1, HIGH);
}
void GoRight(){  
  StopM();
  digitalWrite(Motor1Pin1, HIGH);
  digitalWrite(Motor2Pin2, HIGH);
}
//
void StopM(){
  digitalWrite(Motor1Pin2, LOW);
  digitalWrite(Motor1Pin1, LOW);
  digitalWrite(Motor2Pin1, LOW);
  digitalWrite(Motor2Pin2, LOW);
}

Saludos max_saeta te agradezco mucho tu ayuda, te cuento que probé el código y no soluciono por completo el problema, pero ahora ocurre en menos ocasiones, es decir ayudo mucho el cambio, me pregunto si tengo algún problema eléctrico, ¿habrá que poner algo entre los motores y el puente h?, muchas gracias!

Saludos
Tendrías que subir el diagrama eléctrico de tu sistema y así poder ayudare con eso.

probaste no alimentar el arduino directo de la bateria? el l298N que tienes tiene un puerto de 5V con eso yo alimento mi arduino y nunca me ha dado problemas.

puedes checar aca GitHub - yohendry/arduino_L298N: personal L298N Dual H-Bridge library for controlling via PWN 2 motors

saludos

El L298 tiene un puerto de 5V, como es eso?
La parte digital de entrada del L298 requiere 5V, que puede y debe ser alimentada desde el ARDUINO.
No funciona a la inversa.
Se deben compartir masas y la segunda alimentación la que usa el puente H para el o los motores esa es otra cosa.

El problema es la bateria, hice algo similar con esos motores. arduino se queda sin tension y se resetea.
Primero esos motores no se mueven a baja velocidad, son medios duros.
La bateria de 9v tiene unos 400ma si usas pilas AAA en serie tienes como 3A.
Usa 2 baterias separadas para el motor y para arduino, o asegurate de tener suficiente corriente.