Hola, soy nuevo y todavía no se mucho sobre esto pero espero que me puedan ayudar, tengo un puente H L298N de la marca steren el cual alimenta 4 Mini Bombas De Aire Dc 3v A 6v cuando pulsas un botón, el positivo de las bombas están conectadas a las salidas del puente y el polo negativo al gnd del mismo puente h, este puente H esta siendo alimentado de manera externa por 4 pilas AA de 1.5 V en serie por lo que leí daría un voltaje total de 6V, el caso es que el codigo se ejecuta de manera correcta, las bombas se activan cada una y sus determinados tiempos pero cuando se termina de ejecutar el codigo estas 4 siguen funcionado de manera simultanea, hasta que vuelvas a pulsar el boton y se repite el proceso bien y al finalizar ocurre los mismo, no se si tengo que cambiar el voltaje, el puente H esta mal o no se tiene que conectar así, de igual forma muestro el código pero que yo sepa este no es el problema.
Codigo:
const int motorpin1 = 4; //pin positivo del motor
const int motorpin2 = 5; //pin negativo del motor
const int motorpin3 = 6; //pin negativo del motor
const int motorpin4 = 7; //pin positivo del motor
void setup()
{
//Declarmos todos los pines como salida
pinMode(motorpin1, OUTPUT);
pinMode(motorpin2, OUTPUT);
pinMode(motorpin3, OUTPUT);
pinMode(motorpin4, OUTPUT);
}
void loop()
{
if(digitalRead(3)==HIGH) //activacion del boton
{
//activar los motores
digitalWrite(motorpin1, HIGH);
delay(5000);
digitalWrite(motorpin1, LOW);
digitalWrite(motorpin2, HIGH);
delay(3000);
digitalWrite(motorpin2, LOW);
digitalWrite(motorpin3, HIGH);
delay(3000);
digitalWrite(motorpin3, LOW);
digitalWrite(motorpin4, HIGH);
delay(3000);
digitalWrite(motorpin4, LOW);
}
else{
digitalWrite(motorpin1, LOW);
digitalWrite(motorpin2, LOW);
digitalWrite(motorpin3, LOW);
digitalWrite(motorpin4, LOW);
}
}
Tu código dice que haga lo que describes.
Si es presiona el boton en el pin 3 hace
digitalWrite(motorpin1, HIGH); // Activa motor1 x 5 segd
delay(5000);
digitalWrite(motorpin1, LOW); // Apaga motor 1
digitalWrite(motorpin2, HIGH); // Activa motor 2 x 3 seg
delay(3000);
digitalWrite(motorpin2, LOW); // Apaga motor 2
digitalWrite(motorpin3, HIGH); // Activa motor 3 x 3 seg
delay(3000);
digitalWrite(motorpin3, LOW); // Apaga motor 3
digitalWrite(motorpin4, HIGH); // Activa motor 4 x 3 seg
delay(3000);
digitalWrite(motorpin4, LOW); // Apaga motor 4
Dime que esperas que haga?
Lo que tu crees es que no debería hacerlo al soltar el boton pero eso no pasa por lo siguiente.
Cuando tu presionas el boton el código entra en esta secuencia y cada delay no hace nada, solo gasta tiempo, asi que el que hayas soltado el boton NO EXISTE para el Arduino
El código demorará 5 + 3 + 3 +3 seg = 14 segundos en prestarte atención.
Solución: Maquina de estados y millis(). Ve a Documentación y lee como se usan ambos.
hola, muchas gracias por responder, pero creo que no me explique muy bien, para tener un contexto del arduino, es que es una maquina de bebidas, la cual al presionar un botón cada bomba funciona su tiempo dependiendo de el ingrediente que tenga, el problema que tengo no es que deje de presionar el botón, es más quiero que aunque suelte el botón este siga su ciclo, mi problema es que cuando este acaba su ciclo, las 4 bombas siguen funcionando hasta que vuelva a picar el botón para que se repita el ciclo y pasa lo mismo de que estas siguen funcionando después de que el ciclo termina.
En el código aparentemente no hay nada que objetar, excepto por dos cosas. La primera es que no has inicializado el pin 3 que usas para el pulsador.
pinMode(3, INPUT);
La otra cosa, es el hecho de usar delay. Pero para probar sirve, el problema será si quieres añadirle más funcionalidad al código.
Cuando vi el post, me extraño el uso que le das al l298N puesto que es un puente H y generalmente lo uso para controlar 2 motores. Así que me puse a ver si en el datasheet se comenta algo y nada. Entonces decidi hacer una simulación en Proteus y, efectivamente, parece que funciona pero los motores no se quedan en
marcha cuando acaba la secuencia.
De ahi deduzco que algo ocurre en el puente H cuando termina la secuencia y quizás el arduino se quede pillado o similar. Se me ocurre poner algo de
codigo externo como un:
Serial.print(F("."));
En el loop, para ver si cuando termina la secuencia imprime algo, o también comprobar con un tester/polimetro el valor de las salidas 4-7 al terminar el ciclo.
Personalmente opino que usar el L298N para controlar 4 motores no lo he visto nunca, y para controlar un simple motor usaría un transisor mosfet, o si no dispongo de ellos relés.