URE foro pequeñas
Soft K3NG para cont...
 
Notificaciones
Limpiar todo

Soft K3NG para controlar rotor versión simple , dónde puedo encontrar ?

Página 2 / 2
EA2J
 EA2J
Mensajes: 3764
#342202  - 19 enero, 2020 11:58 

El módulo de relés montado en una placa perforada de doble cara.

 

 modulo reles imagen

La cultura del esfuerzo se cultiva desde la motivación, no mediante el castigo como algunos quisieran.
http://www.enioea2hw.wordpress.com
73, Enio

ResponderCitar
EC4AGT
Mensajes: 235
#342216  - 19 enero, 2020 19:18 

Buenas tardes

Por no complicarme mucho la vida estoy empleando los módulos de reles de Arduino de un y de cuatro reles. El modulo de un rele cuando controlo  el motor con el BTS7960 y de cuatro cuando uso tres reles , CW , CCW y BRAKE.

Ahora surgio un problema y no se que ha pasado , tengo hechas varias copias del programa que estaban funcionando correctamente. Los tenia grabados en un UNO y en un NANO y todos funcionaban correctamente. Pero ahora , no se lo que paso y el encoder rotativo del mando no va bien. Antes giraba a la izquierda y el valor bajaba y a la derecha subia. Ahora , no se porque girando tanto a la izquierda como a la derecha el valor baja . Hasta que he cambiado el encoder pero sigue igual.

 

/* position sensors - pick one for azimuth and one for elevation if using an az/el rotator */
#define FEATURE_AZ_POSITION_POTENTIOMETER //             AQUI TENGO ACTIVADO EL POTENCIOMETRO ENCODER
//#define FEATURE_AZ_POSITION_ROTARY_ENCODER
//#define FEATURE_AZ_POSITION_PULSE_INPUT
//#define FEATURE_AZ_POSITION_HMC5883L // HMC5883L digital compass support
//#define FEATURE_AZ_POSITION_GET_FROM_REMOTE_UNIT // requires FEATURE_MASTER_WITH_SERIAL_SLAVE or FEATURE_MASTER_WITH_ETHERNET_SLAVE
//#define FEATURE_AZ_POSITION_ADAFRUIT_LSM303 // Uncomment for azimuth using LSM303 compass and Adafruit library ( https://github.com/adafruit/Adafruit_LSM303) (also uncomment object declaration below)
//#define FEATURE_AZ_POSITION_POLOLU_LSM303 // Uncomment for azimuth using LSM303 compass and Polulu library
//#define FEATURE_AZ_POSITION_HH12_AS5045_SSI
//#define FEATURE_AZ_POSITION_INCREMENTAL_ENCODER

//#define FEATURE_EL_POSITION_POTENTIOMETER
//#define FEATURE_EL_POSITION_ROTARY_ENCODER
//#define FEATURE_EL_POSITION_PULSE_INPUT
//#define FEATURE_EL_POSITION_ADXL345_USING_LOVE_ELECTRON_LIB // Uncomment for elevation ADXL345 accelerometer support using ADXL345 library
//#define FEATURE_EL_POSITION_ADXL345_USING_ADAFRUIT_LIB // Uncomment for elevation ADXL345 accelerometer support using Adafruit library
//#define FEATURE_EL_POSITION_GET_FROM_REMOTE_UNIT // requires FEATURE_MASTER_WITH_SERIAL_SLAVE or FEATURE_MASTER_WITH_ETHERNET_SLAVE
//#define FEATURE_EL_POSITION_ADAFRUIT_LSM303 // Uncomment for elevation using LSM303 accelerometer and Adafruit library ( https://github.com/adafruit/Adafruit_LSM303) (also uncomment object declaration below)
//#define FEATURE_EL_POSITION_POLOLU_LSM303 // Uncomment for elevation using LSM303 compass and Polulu library
//#define FEATURE_EL_POSITION_HH12_AS5045_SSI
//#define FEATURE_EL_POSITION_INCREMENTAL_ENCODER
//#define FEATURE_EL_POSITION_MEMSIC_2125

