Vaivén de un flap con motor paso a paso

Hola.
Siempre ayuda que expongan lo más posible del proyecto o idea del conjunto de lo que se trata de hacer. No sé si va a formar parte de algo más complejo o si simplemente se trata de hacer lo que se ha planteado y no más. Si sólo se trata de lo que se ha planteado, sin que se busque hacer otras cosas a la vez, diré que no veo problema por usar delay() tal como se está usando. Pero si se quiere en un futuro integrarlo con más cosas, entonces puede que los delay() «molesten» en un futuro y habría que implementarlo con millis().

Otra duda que me asalta, es que no veo cómo se «posiciona en cero» o cómo sabe en qué posición está inicialmente. Es decir, cuando el Arduino arranca, no veo cómo sabe en qué posición o paso está el motor. Normalmente se suele utilizar un final de carrera que se acciona cuando el motor se encuentra al final de uno de sus recorridos. Lo que se hace inicialmente es mover el mecanismo hacia ese final de carrera y cuando se detecta que acciona el final de carrera, ya sabemos dónde está y digamos que se pone «a cero». A partir de ahí ya podemos mover el motor a las posiciones que deseemos.

Yo buscaría la forma de poner un final de carrera para posicionar el sistema en una posición conocida y a partir de ahí hacer el resto de cosas. Asimismo, usaría una máquina de estados para controlarlo.

La máquina de estado tendría un estado inicial de «posicionamiento inicial» que lo que haría es mover el motor en busca de accionar el final de carrera. Una vez encontrado el final de carrera establece que numero_pasos es cero y se puede quedar en espera a que le llegue la instrucción por el puerto serie. Si da igual dónde está ubicado inicialmente, entonces al inicio puede asumir que está en la «posición inicial» (numero_pasoses cero) y la máquina de estados quedar «a la espera a que le llegue una instrucción».

A la vez que tenemos la variable numero_pasos deberíamos de tener otra variable, llamémosla destino, que debería de tener el número del paso al que queremos que se mueva.

Inicialmente destino valdrá lo mismo que numero_pasos ya que el motor está donde queremos que esté (en la «posición inicial»). Una vez establecida de una forma u otra la «posición inicial», en todo momento se mira si numero_pasos es diferente de destino ya que si así fuera, habría que mover el motor en un sentido y otro e incrementar o decrementar numero_pasos para que se igualara al valor de destino. Con ello controlamos «fácilmente» el movimiento del motor. Sólo basta con establecer el valor deseado en destino en los momentos adecuados.

Cuando llega una instrucción, si se trata de la opción 2, podemos establecer el valor de destino con número adecuado para que se posicione en 45º y dejar que el motor se mueva mientras numero_pasos sea distinto de destino. Curiosamente, no hace falta cambiarlo de estado, puede continuar «a la espera a que le llegue una instrucción» ya que el motor se mueve mientras numero_pasos y destino tengan valores diferentes.

Pero si nos llega la opción 1, si la máquina de estados está «a la espera a que le llegue una instrucción» entonces ponemos en destino el valor para que el motor se posicione en 90º y la máquina de estados paras a «posicionando a 90º». Mientras está en ese estado, se espera a que numero_pasosy destino tengan el mismo valor. Entonces, cuando tengan el mismo valor, se cambia el valor de destino acorde a los 0º y la máquina de estados pasa al estado «posicionando a cero grados». Mientras está en ese estado, espera nuevamente a que numero_pasosy destino tengan el mismo valor y entonces vuelta a los 90º. Así consigues el vaivén.

Importante, mientras está en alguno de los estados «posicionando a 90º» o «posicionando a cero grados», cualquier petición de la opción 1 se ha de leer y descartar, sin hacerle caso, porque ya se encuentra «ejecutando» esa opción. Pero si llega la opción 2, entonces se ha de establecer el valor de los 45º en destino y se pasa al estado «a la espera a que le llegue una instrucción».

Te recomiendo que los veas y mires a ver si con ellos y con lo que he dicho te da idea de cómo hacerlo.