Buenas noches
Otra vez vuelvo escribir sobre programa de control rotor K3NG. En esta ocasión he cargado la última versión que se encuentra en esta página
https://github.com/k3ng/k3ng_rotator_controller/tree/master/k3ng_rotator_controller
Como placa Arduino he usado en esta ocasión Arduino Mega .
Tras cargar el programa primero he configurado el display que por defecto venía 20x4 y yo he cambiado a 16x2. Cargué el programa y el display funciona bien . El segundo paso era configurar la entrada del potenciómetro y eligi A0 , luego pulsador manual CW como A1 y CWW como A2. Hasta aquí todo bien . Pero a la hora de configurar el encoder para mandar manualmente la posición no funciona bien ( en Arduino Uno todo funcionaba )
He puesto como start/stop SW entrada A3 y CLK como A4 y DT A5 pero no funciona. Luego cambié por los dos últimos s A14 y A15 y tampoco. También los puse en los pines 21 SCL y 20 SDA y tampoco.
No conozco bien la programación Arduino pero siempre pensaba que podría aprovechar cualquier entrada desde A0 hasta A15
Puede ser que hay que activar la opción de emplear el encoder en el programa pero eso ya no lo sé.
Hay algo que hago mal ?
EC4AGT
Wojtek
73
Para las entradas del encoder y utilizando una MEGA puedes utilizar dos entradas digitales pero antes debes activar las resistencias PULLUP, descomentando #define OPTION_ENCODER_ENABLE_PULLUPS en el archivo rotator_features.h o en su defecto deberías colocar dos resistencias externas PULLUP. En la wiki de Arduino tienes mucha literatura sobre encoder.
En cualquier caso, el encoder funciona en este programa de forma deficiente ya que no sigue bien la velocidad de giro del encoder y se comporta de forma errática, por lo menos en mi experiencia. Estoy esperando un potenciómetro multivuelta para probar un preset con potenciómetro en lugar de encoder. En cualquier caso como preselector es mejor utilizar un programa de direccionamiento por software, en mi caso utililizo el pstRotator que me va de fábula enlazando con el Log4.
He revisado la programación de Arduino para encoders y, para que funcionen bien hay que programar sobre las entradas que manejan interrupciones, probablemente el equipo de K3NG habrá valorado que para un encoder manual no es necesario. El Arduino Mega dispone de 6 interrupciones, en los pines 2, 3, 21, 20, 19 y 18 respectivamente y dispones de librerías especializadas. Pero para utilizar el código de K3NG con una programación diferente para el encoder, habría que sustituir la función check_preset_encoder() que se complica para prever todos los tipos de encoder que se pueden manejar desde el programa.
En cualquier caso para no complicarte la vida, como te he indicado asigna dos entradas digitales y activa las resistencias internas PULLUPS, tendría que funcionar a la primera, si no es así, revisa las conexiones y si aún no funciona y quieres saber porqué, activa el depurador #define DEFAULT_DEBUG_STATE 1 (a uno HIGH está activado y a 0 LOW está desactivado y descomenta la línea #define DEBUG_PRESET_ENCODERS. En este caso podrás comprobar en el monitor serie si cuando mueves el encoder se activan los pines y en qué dirección. Para mayor claridad asegúrate de comentar la línea #define DEBUG_DUMP sobre todo, pero no deberías tener otra línea de depuración activa. Las instrucciones de depuración en las últimas versiones están en el archivo rotator_debug_log_activation.h.
Suerte. Enio
Edito: En Arduino NANO y UNO no puedes utilizar como entradas las A6 y A7, tampoco las digitales 0, 1 y 13 tanto en las anteriores como en MEGA tampoco es conveniente utilizar las puertas SDA y SCL que están en A4 y A5 de NANO y UNO y D20 y D21 en MEGA;
La cultura del esfuerzo se cultiva desde la motivación, no mediante el castigo como algunos quisieran.
http://www.enioea2hw.wordpress.com
73, Enio
Gracias Enio
Sobre entradas que mencionas, 2,3,18,19,20 y 21 lo he leído en otro artículo. Y como escribir en mi carta no funcionaban. Sera como dices que no está activada alguna línea más.
El encoder en su placa pcb ya trae las resistencias y como digo tanto en Nano como en Uno funcionaba correctamente.
En MEGA he puesto así:
A0 entrada potenciómetro
A1 CW manual
A2 CWW manual
A3 CW desde encoder CLK
A4 CWW desde encoder DT
A5 Start/Stop desde encoder SW
A6 Parking pulsador
En manu funciona pero desde encoder no.
Ahora voy hacer cambios que me comentas y voy realizar pruebas.
Gracias de nuevo por tu ayuda
EC4AGT
Wojtek
73
Salvo la entrada de tensión azimuth (potenciómetro del rotor) que es analógica, el resto de las E/S, botones manuales, pin 1(CLK) y 2 (DTY) del encoder, swith del encoder y pulsador del parking son digitales. Es cierto que puedes definir entradas analógicas como digitales cuando ocupas demasiadas entradas, pero en una MEGA no tiene sentido. La entrada A6 puede que no te funcione correctamente y ocupas las A4 y A5 que podrías usarlas para un display con adaptador I2C.
Las últimas versiones desde 13062020 están dando problemas como la lectura y escritura de la EEPROM. A mi me está funcionando bien la versión 13062020 y estoy trabajando con la 01072020 que me está dando problemas de salida al display. Voy a poner un mensaje en la lista de correo y cuando la tenga lista te puedo enviar una copia.
La cultura del esfuerzo se cultiva desde la motivación, no mediante el castigo como algunos quisieran.
http://www.enioea2hw.wordpress.com
73, Enio
Buenos dias
Esta es la parte del programa donde estan ajustes del encoder:
#define FEATURE_AZ_PRESET_ENCODER // Uncomment for Rotary Encoder Azimuth Preset support
// #define FEATURE_EL_PRESET_ENCODER // Uncomment for Rotary Encoder Elevation Preset support (requires FEATURE_AZ_PRESET_ENCODER above)
#define OPTION_ENCODER_HALF_STEP_MODE
//#define OPTION_ENCODER_ENABLE_PULLUPS // define to enable weak pullups on rotary encoder pins
//#define OPTION_INCREMENTAL_ENCODER_PULLUPS // define to enable weak pullups on 3 phase incremental rotary encoder pins
//#define OPTION_PRESET_ENCODER_RELATIVE_CHANGE // this makes the encoder(s) change the az or el in a relative fashion rather then store an absolute setting
#define OPTION_PRESET_ENCODER_0_360_DEGREES
He activado la primera linea y la que me has dicho las tenia activadas y encoder funcionaba pero mal ,pruebe desactivar y funciona igual de mal.
Intentare buscar alguna version anterior del programa y sino volvere a Arduino Uno , donde todo funcionaba bien. Lo unico es que me va faltar una salida
Saludos
EC4AGT
Wojtek
73
#define FEATURE_YAESU_EMULATION
#define OPTION_GS_232B_EMULATION
#define LANGUAGE_SPANISH
#define FEATURE_AZ_POSITION_POTENTIOMETER
#define FEATURE_RFROBOT_I2C_DISPLAY
#define FEATURE_AZ_PRESET_ENCODER
#define OPTION_ENCODER_HALF_STEP_MODE
#define OPTION_ENCODER_ENABLE_PULLUPS
#define OPTION_DISPLAY_STATUS
#define OPTION_DISPLAY_HEADING
#define OPTION_DISPLAY_DIRECTION_STATUS
Creo que estás utilizando los encoders chinos que vienen con las resistencias PULLUP colocadas. Yo prefiero utilizar un encoder limpio y montarlo en una plaquita de circuito impreso perforado y añadirle un par de condensadores de 10nF a masa en cada una de los dos pines. La PULLUPS internos funcionan bien y no hay porqué añadir componentes externos y, además, la velocidad de conmutación continua de dos interruptores produce "ruido". Con esta configuración funciona el encoder en una MEGA aunque el funcionamiento es algo errático.
¡Ah...! El display con el adaptador de puerto I2C funciona bien y no es tan difícil de ajustar como pensaba. La otra imagen es un pantallazo del contenido de la EEPROM que te puede dar una idea de las posibilidades del depurador que ahora puedes manejar con una placa MEGA
La cultura del esfuerzo se cultiva desde la motivación, no mediante el castigo como algunos quisieran.
http://www.enioea2hw.wordpress.com
73, Enio
Buenas tardes
Yo tengo unos cuantos encoder sueltos , sin placa pcb . Los puedo usar ?
Por otro lado estoy pensando desoldar las resistencias de la placa pcb y soldar los condensadores. Creo que se los puede sustituir
PS
Que version K3NG usas , pregunto porque en la ultima que tengo yo lo de activar I2C no me va bien , sera que algo hago mal
Despues de activar lo que me has comentado aparece esto :
#if defined(FEATURE_RFROBOT_I2C_DISPLAY)
LiquidCrystal_I2C lcd(0x27,16,2);
rotator_k3ngdisplay.cpp:57:24: error: conflicting declaration 'LiquidCrystal_I2C lcd'
LiquidCrystal_I2C lcd(0x27,16,2);
Y por lo ultimo , me podrias pasar el link con la version 13062020 porque no encuentro , la que tengo ahora es
EC4AGT
Wojtek
73
Si los puedes sustituir puede ser una solución. Ya tengo un código estable de la versión 20200701 he modificado la lectura de datos del potenciómetro de posición. Normalmente utilizo una media de 100 lecturas que es lo que he aplicado:
int analogReadEnhanced(uint8_t pin){
float raw_summa = 0.0;
float raw_readings = 100;
for (int i = 1; i <= raw_readings; i++) {
raw_summa += analogRead(pin);
}
return int(raw_summa / raw_readings);
}
analogRead() lee la tensión en formato dogital (ADC de 10 bit), el valor de la tensión se calcula: tensión = (raw_reading * 5) / 1023. donde 5 es la tensión aplicada al divisor, raw_reading es la lectura que devuelve la toma media del pot del rotor y 1024 el número máximo que pude leer un ADC de 10bit. Una lectura por cada ciclo produce alteraciones debidas al ruido, por eso es adecuado aplicar la media de unos cientos de lecturas. La función se puede completar descartando lecturas inferiores a 0 y superiores a 1023 o, mejor fuera de los límites de la lectura máxima o mínima.
K3NG implementa una función que actúa con un porcentaje de corrección de las desviaciones medias
#define AZIMUTH_SMOOTHING_FACTOR 50 // value = 0 to 99.9
Es una función compleja, yo la he activado al 50%, pero es más efectiva para la estabilidad extraer la media de un mínimo de lecturas, el tiempo necesaria para leer 100 lecturas y calcular la media es inferior a 10 milisegundos por lo que se puede sofisticar la lectura evaluando antes de la suma una desviación del máximo o mínimo, incluso de una media progresiva sin afectar a la velocidad teniendo en cuenta que en el caso de un rotor en movimiento las lecturas de espacian un segundo.
Si alguien desea una copia por privado.
La cultura del esfuerzo se cultiva desde la motivación, no mediante el castigo como algunos quisieran.
http://www.enioea2hw.wordpress.com
73, Enio
Respecto al display I2C se ajusta en la librería rotator_k3ngdisplay.cpp y rotator_k3ngdisplay.h
Decomentar la opcion #define FEATURE_RFROBOT_I2C_DISPLAY y deshabilitar la opción // #define FEATURE_4_BIT_LCD_DISPLAY
La cultura del esfuerzo se cultiva desde la motivación, no mediante el castigo como algunos quisieran.
http://www.enioea2hw.wordpress.com
73, Enio
Gracias
Luego , por la noche intentaré programar de nuevo
Saludos
EC4AGT
Wojtek
73
QDURE - https://qsl.ure.es
Imprime y confirma tus QSL en tan solo tres click.
Nunca fue tan fácil y cómodo
el confirmar tus contactos.
TIENDA ONLINE URE
Publicaciones, mapas, polos, camisetas, gorras, tazas, forros polares y mucho más...
WEBCLUSTER EA4URE
Conoce el nuevo WebCluster de URE, ahora con nuevos filtros e información y compatible con GDURE