//#define FEATURE_4_BIT_LCD_DISPLAY //Uncomment for classic 4 bit LCD display (most common)
//#define FEATURE_ADAFRUIT_I2C_LCD
//#define FEATURE_ADAFRUIT_BUTTONS // Uncomment this to use Adafruit I2C LCD buttons for manual AZ/EL instead of normal buttons
//#define FEATURE_YOURDUINO_I2C_LCD
#define FEATURE_RFROBOT_I2C_DISPLAY //         AQUI TENGO ACTIVADO EL DISPLAY I2C
//#define FEATURE_ANALOG_OUTPUT_PINS

//#define FEATURE_SUN_PUSHBUTTON_AZ_EL_CALIBRATION
//#define FEATURE_MOON_PUSHBUTTON_AZ_EL_CALIBRATION

/* preset rotary encoder features and options */
#define FEATURE_AZ_PRESET_ENCODER //  AQUI TAMBIEN TENGO ACTIVADO EL POTENCIOMETRO ENCODER
//#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

 

 

SW  va D9

DT va a D3

CLK va a D2

Arduino es NANO

 

Y para que no haya ningun confilcto he desactivado todas las entradas y salidas , solo estan activados los pines del potenciometro / encoder

EC4AGT

Wojtek

73

ResponderCitar
Inició el tema
EA2J
 EA2J
Mensajes: 3764
#342225  - 19 enero, 2020 23:07 

Bueno... puedo estar equivocado o quizá no he entendido bien, pero la opción

#define FEATURE_AZ_POSITION_POTENTIOMETER

Asume la tensión variable en una entrada analógica (la que hayas definido como sensor de posición) para indicar la orientación del rotor. En este caso no cabe un encoder sino un potenciómetro (si utilizar un encoder debería suprimir esa característica y activar la correspondiente a un encoder como AZ_POSITION).  Esta característica indica a Arduino que va a recibir una tensión entre 0 y 5V (0 a 1023 RAW detras del ADC) en función de la posición del potenciómetro que actúa como divisor.

#define FEATURE_AZ_PRESET_ENCODER

La primera instrucción es para definir el tipo de información de la posición actual del rotor. La segunda es para indicar que se puede establecer un preajuste mediante un encoder (absoluto o incremental, ojo)

Por el fallo que indicas pienso que puede estar más bien en la definición de los pines de entrada de los pulsos para el pin1 y pin2 del encoder. Revisa también todo los parámetros rotator_settings.h relacionados con el PRESET_ENCODER.

El pin SW es el switch del pulsado que llevas a 0 cuando está pulsado e inicia la rotación hacia el rumbo preseleccionado, DT y CLK son los pines 1 y 2

#ifdef FEATURE_AZ_PRESET_ENCODER
                    #define az_rotary_preset_pin1 0 // CW Encoder Pin
                   #define az_rotary_preset_pin2 0 // CCW Encoder Pin
#endif //FEATURE_AZ_PRESET_ENCODER

Asegúrate de que los dos pines están bien definidos, lo mismo que el tipo de encoder y los ajustes complementarios en rotator_settings. Yo no utilizo los encoders chinos montados en placa, utilizo un Alp absoluto de 20 posiciones.

 encoder

La cultura del esfuerzo se cultiva desde la motivación, no mediante el castigo como algunos quisieran.
http://www.enioea2hw.wordpress.com
73, Enio

ResponderCitar
EC4AGT
Mensajes: 235
#342581  - 28 enero, 2020 19:50 

Buenas tardes.

 

Por fin tengo casi todos los problemas solucionados excepto uno. Como en el programa K3NG  por defecto el display está configurado a 4 bit ( así lo entiendo ) y como no se cambiar a I2C pues hize una placa PCB como de Cedric . Con esto solucione el problema con el display. En principio he estado usando Arduino Nano pero finalmente he cambiado por el Uno. Tanto en el Nano como en el Uno el programa funciona bien pero en ambos tengo el mismo problema y no sé qué hacer. El motor de rotor controlo en dos maneras : una , en manual con dos pulsadores para girar a la izquierda y derecha. Otra , con un potenciometro-encoder . Las dos maneras funcionan pero con el encoder no va bien de todo. 

