Rotor de antena con Arduino

Cabina del mando

Hace más de cuatro años que monté el controlador de rotor basado en el software de K3NG. Utilicé una placa Arduino NANO.  Durante este tiempo, el mando ha cumplido su cometido, pero el código que utilicé entonces ya es antiguo, estaba modificado por un compañero y además, dejé pendientes algunos cambios. Con la experiencia adquirida durante estos años programando C++ me he atrevido con la versión completa y actualizada del código con el objetivo de incluir el control del rotor desde los programas HRD como logbook y N1MM en concursos.

He renovado también el hardware reutilizando el trafo y los pulsadores de un mando Kenpro y he incorporando un UDN2981AT para controlar los relés.

Después de estudiar a fondo el código de K3NG, me he convencido de que lo más sensato es dejar que el compilador sea el encargado de “podar” las funciones y características que no se necesitan a base de comentar y descomentar características (#FEATURES) y de que, lo más importante para entender el funcionamiento, son las llamadas a instancias dentro de setup() y especialmente del bucle loop().

En este trabajo, voy a describir el diseño del mando y la adaptación del código para rotores simples que obtienen la información acimutal de un potenciómetro, giran con un motor de 24/28 Vca e incluyen la posibilidad de girar más de 360º (“overload”), tales como los Yaesu y Kenpro 450, 600, 800, etc. El mando incluye un preselector de dirección basado en un encoder rotatorio con pulsador de inicio y un display 1602 con un bus de 4 bit.

HARDWARE

Cabina

La parte electrónica la he divido en cuatro módulos :

La fuente de alimentación .-

Necesitamos tres tensiones, 28 Vca para el motor del rotor, 12 Vcc para los relés y 5 Vcc para el Arduino y display. El trafo, recuperado de un viejo mando, tiene dos devanados secundarios. El primero entrega 28 V para el rotor, el segundo 11V para alimentar los relés, el Arduino y el display. La fuente incluye dos reguladores de tensión. Una LM7012 (se puede omitir) y LM7005 montadas en una placa perforada estándar de 24 x 10 puntos componen la fuente.

El shield para Arduino NANO .-

Circuito en tarjeta perforada de doble cara, los trazos en azul corresponden al lado de los componentes

Está realizado con una placa perforada estándar de 24 x 18 puntos. Las pistas se trazan con alambre de cobre plateado de 0,5mm. La placa contiene el Arduino NANO , los escasos componentes pasivos y las entradas y salidas sobre conectores Molex KK254; incluye salidas para LEDs indicadores de “overload” y rumbo, si se necesitan.

Los relés .-

módulo relés

El módulo utiliza otra placa perforada estándar de 24 x 10 puntos e incorpora dos relés Finder 41.61.9.012. La bobina de los relés es de 12V de bajo consumo. Los contactos están sobredimensionados ya que puede conmutar hasta 250V/16A. El módulo incluye el controlador UDN2981AT, un terminal Molex KK254 de pines pata la entrada (GND, 12Vcc, Relé CW y Relé CCW) y una clema para el control de rotación del motor.

El display .-

módulo display

Los displays estándar de matriz de 2 o 4 líneas y 16 o 20 columnas son los más sencillos de adaptar con el código y el 1602 y son suficientes para facilitar la información necesaria sobre el rumbo y acción del rotor. Modificando las características (#FEATURES) del código, se pueden utilizar otros modos de comunicación, aunque ésto puede dar lugar a problemas con las librerías necesarias. Por estas razones he utilizado un display 1602 de 16 columnas y 2 líneas.

He utilizado el bus de 4 bit para la comunicación entre el Arduino y el display en lugar de un adaptador con bus I2C para simplificar el software. Con el bus I2C se hubieran liberado 6 I/O digitales a cambio de las A4 y A5 pero, aunque justas, el conjunto de las i/O del NANO son suficientes utilizando algunas salidas analógicas como digitales.

El módulo de conexión al display se ha montado en otra placa perforada de 24 x 10 puntos. Incluye el potenciómetro de contraste y un conector hembra de 16 pines en el que se inserta el display. Las entradas de alimentación y datos se realizan en terminales Molex de la serie NN254

Los módulos y componentes se han montado en una caja Minibox 31040114 de 125x60x225 cm. En el panel frontal se han colocado dos interruptores rescatados de una vieja consola de control Kenpro para el mando manual, además del encoder y un interruptor. En el panel trasero se ha incluido un conector tipo micrófono de seis pines para el cable del rotor y la entrada de alimentación.

SOFTWARE

Características del controlador.

  • Motor de CA de 24-28 voltios de fase dividida (split phase) de tres cables.
  • Sensor de acimut con potenciómetro.
  • Mando manual de giro.
  • Preajuste con encoder y pulsador de arranque.
  • Display con indicación de posición estática y dirección de giro.
  • Protocolo de comunicación Yaesu GS-232A y GS232B

Código (Sketch).

El proyecto para el controlador de rotores de antena basado en las placas de Arduino, es un proyecto liderado por Anthony Good (K3NG). El código es abierto, lo cual indica que se puede modificar y contiene aportaciones de muchos colegas internacionales. El objetivo, es un programa que permita adaptar las prestaciones y características para controlar un número importante de diferentes rotores.

Toda la información relacionada con el proyecto, se pude encontrar en esta dirección URL. Las últimas versiones se puede descargar del repositorio de GitHub que incluye el archivo principal, las librerías y una “wiki” extensa. Hay también una lista de correos muy activa. Para este trabajo he utilizado la versión 2020.03.11.01.

El sketch incluye 32 archivos. El archivo principal se compone de más de 13.000 líneas. Una parte del código está escrito para proporcionar procesos de depuración en el monitor serie cuya comprensión sólo está al alcance de los desarrolladores y de programadores avanzados. La parte más importante del código, sirve para que el compilador seleccione las líneas que corresponden a las características de varios diseños de hardware (kits de terceros), de diferentes sensores de elevación y acimut, diferentes displays o de prestaciones como acceso a Internet, ethernet para control remoto, GPS o RTCs. También incluye líneas para seleccionar velocidades de arranque o parada progresivas, liberación o activación de frenos mecánicos o eléctricos o posiciones de aparcamiento cuando los rotores utilizados permites estas prestaciones. Cinco archivos están vacíos por lo que se pueden borrar si se tiene experiencia con el IDE de Arduino.

El archivo principal k3ng_rotator_controller.ino no debe modificarse a menos que se tenga experiencia con la programación de C++.

De los 27 archivos restantes, solo son necesarios 9 para el proyecto actual, aunque no se pueden borrar sin modificar cientos de líneas en el fichero principal. De estos 9 archivos vamos a modificar algunas líneas de los 3 siguientes:

rotator_features.h
rotator_pins.h
rotator_settings.h
Ficheros que requieren modificación

Modificar el fichero rotator_features.h. Para que una característica (#FEATURE) esté activa es necesario borrar las los columnas de la izquierda, por ejemplo //#define OPCION_LANGUAGE_SPANISH estará inactiva y #define OPCION_LANGUAGE_SPANISH está activa. A continuación la tabla con las características que deben quedar activas:

#define FEATURE_YAESU_EMULATION          
#define LANGUAGE_SPANISH
#define FEATURE_AZ_POSITION_POTENTIOMETER  
#define FEATURE_AZ_PRESET_ENCODER         
#define OPTION_ENCODER_HALF_STEP_MODE
#define OPTION_ENCODER_ENABLE_PULLUPS       
#define OPTION_GS_232B_EMULATION  (1)      
#define OPTION_DISPLAY_STATUS
#define OPTION_DISPLAY_HEADING_AZ_ONLY
#define OPTION_DISPLAY_DIRECTION_STATUS
#define FEATURE_4_BIT_LCD_DISPLAY
#define OPTION_SAVE_MEMORY_EXCLUDE_EXTENDED_COMMANDS (2)
#define OPTION_SAVE_MEMORY_EXCLUDE_BACKSLASH_CMDS (3)
#define DEFAULT_DEBUG_STATE 0 (2)
#define OPTION_PULSE_IGNORE_AMBIGUOUS_PULSES 
#define OPTION_AZ_MANUAL_ROTATE_LIMITS
#define OPTION_PRESET_ENCODER_RELATIVE_CHANGE
Características activas
  • 1 Esta opción inhibe la grabación de los límites de rotación en la EPROM, manteniendo un giro máximo de 450º. Si se desea limitar a 360º (por ejemplo, para un G-600). Descomentar esta línea o ajustar el giro máximo y grabas la EPROM con la opción /E.
  • 2 Opción para ahorrar memoria, necesaria cuando se utiliza una placa Arduino NANO o UNO.
  • 3 Opción que inhabilita el depurador.

Definir los pines en el fichero rotator_pins.h. Estos pines se corresponden con los indicados en el diseño del módulo Arduino de este trabajo.

#define rotate_cw 11       //Relé derecha       
#define rotate_ccw 12       //Relé izquierda   
#define button_cw A2      //Pulsador manual rotor derecha
#define button_ccw A1     //Pulsador manual rotor izquierda  
#define rotator_analog_az A0 //Pin del sensor acimut (potenciómetro)
#define lcd_4_bit_rs_pin 10 //Salida a RS display
#define lcd_4_bit_enable_pin 9 //Salida a E display
#define lcd_4_bit_d4_pin 5 //Salida a D4 display
#define lcd_4_bit_d5_pin 6 //Salida a D5 display
#define lcd_4_bit_d6_pin 7 //Salida a D6 display
#define lcd_4_bit_d7_pin 8 //Salida a D7 display
#define az_rotary_preset_pin1 4   //Salida derecha encoder       
#define az_rotary_preset_pin2 3   //Salida izquierda encoder   
#define preset_start_button A5 //Pulsador central encoder (arranque)
Definición de los pines de Arduino

Definir las características del controlador en el archivo rotator_settings.h

#define AZIMUTH_ROTATION_CAPABILITY_DEFAULT 360
#define ANALOG_AZ_OVERLAP_DEGREES 0 
#define AZIMUTH_STARTING_POINT_DEFAULT 180
#define ANALOG_AZ_FULL_CCW 2
#define ANALOG_AZ_FULL_CW 1021
#define CONTROL_PORT_BAUD_RATE 9600
#define LCD_COLUMNS 16 
#define LCD_ROWS 2
#define LCD_AZ_ONLY_HEADING_ROW 2
#define LCD_AZ_ONLY_HEADING_FIELD_SIZE 20
#define LCD_STATUS_ROW 1
#define LCD_STATUS_FIELD_SIZE 20
#define LCD_DIRECTION_ROW 1
Ajustes

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s