ARDUINO - Codigo esquiva obstaculos no funciona. Motor DC no arranca.

Hola! Les cuento que estoy haciendo mi primer proyecto (recien empiezo en esto de la programacion y Arduino)

Mas alla de otras cosas que afinare cuando todo armado, mi problema principal es que cada vez que el loop se repite, el motor para y vuelve a arrancar. La idea es que no pare nunca, que unicamente pare cuando encuentre un obstaculo a una distancia determinada.

El motor dc es un motor de cassettera de 5v alimentado con una bateria externa de 9v y conectado a un puente H L293D. Probe con este motor TGP01D que es especifico para Arduino, pero no tiene la suficiente fuerza para arrancar no se por que.

Y el de la cassettera arranca, hace marcha atras y se detiene correctamente, pero no tiene suficiente fuerza para mover un autito de carton. :cry:
Hay alguna prueba que le pueda hacer al L293D para saber si esta defectuoso? Es necesario poner un disipador siendo el voltaje tan poco? Aclaro que todo lo estoy haciendo todo en protoboard.

Pero lo que mas me preocupa es el codigo! No se me ocurre como solucionar la parada del motor. Alguna sugerencia?

================================================

ESTE ES EL LOOP:

void loop()
{
arrancar();
if (distancia < 6)
{
parar();
delay(1000);
reversar();
delay(30);
parar();
delay(1000);
girarderecha();
delay(30);
arrancar();
delay(100);
parar();
delay(1000);
enderezar();
delay(30);
arrancar();
}
else{
arrancar();
}
}
=============================

ESTAS SON LAS FUNCIONES:
Aclaraciones: E1 HIGH activa el motor dc, E1 LOW desactiva el motor dc
E1 HIGH + I1 HIGH + I2 LOW = marcha adelante
E1 HIGH + I2 HIGH + I1 LOW = marcha atras


void girarizquierda(){ //SERVO
pos=45; // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}

void girarderecha(){ //SERVO
pos=135; // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}

void enderezar(){ //SERVO
pos=90; // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}


void arrancar(){ // MOTOR
digitalWrite(E1, HIGH); // Activamos Motor1
digitalWrite(I2, LOW);
digitalWrite(I1, HIGH);
}

void velocidad(int v){ // MOTOR
digitalWrite(E1, LOW);
digitalWrite(I1, LOW);
digitalWrite(I2, LOW); // Paramos Motor
//delay(1000);

analogWrite(E1,v); // Activamos Motor
digitalWrite(I1, HIGH); // Arrancamos
digitalWrite(I2, LOW);
}

void reversar(){ // MOTOR
digitalWrite(E1, HIGH); // Activamos Motor1
digitalWrite(I1, LOW); // Arrancamos con cambio de direccio
digitalWrite(I2, HIGH);
delay(3000);
}

void parar(){ // MOTOR
digitalWrite(E1, LOW); // Paramos Motor 1
digitalWrite(I1, LOW); // Paramos Motor 1
digitalWrite(I2, LOW); // Paramos Motor 1
}

void leerdistancia(){ // SENSOR DE DISTANCIA ULTRASONICO
digitalWrite(12,LOW); // Inicializacion del sensor
delayMicroseconds(5);
digitalWrite(12, HIGH); // envío del pulso ultrasónico
delayMicroseconds(10);

tiempo=pulseIn(11, HIGH); // PULSEIN Función para medir la longitud del pulso entrante.
// Mide el tiempo en que el sensor recibe el rebote
distancia= int(0.017*tiempo); //fórmula para calcular la distancia obteniendo un valor entero
// v=d/t => d=v*t (definición de velocidad: distancia recorrida en un determinado tiempo).
Serial.println(distancia);
delay(1000);
}
 
De un vistazo rápido veo que distancia nunca se actualiza, por lo que en la comparación de <6 hará el paro que hay

En ese bucle falta actualizar la distancia (seguramente al principio)

Luego, mucho delay (especialmente el de 1000 de leerdistancia no entiendo para que vale)
 
es cierto hay muchisimo delay, debes usar una interrupcion y contadores para poder hacer series de retardos.

aparte yo te recomiendo usar motorreductores como estos :
image102-250x250.jpg


esos motorcitos los hay de diferentes torques , obviamente entre mas torque mas lentos y si son mas rapidos menos torque.

el l293 no creo que falle si falla puedes tambien reemplazarlo por sn75441one es igualito pin a pin.

yo diria que antes de usar el motor directamente trata de hacerlo con unos leds y usando timer.

por que asi con motores puestos no sabes si falla el motor o el programa.

lo mas seguro es que el programa esta fallando.
 
Atrás
Arriba