En manual , con los pulsadores , tanto a la izquierda como a la derecha el motor arranca suave y en rampa. Empieza despacio , alcanza la velocidad 100 por 100 y cuando falta unos 5 grados empieza bajar la velocidad y finalmente se para

 Aquí todo bien , pero al realizar control con el encoder , el motor arranca de golpe y se para de golpe cuando llega a su consigna. No logro que haga la rampa tanto accelerar como desacelerar. Por mucho que he revisado el programa no veo donde se configura esta opción. 

Alguno tiene una idea como lo puedo configurar ?

Saludos 

73

EC4AGT

 

 

 

EC4AGT

Wojtek

73

ResponderCitar
Inició el tema
EA2J
 EA2J
Mensajes: 3764
#342586  - 28 enero, 2020 21:42 

La función que detecta si se movido el encoder de preselección es muy compleja y, en mi opinión, mal resuelta, tiene 300 líneas y comienza (en el código que tengo) en la 1920. Puede ser interesante sacarla del contexto, limpiar las funciones que no interesan y analizar diagrama de flujo para averiguar cómo inicia el movimiento. Es muy probable que no hayan tenido en cuenta la definición de los cambios de velocidad de arranque y parada:

void check_preset_encoders(){

static unsigned long last_encoder_change_time = 0;
byte button_read = HIGH;
byte number_columns = 0;
static byte submit_encoder_change = 0;
static unsigned long last_preset_start_button_start = 0;
static unsigned long last_preset_start_button_kill = 0;
static unsigned long last_encoder_move = 0;

#ifdef FEATURE_AZ_PRESET_ENCODER
static unsigned long az_timestamp[5];
#endif // FEATURE_AZ_PRESET_ENCODER

#ifdef FEATURE_EL_PRESET_ENCODER
static unsigned long el_timestamp[5];
#endif // FEATURE_EL_PRESET_ENCODER

#ifdef FEATURE_AZ_PRESET_ENCODER
az_encoder_state = ttable[az_encoder_state & 0xf][((digitalReadEnhanced(az_rotary_preset_pin2) << 1) | digitalReadEnhanced(az_rotary_preset_pin1))];
unsigned char az_encoder_result = az_encoder_state & 0x30;
#ifdef DEBUG_PRESET_ENCODERS
static byte last_az_rotary_preset_pin1 = 0;
static byte last_az_rotary_preset_pin2 = 0;

if ((debug_mode) && (( last_az_rotary_preset_pin1 != digitalReadEnhanced(az_rotary_preset_pin1)) || ( last_az_rotary_preset_pin2 != digitalReadEnhanced(az_rotary_preset_pin2)))) {
debug.print("check_preset_encoders: az_rotary_preset_pin1: ");
debug.print(digitalReadEnhanced(az_rotary_preset_pin1));
debug.print(" az_rotary_preset_pin2: ");
debug.print(digitalReadEnhanced(az_rotary_preset_pin2));
debug.print(" encoder_result: ");
debug.print(az_encoder_result);
debug.println("");
}
last_az_rotary_preset_pin1 = digitalReadEnhanced(az_rotary_preset_pin1);
last_az_rotary_preset_pin2 = digitalReadEnhanced(az_rotary_preset_pin2);
#endif // DEBUG_PRESET_ENCODERS

#endif // FEATURE_AZ_PRESET_ENCODER

#ifdef FEATURE_EL_PRESET_ENCODER
el_encoder_state = ttable[el_encoder_state & 0xf][((digitalReadEnhanced(el_rotary_preset_pin2) << 1) | digitalReadEnhanced(el_rotary_preset_pin1))];
unsigned char el_encoder_result = el_encoder_state & 0x30;
#endif // FEATURE_EL_PRESET_ENCODER

#ifdef FEATURE_AZ_PRESET_ENCODER
if (az_encoder_result) { // If rotary encoder modified
az_timestamp[0] = az_timestamp[1]; // Encoder step timer
az_timestamp[1] = az_timestamp[2];
az_timestamp[2] = az_timestamp[3];
az_timestamp[3] = az_timestamp[4];
az_timestamp[4] = millis();

last_encoder_move = millis();

#ifdef DEBUG_PRESET_ENCODERS
char tempchar[12] = "";
if (debug_mode) {
debug.print("check_preset_encoders: az_timestamps:");
for (int y = 0; y < 5; y++) {
debug.print(" ");
dtostrf(az_timestamp[y],0,0,tempchar);
debug.print(tempchar);
}
debug.println("");
}
#endif // DEBUG_PRESET_ENCODERS

unsigned long az_elapsed_time = (az_timestamp[4] - az_timestamp[0]); // Encoder step time difference for 10's step

#ifdef OPTION_PRESET_ENCODER_RELATIVE_CHANGE
if ((preset_encoders_state == ENCODER_IDLE) || (preset_encoders_state == ENCODER_EL_PENDING)) {
if (az_request_queue_state == IN_PROGRESS_TO_TARGET) {
az_encoder_raw_degrees = target_raw_azimuth;
} else {
az_encoder_raw_degrees = raw_azimuth;
}
}
#endif // OPTION_PRESET_ENCODER_RELATIVE_CHANGE

// bbbbbb

#ifndef OPTION_PRESET_ENCODER_0_360_DEGREES
if (az_encoder_result == DIR_CW) {
#ifdef DEBUG_PRESET_ENCODERS
debug.print("check_preset_encoders: az CW");
#endif // DEBUG_PRESET_ENCODERS
if (az_elapsed_time < 250 /* mSec */) {
az_encoder_raw_degrees += (5 * HEADING_MULTIPLIER);
} else { az_encoder_raw_degrees += (1 * HEADING_MULTIPLIER); }; // Single deg increase unless encoder turned quickly then 10's step
// if (az_encoder_raw_degrees >=(360*HEADING_MULTIPLIER)) {az_encoder_raw_degrees -= (360*HEADING_MULTIPLIER);};
if (az_encoder_raw_degrees > ((azimuth_starting_point + azimuth_rotation_capability) * HEADING_MULTIPLIER)) {
az_encoder_raw_degrees =
((azimuth_starting_point * HEADING_MULTIPLIER)
/* + ((azimuth_starting_point+azimuth_rotation_capability)*HEADING_MULTIPLIER) - az_encoder_raw_degrees*/);
}
}
if (az_encoder_result == DIR_CCW) {
#ifdef DEBUG_PRESET_ENCODERS
debug.print("check_preset_encoders: az CCW");
#endif // DEBUG_PRESET_ENCODERS
if (az_elapsed_time < 250 /* mSec */) {
az_encoder_raw_degrees -= (5 * HEADING_MULTIPLIER);
} else { az_encoder_raw_degrees -= (1 * HEADING_MULTIPLIER); }; // Single deg decrease unless encoder turned quickly then 10's step
// if (az_encoder_raw_degrees < 0) {az_encoder_raw_degrees = (360*HEADING_MULTIPLIER);};
if (az_encoder_raw_degrees < (azimuth_starting_point * HEADING_MULTIPLIER)) {
az_encoder_raw_degrees = (((azimuth_starting_point + azimuth_rotation_capability) * HEADING_MULTIPLIER)
/*- (az_encoder_raw_degrees-(azimuth_starting_point*HEADING_MULTIPLIER))*/);
}
}
#else //ndef OPTION_PRESET_ENCODER_0_360_DEGREES
if (az_encoder_result == DIR_CW) {
#ifdef DEBUG_PRESET_ENCODERS
debug.print("check_preset_encoders: az CW");
#endif // DEBUG_PRESET_ENCODERS
if (az_elapsed_time < 250) { // Single deg increase unless encoder turned quickly then 10's step
az_encoder_raw_degrees += (5 * HEADING_MULTIPLIER);
} else {
az_encoder_raw_degrees += (1 * HEADING_MULTIPLIER);
}
if (az_encoder_raw_degrees > (360 * HEADING_MULTIPLIER)) {
//az_encoder_raw_degrees = (360 * HEADING_MULTIPLIER);
az_encoder_raw_degrees = 0;
//} else {
// if (az_encoder_raw_degrees < 0) {
// az_encoder_raw_degrees = 0;
// }
}
}
if (az_encoder_result == DIR_CCW) {
#ifdef DEBUG_PRESET_ENCODERS
debug.print("check_preset_encoders: az CCW");
#endif // DEBUG_PRESET_ENCODERS
if (az_elapsed_time < 250) { // Single deg decrease unless encoder turned quickly then 10's step
az_encoder_raw_degrees -= (5 * HEADING_MULTIPLIER);
} else {
az_encoder_raw_degrees -= (1 * HEADING_MULTIPLIER);
}
//if (az_encoder_raw_degrees > (360 * HEADING_MULTIPLIER)) {
// az_encoder_raw_degrees = (360 * HEADING_MULTIPLIER);
//} else {
if (az_encoder_raw_degrees < 0) {
//az_encoder_raw_degrees = 0;
az_encoder_raw_degrees = 359 * HEADING_MULTIPLIER;
}
//}
}
#endif //ndef OPTION_PRESET_ENCODER_0_360_DEGREES

last_encoder_change_time = millis(); // Encoder Check Timer

if (preset_encoders_state == ENCODER_IDLE) {
preset_encoders_state = ENCODER_AZ_PENDING;
} else {
if (preset_encoders_state == ENCODER_EL_PENDING) {
preset_encoders_state = ENCODER_AZ_EL_PENDING;
}
}

#ifdef DEBUG_PRESET_ENCODERS
debug.print("check_preset_encoders: az target: ");
dtostrf((az_encoder_raw_degrees / HEADING_MULTIPLIER),0,1,tempchar);
debug.println(tempchar);
#endif // DEBUG_PRESET_ENCODERS

} // if (az_encoder_result)
#endif // FEATURE_AZ_PRESET_ENCODER

#ifdef FEATURE_EL_PRESET_ENCODER

#ifdef OPTION_PRESET_ENCODER_RELATIVE_CHANGE
if ((preset_encoders_state == ENCODER_IDLE) || (preset_encoders_state == ENCODER_AZ_PENDING)) {
if (el_request_queue_state == IN_PROGRESS_TO_TARGET) {
el_encoder_degrees = target_elevation;
} else {
el_encoder_degrees = elevation;
}
}
#endif // OPTION_PRESET_ENCODER_RELATIVE_CHANGE

if (el_encoder_result) { // If rotary encoder modified
el_timestamp[0] = el_timestamp[1]; // Encoder step timer
el_timestamp[1] = el_timestamp[2];
el_timestamp[2] = el_timestamp[3];
el_timestamp[3] = el_timestamp[4];
el_timestamp[4] = millis();

last_encoder_move = millis();

unsigned long el_elapsed_time = (el_timestamp[4] - el_timestamp[0]); // Encoder step time difference for 10's step

if (el_encoder_result == DIR_CW) { // Rotary Encoder CW 0 - 359 Deg
#ifdef DEBUG_PRESET_ENCODERS
debug.println("check_preset_encoders: el CW");
#endif // DEBUG_PRESET_ENCODERS
if (el_elapsed_time < 250) {
el_encoder_degrees += (5 * HEADING_MULTIPLIER);
} else { el_encoder_degrees += (1 * HEADING_MULTIPLIER); }; // Single deg increase unless encoder turned quickly then 10's step
if (el_encoder_degrees > (180 * HEADING_MULTIPLIER)) {
el_encoder_degrees = (180 * HEADING_MULTIPLIER);
}
;
}
if (el_encoder_result == DIR_CCW) {
#ifdef DEBUG_PRESET_ENCODERS
debug.println("check_preset_encoders: el CCW");
#endif // DEBUG_PRESET_ENCODERS
// Rotary Encoder CCW 359 - 0 Deg
if (el_elapsed_time < 250) {
el_encoder_degrees -= (5 * HEADING_MULTIPLIER);
} else { el_encoder_degrees -= (1 * HEADING_MULTIPLIER); }; // Single deg decrease unless encoder turned quickly then 10's step
if (el_encoder_degrees < 0) {
el_encoder_degrees = 0;
}
;
}
last_encoder_change_time = millis(); // Encoder Check Timer

if (preset_encoders_state == ENCODER_IDLE) {
preset_encoders_state = ENCODER_EL_PENDING;
} else {
if (preset_encoders_state == ENCODER_AZ_PENDING) {
preset_encoders_state = ENCODER_AZ_EL_PENDING;
}
}

#ifdef DEBUG_PRESET_ENCODERS
debug.print("check_preset_encoders: el target: ");
char tempchar[16];
dtostrf(el_encoder_degrees / HEADING_MULTIPLIER,0,1,tempchar);
debug.println(tempchar);
#endif // DEBUG_PRESET_ENCODERS

} // if (el_encoder_result)

#endif // FEATURE_EL_PRESET_ENCODER

if ((preset_encoders_state != ENCODER_IDLE) && (!submit_encoder_change)) { // Check button or timer
if (preset_start_button) { // if we have a preset start button, check it
button_read = digitalReadEnhanced(preset_start_button);
if (button_read == BUTTON_ACTIVE_STATE) {
submit_encoder_change = 1;
last_preset_start_button_start = millis();

#ifdef DEBUG_PRESET_ENCODERS
debug.println("check_preset_encoders: preset_start_button submit_encoder_change");
#endif // DEBUG_PRESET_ENCODERS
}
} else {
if ((millis() - last_encoder_change_time) > PRESET_ENCODER_CHANGE_TIME_MS) { // if enc not changed for more than 2 sec, rotate to target
#ifdef DEBUG_PRESET_ENCODERS
debug.println("check_preset_encoders: timer submit_encoder_change");
#endif // DEBUG_PRESET_ENCODERS
submit_encoder_change = 1;
}
}
} // if (!enc_changed_waiting)

if (preset_start_button) { // if we have a preset start button, check it
button_read = digitalReadEnhanced(preset_start_button);
if ((button_read == BUTTON_ACTIVE_STATE) && (!submit_encoder_change) && ((millis() - last_preset_start_button_start) > 250)
&& ((millis() - last_preset_start_button_kill) > 250) && (preset_encoders_state == ENCODER_IDLE)) {
#ifdef DEBUG_PRESET_ENCODERS
debug.println("check_preset_encoders: preset button kill");
#endif // DEBUG_PRESET_ENCODERS
#ifdef FEATURE_AZ_PRESET_ENCODER
if (az_state != IDLE) {
submit_request(AZ, REQUEST_KILL, 0, 45);
}
#endif // FEATURE_AZ_PRESET_ENCODER
#if defined(FEATURE_EL_PRESET_ENCODER) && defined(FEATURE_ELEVATION_CONTROL)
if (el_state != IDLE) {
submit_request(EL, REQUEST_KILL, 0, 46);
}
#endif // defined(FEATURE_EL_PRESET_ENCODER) && defined(FEATURE_ELEVATION_CONTROL)
last_preset_start_button_kill = millis();
}
}

if ((submit_encoder_change) && (button_read == BUTTON_INACTIVE_STATE)) {
#ifdef DEBUG_PRESET_ENCODERS
debug.println("check_preset_encoders: submit_encoder_change ");
#endif // DEBUG_PRESET_ENCODERS

if ((preset_encoders_state == ENCODER_AZ_PENDING) || (preset_encoders_state == ENCODER_AZ_EL_PENDING)) {
#ifndef OPTION_PRESET_ENCODER_0_360_DEGREES
submit_request(AZ, REQUEST_AZIMUTH_RAW, az_encoder_raw_degrees, 47);
#else
submit_request(AZ, REQUEST_AZIMUTH, az_encoder_raw_degrees, 47);
#endif //ndef OPTION_PRESET_ENCODER_0_360_DEGREES
}

#ifdef FEATURE_EL_PRESET_ENCODER
if ((preset_encoders_state == ENCODER_EL_PENDING) || (preset_encoders_state == ENCODER_AZ_EL_PENDING)) {
submit_request(EL, REQUEST_ELEVATION, el_encoder_degrees, 48);
}
#endif // FEATURE_EL_PRESET_ENCODER

preset_encoders_state = ENCODER_IDLE;
submit_encoder_change = 0;
} // if (submit_encoder_change)

if ((preset_start_button) && (preset_encoders_state != ENCODER_IDLE) && ((millis() - last_encoder_move) > ENCODER_PRESET_TIMEOUT)) { // timeout if we have a preset start button
preset_encoders_state = ENCODER_IDLE;
#ifdef FEATURE_LCD_DISPLAY
push_lcd_update = 1; // push an LCD update
#endif // FEATURE_LCD_DISPLAY
}

} /* check_preset_encoders */

 

