Soy nuevo en el foro, y tengo un problema con mi proyecto para el control de mis motores DC, la idea es que al superar un umbral en la lectura de la entrada análoga, el motor DC gire hacia un sentido, y que al no superar ese umbral (establecido en 256) , el motor gire hacia el otro lado pero solo por 3 segundos, luego de estos 3 segundos el motor se detiene y no gira a ningún lado, a menos que vuelva a superar el umbral establecido en 256, según la lectura de 0 a 1023.
Los 3 segundos los estoy contando con la Función millis, el problema es que al pasar los 3 segundos girando hacia el lado contrario, el motor no se detiene y sigue girando, en un bucle infinito, pero si pega un “pequeño salto” justo a los 3 segundos, por lo que creo es que me falta alguna variable o algo que haga que se detenga por completo y no entre nuevamente al loop del umbral menor a 256, para que no siga girando.
Les dejo el codigo de lo que tengo, estoy ocupando un integrado L293D (no tengo ningún tipo de problemas con la corriente ni nada, solo es mi problema de programación) , con dos motores, pero ambos motores deben moverse de igual forma por lo que tengo comentado las funciones del segundo motor.
Les dejo el código, Saludos
const int senal = 5; // PWM se conecta al pin 1 del puente-H
const int senal2 = 3; //PWM se conecta al pin 9 del puente H
const int in1 = 7; // Entrada 2 del puente-H motor 1
const int in2 = 4; // Entrada 7 del puente-H motor 1
const int in3= 8; // Entrada del puente H motor 2
const int in4= 9;// Entrada del puente H motor 2
int pote= A0;
int valorpote;
unsigned long tiempoActual = 0; // Tiempo en el mismo momento en el que pulsamos el botón
unsigned long tiempoAnterior = 0; // Cuándo fue la última vez que se pulsó el botón
void setup()
{
Serial.begin(9600); //Abre el puerto serie a 9600 bps
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
//se definen como salidas de señal, las entradas al puente H
}
void loop()
{
valorpote=analogRead(pote); //valor análogo leído desde un potenciometro
Serial.println(valorpote);
if (valorpote > 256) {
digitalWrite(in1,LOW);
digitalWrite(in2,HIGH);
//motor 1
//digitalWrite(in3,LOW);
//digitalWrite(in4, HIGH);
//motor 2
}
if (valorpote <= 256){
tiempoActual = millis();
digitalWrite(in1,HIGH);
digitalWrite(in2, LOW);
//motor 1
//digitalWrite(in3,HIGH);
//digitalWrite(in4, LOW);
//motor 2
}
// Si el tiempo transcurrido es mayor que 3 segundos el motor no debe girar a ninguno de los dos lados
if (tiempoActual - tiempoAnterior > 3000) {
digitalWrite(in1,LOW);
digitalWrite(in2,LOW);
//motor 1
//digitalWrite(in3,HIGH);
//digitalWrite(in4, LOW);
//motor 2
tiempoAnterior = tiempoActual;
}
}