Rampa de aceleración motor

Estoy llevando a cabo el planteamiento de cómo controlar un motor DC con arduino (y unos MOSFET para abrir y cerrar el paso de potencia)

La idea es que con dos pulsadores, pueda configurar las siguientes situaciones:

pulsador1: arrancar el motor desde parado hasta por ejemplo el 50% de la PWM
pulsador2: desde el 50% hasta el 100%

Ambos deberían de ser progresivos, quizá dándole 500ms para cada 1% que incremente (aprox)

Mientras mantenga activado un pulsador, continúa el incremento de la PWM, pero si de repente suelto el pulsador, la PWM se va a 0%

Soy novato en esto de Arduino, y me he visto con esta necesidad. Me gustaría saber si es más o menos sencillo hacer esto. Si no lo es, buscaré alternativa.

Tengo esto actualmente (seguro que lleno de errores…) y no consigo que pare al solar el pulsador

int BOTON = 2;
int BOTON2 = 4;
int PositionSwitch = 12;
int Motor = 3;
void setup() {

 pinMode(BOTON, INPUT);
 pinMode(PositionSwitch, INPUT);
 pinMode(Motor, OUTPUT);
}

void loop() {

 while (digitalRead(BOTON) == HIGH)
   for (int x = 0; x <= 76; x++)
   { analogWrite(Motor, x);
     delay(500);
   }
 if (digitalRead(PositionSwitch) == LOW)
   for (int x = 0; x >= 0; x--)
   { analogWrite(Motor, x);
     delay(1);
   }

}

En tu planteamiento no queda claro si al pulsar el boton 2 arrancas directamente en el 50% para incrementar hasta 100% o debes pasar antes por la primera fase (llegar progresivamente al 50%)

Gracias por tu mensaje, jose

Deben de ser independientes. Es decir, el botón 2 está pensado para que, cuando el coche ya tiene movimiento, le de más potencia, de ahí que el motor arranque "fuerte".

Aunque pensándolo mejor ahora, creo que lo suyo sería que incluso en el modo 2, el motor salga desde parado para evitar problemas en el propio motor.

Mejor explicado:

Botón1: de 0 a 50% progresivo
Botón2: el motor ha de llegar hasta su 100%, pudiendo empezar desde el 0 hasta el 50% variando la PWM muy rápido, y desde 50% hasta 100%, subiendo la amplitud de la PWM más lentamente.

Pero si en algún momento se corta el pulso del botón, la PWM tiene que bajar a 0%

Muchas gracias de verdad, tengo que sacar este proyecto adelante como sea y la única opción es Arduino, lo que creo que me va a costar mucho.

Edita tu primer mensaje y pon tu codigo completo entre las etiquetas code para poder ayudarte.

Gracias Kike, de momento sólo estoy trasteando con un pulsador, por eso no tengo código para el Boton2. Hasta que no deje uno bien, no quiero ponerme con el otro. El código está ya en el primer mensaje

En el IDE hay una opcion llamada Auto Formato aplicala a tu codigo y notareas que te faltan llaves en el while y en el if()

void loop() {
   while (digitalRead(BOTON) == HIGH){   //falta llave aqui
      for (int x = 0; x <= 76; x++){ 
         analogWrite(Motor, x);
         delay(500);
      }
      if (digitalRead(PositionSwitch) == LOW){     //falta llave aqui
         for (int x = 0; x >= 0; x--){                    //Error aqui
            analogWrite(Motor, x);
            delay(1);
         }
      }               //falta llave aqui
   }                  //falta llave aqui
}

Esto es lo que encuentro yo al ver tu loop

void loop() {

 while (digitalRead(BOTON) == HIGH)
 for (int x = 0; x <= 76; x++) { 
 analogWrite(Motor, x);
 delay(500);
 }
 if (digitalRead(PositionSwitch) == LOW)
 for (int x = 0; x >= 0; x--) { 
 analogWrite(Motor, x);
 delay(1);
 }
}

El while solo ejecuta la siguiente línea o sea el for hasta 76 pero supongo que la idea es que haga todo lo que esta debajo o son ideas mías?
Luego hace falta semejante delay(500) por cada paso son 77 pasos x 0.5 segundos o sea 77 x 0.5 = 38.5 seg
Quiere decir que… tu presionas el pulsador, entras en el loop y por 38.5 segundos no hago mas que aumentar la velocidad cada 0.5 segundos.
No hay forma de que detectes que se soltó el pulsador y vuelvas a 0.

Debes usar millis() para dicha tarea y encararlo de otro modo.

Ve a documentación => indice de temas tutoriales => millis() y luego lo conversamos.

Gracias surbyte

Sí, la idea es que la aceleración sea muy muy lenta, incluso creemos que va a tener que necesitar más tiempo, pero bueno, eso sería lo de menos. Simplemente ajustarlo en función de lo que veamos en pruebas reales, incluso ajustable en función de las necesidades de cada circuito.
Y lo que comentas que tiene que llegar hasta 76 está mal hecho por mi parte (porque no he sabido hacerlo bien). La idea es que pueda parar antes de llegar a 76 si suelto botón. Quizá deba hacerlo con incremento de 1 punto y tras cada incremento, que vuelva a comprobar estado del botón.
Reviso lo que me comentas. Muchas gracias

sigo siendo quisquilloso ,pero quedan lagunas en los requerimientos...que pasa si pulsas los dos botones a la vez? que pasa si comienzas pulsando el primer boton y en algun punto antes de llegar al 50% pulsas el segundo boton?.Por cierto ,los valores analogicos de salida van del 0 al 255,por lo que el 50% seria 127

Pues me parece bien que seas quisquilloso :wink: . Porque son cosas que a mi se me pasan por alto.

Si pulsas los dos a la vez, sólo debería hacer caso al botón de menos potencia.

Si empiezas con el primero y por ejemplo al 48% pulsas el segundo, sigue haciendo caso solo al primero.

Vaya, por lo que veo tiene demasiado lío esto. Lo bueno es que tengo tiempo. A ver si esta semana, con los consejos que me habéis ido dando, voy sacándolo.

Lo de 127... Sí, en principio lo iba a poner con más botones, más escalonado y con el atasco que llevo con el código, pensé en dejarlo en sólo dos. No cambié ese valor pero así es, hay que tocarlo.

Gracias de nuevo!

Y porque no usas un solo pulsador y con cada pulsación cambias el modo de trabajo?
Una pulsación hace lo que esperabas con el boton1 y la segunda hace la rampa de apagado o apagado total.
Ahora si quieres ser mas fino, puedes descartar la pulsación 2da si no esta en el tiempo que se espera o si no ha alcanzado la velocidad deseada.