Me alegra, Armando, tu “ascenso de división”. La programación orientada a objeto tiene más cosas de las que he empleado en el programa, cosas como la herencia, pero sólo con el encapsulamiento y el empleo de los constructores ya son herramientas muy valiosas para la programación.
Para que funcione con un solo botón basta con poner el mismo número del pin para pinRecta y pinDesvio.
Otra forma es cambiar los inicializadores pinRecta y pinDesvio en constructor de la clase Aguja. Para que si se le pasa un -1 en uno de los pines, tome como valor el del otro pin. Es lo mismo, pero “más elegante”. Para ello el cambio que hay que hacer es que en:
// Implementación de las funciones de la clase Aguja
Aguja::Aguja(Servo &servo, unsigned long duracionCambio, uint8_t pinRecta, uint8_t pinDesvio, uint8_t pinLuzVerde, uint8_t pinLuzAzul)
: servo(servo),
duracionCambio(duracionCambio),
pinRecta(pinRecta),
pinDesvio(pinDesvio),
Cambiamos las dos últimas líneas para que queden así:
// Implementación de las funciones de la clase Aguja
Aguja::Aguja(Servo &servo, unsigned long duracionCambio, uint8_t pinRecta, uint8_t pinDesvio, uint8_t pinLuzVerde, uint8_t pinLuzAzul)
: servo(servo),
duracionCambio(duracionCambio),
pinRecta((pinRecta != 0xFF) ? pinRecta : pinDesvio), // Si se pasa un -1 en pinRecta, tendrá como valor el mismo que pinDesvio
pinDesvio((pinDesvio != 0xFF) ? pinDesvio : pinRecta), // Si se pasa un -1 en pinDesvio, tendrá como valor el mismo que pinRecta
También se podría quitar el uso de uno de los dos pines en la clase, y así ahorrarnos un byte de memoria por cada servo. Pero el ahorro no es significativo y, además, siempre podemos cambiar de opinión a última hora y volver a usar dos pulsadores en lugar de uno, sin tener que volver a modificar la clase. O incluso tener unos con un pulsador y otros con dos.
Voy a ver si hago el montaje con un Arduino MEGA y pruebo a juntar todo el código. Con los cuatro servos y los dos motores paso a paso. Para que no tengas que estar modificando las constantes del código; no estaría de más, si lo tienes ya más o menos definido, que me dijeras los pines del Arduino MEGA a los que vas a conectar cada cosa.
Me he fijado en que parece que ajustas el inicio y fin de la posición del servo usando el segundo y tercer parámetro de servo.attach(). Creo que es mejor y más fácil no usar esos parámetros, sino configurar el ángulo de “recto” y “desvío” de cada servo. No tiene por qué se 0º y 45º, sino cualquier valor arbitrario entre 0 y 180 grados. Además, esto facilita el configurar desvíos en que “recto” ha de tener un ángulo mayor que “desvío”. Es decir, en lugar de 0º ser vía recta y 45º ser desviada, podría ser 50º vía recta y 10º desviada.
Además de poner lo de la luz parpadeando mientras se realiza el cambio de aguja. Tal vez, añadiendo dos pulsadores más, se podría tener la posibilidad de memorizar en la EEPROM las dos posiciones de cada servo y configurarlos con el propio programa. Por ejemplo: el programa arranca y funciona normal. Si se mantienen pulsado esos dos botones a la vez durante tres segundos, pasa al modo “configuración”. Todos las luces de los cambios de aguja parpadean. Si se pulsa el botón de uno de los cambios de agujas, la luz de la posición en que está parpadea más rápido y la otra se apaga. Ahora se puede ajustar la posición de la aguja grado a grado aumentando o disminuyendo un grado pulsando uno de los dos botones de configuración. Así no hay que estar modificando, recomplilando y cargando el código del Arduino para probar y ajustar los servos.
Cierto es que cada cambio/mejora lleva su tiempo y no se lo dedico muy a menudo. Pero, si no llevas prisa, creo que vale la pena.