La cultura del esfuerzo se cultiva desde la motivación, no mediante el castigo como algunos quisieran.
http://www.enioea2hw.wordpress.com
73, Enio

ResponderCitar
EA2J
 EA2J
Mensajes: 3764
#342588  - 28 enero, 2020 22:01 

Función "podada"

void check_preset_encoders(){
  static unsigned long last_encoder_change_time = 0;
  byte button_read = HIGH;
  byte number_columns = 0;
  static byte submit_encoder_change = 0;
  static unsigned long last_preset_start_button_start = 0;
  static unsigned long last_preset_start_button_kill = 0;
  static unsigned long last_encoder_move = 0;
  static unsigned long az_timestamp[5];

  az_encoder_state = ttable[az_encoder_state & 0xf][((digitalReadEnhanced(az_rotary_preset_pin2) << 1) |           digitalReadEnhanced(az_rotary_preset_pin1))]; 
  unsigned char az_encoder_result = az_encoder_state & 0x30;

  if (az_encoder_result) { // If rotary encoder modified
    az_timestamp[0] = az_timestamp[1]; // Encoder step timer
    az_timestamp[1] = az_timestamp[2];
    az_timestamp[2] = az_timestamp[3];
    az_timestamp[3] = az_timestamp[4];
    az_timestamp[4] = millis();

    last_encoder_move = millis();

    unsigned long az_elapsed_time = (az_timestamp[4] - az_timestamp[0]); // Encoder step time difference for 10's step

    #ifdef OPTION_PRESET_ENCODER_RELATIVE_CHANGE
      if ((preset_encoders_state == ENCODER_IDLE) || (preset_encoders_state == ENCODER_EL_PENDING)) {
        if (az_request_queue_state == IN_PROGRESS_TO_TARGET) {
          az_encoder_raw_degrees = target_raw_azimuth;
        } else {
          az_encoder_raw_degrees = raw_azimuth;
        }
      }
  #endif // OPTION_PRESET_ENCODER_RELATIVE_CHANGE

#ifndef OPTION_PRESET_ENCODER_0_360_DEGREES //OJO el código no se ejecuta si la opción está definida
    if (az_encoder_result == DIR_CW) {
      if (az_elapsed_time < 250 /* mSec */) {
        az_encoder_raw_degrees += (5 * HEADING_MULTIPLIER);
      } else { az_encoder_raw_degrees += (1 * HEADING_MULTIPLIER); }; // Single deg increase unless encoder turned quickly then 10's step
        if (az_encoder_raw_degrees > ((azimuth_starting_point + azimuth_rotation_capability) * HEADING_MULTIPLIER)) {
          az_encoder_raw_degrees = ((azimuth_starting_point * HEADING_MULTIPLIER));
    }
}

//Aquí inicia el movimiento izquierda
if (az_encoder_result == DIR_CCW) {
  if (az_elapsed_time < 250 /* mSec */) {
    az_encoder_raw_degrees -= (5 * HEADING_MULTIPLIER);
  } else { az_encoder_raw_degrees -= (1 * HEADING_MULTIPLIER); }; // Single deg decrease unless encoder turned quickly then 10's ste
  if (az_encoder_raw_degrees < (azimuth_starting_point * HEADING_MULTIPLIER)) {
    az_encoder_raw_degrees = (((azimuth_starting_point + azimuth_rotation_capability) * HEADING_MULTIPLIER));
  }
}
#else //ndef OPTION_PRESET_ENCODER_0_360_DEGREES

//Aquí inicia el giro derecha
if (az_encoder_result == DIR_CW) {
  if (az_elapsed_time < 250) { // Single deg increase unless encoder turned quickly then 10's step
    az_encoder_raw_degrees += (5 * HEADING_MULTIPLIER);
    } else {
      az_encoder_raw_degrees += (1 * HEADING_MULTIPLIER);
   }
  if (az_encoder_raw_degrees > (360 * HEADING_MULTIPLIER)) {
    az_encoder_raw_degrees = 0;
  }
}
if (az_encoder_result == DIR_CCW) {
if (az_elapsed_time < 250) { // Single deg decrease unless encoder turned quickly then 10's step
az_encoder_raw_degrees -= (5 * HEADING_MULTIPLIER);
} else {
az_encoder_raw_degrees -= (1 * HEADING_MULTIPLIER);
}
if (az_encoder_raw_degrees < 0) {
az_encoder_raw_degrees = 359 * HEADING_MULTIPLIER;
}
}
#endif //ndef OPTION_PRESET_ENCODER_0_360_DEGREES

last_encoder_change_time = millis(); // Encoder Check Timer

if (preset_encoders_state == ENCODER_IDLE) {
preset_encoders_state = ENCODER_AZ_PENDING;
} else {
if (preset_encoders_state == ENCODER_EL_PENDING) {
preset_encoders_state = ENCODER_AZ_EL_PENDING;
}
}
}

if ((preset_encoders_state != ENCODER_IDLE) && (!submit_encoder_change)) { // Check button or timer
if (preset_start_button) { // if we have a preset start button, check it
button_read = digitalReadEnhanced(preset_start_button);
if (button_read == BUTTON_ACTIVE_STATE) {
submit_encoder_change = 1;
last_preset_start_button_start = millis();
}
} else {
if ((millis() - last_encoder_change_time) > PRESET_ENCODER_CHANGE_TIME_MS) { // if enc not changed for more than 2 sec, rotate to target
submit_encoder_change = 1;
}
}
} // if (!enc_changed_waiting)

if (preset_start_button) { // if we have a preset start button, check it
button_read = digitalReadEnhanced(preset_start_button);
if ((button_read == BUTTON_ACTIVE_STATE) && (!submit_encoder_change) && ((millis() - last_preset_start_button_start) > 250)
&& ((millis() - last_preset_start_button_kill) > 250) && (preset_encoders_state == ENCODER_IDLE)) {
if (az_state != IDLE) {
submit_request(AZ, REQUEST_KILL, 0, 45);
}
last_preset_start_button_kill = millis();
}
}

if ((submit_encoder_change) && (button_read == BUTTON_INACTIVE_STATE)) {
if ((preset_encoders_state == ENCODER_AZ_PENDING) || (preset_encoders_state == ENCODER_AZ_EL_PENDING)) {
#ifndef OPTION_PRESET_ENCODER_0_360_DEGREES
submit_request(AZ, REQUEST_AZIMUTH_RAW, az_encoder_raw_degrees, 47);
#else
submit_request(AZ, REQUEST_AZIMUTH, az_encoder_raw_degrees, 47);
#endif //ndef OPTION_PRESET_ENCODER_0_360_DEGREES
}
preset_encoders_state = ENCODER_IDLE;
submit_encoder_change = 0;
} // if (submit_encoder_change)

if ((preset_start_button) && (preset_encoders_state != ENCODER_IDLE) && ((millis() - last_encoder_move) > ENCODER_PRESET_TIMEOUT)) { // timeout if we have a preset start button
preset_encoders_state = ENCODER_IDLE;
#ifdef FEATURE_LCD_DISPLAY
push_lcd_update = 1; // push an LCD update
#endif // FEATURE_LCD_DISPLAY
}
} /* check_preset_encoders */

La cultura del esfuerzo se cultiva desde la motivación, no mediante el castigo como algunos quisieran.
http://www.enioea2hw.wordpress.com
73, Enio

ResponderCitar
Página 2 / 2

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