Go Down

Topic: Arduino + Puente h (l298n) + motores dc, anda un poco y se enloquese (Read 960 times) previous topic - next topic

josewebdev

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

surbyte

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

josewebdev

#2
Aug 29, 2014, 02:10 am Last Edit: Aug 29, 2014, 02:24 am by josewebdev Reason: 1
Hola surbyte gracias por tu respuesta, a continuacion respondo tus preguntas

1. MI codigo es el siguiente:
Code: [Select]

#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);
}


2. Al Arduino lo alimento con una pila cuadrada de 9 voltios
3. Si la medi y se baja, me he dado cuenta que a medida que las pilas se descargan el error se repite
4. Amigo no se como medir esas corrientes, me das una ayuda por fa!
5. Adjunto una foto de los motores, por que no se  sus tensiones y corrientes, son de los muy comunes
6. 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

max_saeta

Saludos

Prueba con este codigo

Code: [Select]

#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);
}


josewebdev

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!

max_saeta

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

Go Up