sábado, 18 de enero de 2014

Un proyecto dando vueltas, HZRotor de LU7HZ

 Voy por la segunda iteración del proyecto de controlador automático de rotor, en mi caso un Walmar de servicio pesado que opero desde hace tiempo con un controlador manual oportunamente compartido en este blog.
En aquella oportunidad utilicé un PIC 12F675, uno de los mas pequeños posibles, y logré exitosamente implementar el controlador automático tanto en su modo remoto soportando el protocolo EZ-ROTOR (compatible DCU-1) como semi-automático estableciendo un acimut de referencia y haciendo que el controlador produzca la rotación hasta alcanzar esa referencia, aquella implementación no tenía modo manual pues asumía operar en paralelo con el controlador manual existente. Aquel diseño funcionó bien en el banco de pruebas, con el rotor siendo simulado mediante un reostato. Lamentablemente no funcionó adecuadamente con el rotor real, fundamentalmente por problemas en el sensado de posición probablemente dañado, con una respuesta claramente alineal y con mucho ruido haciendo que la función semi-automática fuera inusable.
Originalmente había pensado utilizar una placa Arduino One con este propósito, pero una vez que tuve la placa y la empecé a usar en otros proyectos me quedó claro que era un desperdicio "enterrarla" en un proyecto donde los requisitos del procesador y sus capacidades de entrada/salida son tan modestos.
Sin embargo, posteriormente conseguí un par de placas Arduino Nano, versión reducida pero aún así de prestaciones muy sorprendentes. Asi que finalmente me decidí a retomar el proyecto. Desde el punto de vista del desarrollo la placa Nano es mucho mas pequeña y viene en un formato DIP de 30 contactos que permite facilmente integrarla en un circuito (por ahora en un protoboard) con el resto de los componentes.
Electricamente la placa funciona con +5V alimentado desde una conexión USB desde la PC, la que al mismo tiempo se desdobla como un puerto serie emulado. Ese puerto serie se puede usar en desarrollo para cargar el firmware en memoria flash como una vez en funcionamiento para permitir el comando desde programas funcionando en la PC. Los distintos botones de control son CW (rotar en sentido horario), CCW (rotar en sentido anti horario), SET (establecer referencia semi-automática) y AUTO (comenzar movimiento del rotor a la referencia). Hay dos señales digitales de salida que activan por medio de respectivos transistores relays para girar al rotor en un sentido u otro.

Ese sistema de activación podría reemplazarse por componentes de estado sólido pero tenía mas a mano relays electromecánicos convencionales. El controlador tiene dos entradas analógicas, una con la señal de realimentación del rotor que es una tensión entre 0 y 12V (teóricamente) proporcional a la rotación. En la configuración en que lo utilizo tanto la tensión 0V como +12V corresponde a 180 grados (Sur) en ambos lados de la carrera, o sea que el norte es también 0 y 360 grados correspondiente a aproximadamente la mitad del voltaje (~6V). Esta tensión debe ser reducida porque el máximo que toleran las puertas analógicas es de +5V, lo que se hace con un potenciometro que hay que ajustar cuidadosamente para no exceder el máximo. Una segunda entrada analógica alimenta una referencia derivada de los +5V de la placa con un divisor de tensión, esa segunda entrada es para definir un acimut de referencia en el modo automático.
En el modo MANUAL presionando el interruptor CW hace que el rotor gire en un sentido y CCW en el otro; el firmware controla los topes y desactiva el control manual cuando los alcanza.
En modo automático se establece la referencia con el interruptor SET presionado, al presionar el interruptor AUTO el firmware activa el rotor hasta que alcance el valor establecido con la referencia, mientras el interruptor SET está presionado el firmware ignora las indicaciones del botón AUTO.
En el modo remoto el firmware responde a los comandos del protocolo EZ-ROTOR. No todos los comandos del protocolo son implementados, los que implementa son los siguientes:
  • Comienza a rotar hacia el acimut nnn (AP1nnn;).
  • Reporte el acimut corriente (AI1;), reporta el acimut de la referencia mientras SET está en bajo.
  • Detiene la rotación inmediatamente (ST1;).
  • Comienza a rotar hacia el acimut indicado en el último comando AP1 (AM1;).
  • Detener la rotación y hacer reset de estado (;).
Este conjunto de comandos es soportado por un número de programas, entre ellos de mi interés por N1MM a traves del programa N1MMRotor (ver figura). Mi idea original era utilizar el adaptador Ethernet de la placa Arduino One para incluir en el proyecto un mini Web Server que me permitiera utilizar un browser como interfaz gráfica (o incluso controlar el rotor via Internet); la Arduino Nano no tiene tanta facilidad para un puerto Ethernet y eso desvaneció ese aspecto del proyecto. Sin embargo, una vez implementado me doy cuenta que el programa N1MMRotor termina actuando como la interfaz gráfica que había imaginado originalmente. El acceso por Internet sigue siendo posible, indirectamente, tomando control de la PC en forma remota y utilizando la interfaz gráfica.
Se aplica una serie de criterios de prioridad y precedencia para solucionar conflictos por la activación simultanea de mas de un modo, por ejemplo manual con automático o manual con un comando remoto.
El microcódigo, preliminar aún y sobre el que estoy continuando la depuración y prueba, puede obtenerse aqui. Este tiene que compilarse y cargarse en la placa Arduino mediante el IDE de desarrollo de esa plataforma. No hay ninguna razón para que no funcione en otras plataformas aparte de la NANO.



No hay comentarios:

Publicar un comentario

Buscar este blog

Vistas de página en total