domingo, 7 de octubre de 2012

Control de Rotor de LU7HZ (bocetos)

 He podido empezar la construcción de los primeros prototipos para el controlador automático de rotor de antena. No he recibido aún la tarjeta Arduino Ethernet Shield que me permita utilizar la placa Arduino One como controladora.
Me decidí entonces luego de algunos experimentos de rutinas aisladas en   MikroPascal Pro en hacerlo utilizando un PIC 12F675 como controlador.
Aun no he podido hacer andar la parte del programa que implementa el puerto serie por software (este PIC no tiene un UART incorporado).
Sin embargo, la totalidad del programa ya está escrito por lo que tengo una razonable confianza que entrará en la memoria flash de 1K y las pocas docenas de bytes de memoria RAM.
Es claro que sin lujos, al finalizar el programa que termina siendo implementado en un hibrido entre Pascal y Assembler ocupa algo mas de 980 bytes (algunas docenas de bytes menos que el máximo posible).
La interfaz de hardware es simple, el procesador tiene 6 puertos de entrada y salida; dos lineas se usan como salida para controlar al rotor (giro en sentido horario y anti-horario), dos para entrada-salida serie, una para sensar la posición del rotor y otra para comandar el modo automático. El comando de modo automático conmuta si se sensa la posición del rotor mismo o de la referencia guía (para ajuste semiautomático). El software sensa si este comando está alto o bajo para decidir si la lectura corresponde al rotor o a la referencia local. Si estos son diferentes dentro de un margen del +/- 5% se activa el rotor en el sentido que corresponda y se procede automáticamente a girarlo hasta que la posición del rotor iguale a la referencia. Es curioso como un diseño embebido difiere de un programa convencional, durante algun tiempo tuve dificultades en lograr que el programa funcionara correctamente en su función semiautomática; en el emulador lo hacía correctamente pero en el hardware real no. Terminó siendo que se detectaba que el switch de comando pasaba a alto e inmediatamente se leia la posición de acimuth.... cuando aún el relay no había conmutado (situación que solo podría durar algunos pocos microsegundos...), bastó un pequeño retardo para que todo funcionara correctamente; pero muestra como técnica de programación la necesidad de siempre ver la "pelicula" en este tipo de software (imaginar la secuencia de tiempos mas que la lógica en si).
Se utiliza un integrado MAX232 como conversor TTL/RS232 para el puerto serie, es una solución económica y efectiva para convertir los niveles correspondientes. Todo el manejo de control se hace con relays para que el contacto se independice de las tensiones presentes, pero con el rotor en particular que tengo (Walmar) las tensiones son menores a 30V cc por lo que podría perfectamente utilizarse  un transistor con ese propósito. Para independizarme del rotor fisico durante las pruebas agregué un potenciometro adicional para simular al del rotor mismo y poder hacer pruebas locales, este "volará" cuando empiece con las pruebas en el rotor real.
El diseño todavia puede cambiar en la medida que finalice el firmware, en particular el puerto serie. El puerto serie es necesario para poder comandar el controlador usando el protocolo Hy-Gain DCU-1. Hasta ahora estoy intentando con un microcódigo que implementa un puerto half-duplex (no puede recibir y transmitir al mismo tiempo) el que creo es suficiente para este propósito; en caso que la validación del diseño muestre que no es asi el implementar un puerto serie full duplex por software es un poco mas complicado y tengo mis dudas que logre meterlo en el PIC 12F675 (si solo estuvera el puerto serie por supuesto que entraría, solo que también tienen que entrar las otras funciones del controlador). En ese caso tendría que ver como utilizar otro PIC (quizás el PIC 16F877 o similar), o directamente esperar la placa que me falta para hacerlo con la Arduino One.

3 comentarios:

  1. Hola Pedro, fijate que hay unos modulos para arduino de unos pocos dolares (al igual que el que compraste llamado Ethernet Shield) que son para controles de motores (creo que paso a paso). tal vez tenes toda la inteligencia en ese modulo y despues es un tema unicamente de convertir tensiones para que maneje el rotor real.
    73s de Mati LU9CBL

    ResponderEliminar
  2. Hola Mati, si los he visto, pero no tienen lógica alguna sino solo los actuadores, habilitan el uso desde las librerias.
    En realidad el rotor es impulsado por un motor de cierta envergadura el que se maneja con dos interruptores (uno para girar en cada sentido) y se lee la posición desde un reóstato que está arriba al cual se le inyecta +12Vcc y se va leyendo una tensión proporcional al acimut.
    Ciertamente se lo puede controlar bastante facil con la Arduino One pelada simplemente agregando un transistor a sendas salidas digitales (para activar en un sentido u otro) y leer el valor del reóstato desde cualquiera de las señales analógicas. El controlador con el 12F675 en caso de demostrar ser viable (de lo que estoy cerca) se implementa por un decimo del valor de la Arduino One; y si bien no puedo ponerle una página Web como tenia pensado si puedo tener el control semi-automático y la interfaz DCU-1 con la PC que es lo que realmente me importa. Existe también el interés experimental de ver si se puede implementar esto en solo 1K de memoria, cosa que hace algun tiempo recibía cierto grado de excepcismo en los foros. Todavia no lo tengo totalmente andando como para "cantar victoria" pero confío que a pesar de estar realmente muy justo de recursos si, que se puede.
    Ojala que pueda tener andando aunque sea una versión experimental para el CQ WW que se viene dentro de poco, muy justos los tiempos lamentablemente.

    ResponderEliminar
  3. Puedo usar orbitron para controlar un rotor a través del puerto rs232,y mandar los datos al arduino y este mueva el rotor según la posición del satélite gracias

    ResponderEliminar

Buscar este blog

Páginas vistas en total