
Hardware
Cabinas Virtuales.
Cabinas Virtuales.
Cabinas Virtuales.
Buenos días, he hecho una botonera para el F-18 en DCS y la he conectado a una placa “Arduino Mega 2560”. Le he cargado a la memoria del Arduino con “DCS.Bios”.
Todos los interruptores, pulsadores, conmutadores, potenciómetros y enconder funcionan y hacen lo que tienen que hacer, pero me encuentro con un problema de manejo a la hora de usar las radios (que las tengo asociadas a un Rotary-Encoder). Resulta que cada pulso que doy físicamente al encoder se refleja en el simulador con que de la emisora “1” pasa a la emisora “5”, es decir, pasa 4 emisoras y la verdad que es un fastidio.
He mirado varios post en internet pero, por una parte están en inglés y por otra, yo no controlo la programación en Arduino.
Alguien me podría echar un cable en la programación para reducir esa sensibilidad que describo.
Inserto el código Arduino que tengo actualmente, concretamente en // Fila 5 Columna 1 rotaryencoder COMM 1
y // Fila 5 Columna 4 rotaryencoder COMM 2.
Tell DCS-BIOS to use a serial connection and use interrupt-driven
communication. The main program will be interrupted to prioritize
processing incoming data.
This should work on any Arduino that has an ATMega328 controller
(Uno, Pro Mini, many others).
*/
#define DCSBIOS_IRQ_SERIAL
#include "DcsBios.h"
/* paste code snippets from the reference documentation here */
// Fila 1 Columna 1 switch2pos LAUNCH BAR RETRACT-EXTEND
DcsBios::Switch2Pos launchBarSw("LAUNCH_BAR_SW", 61);
// Fila 1 Columna 2 switch2pos LGD-TAXI LIGHT ON-OFF
DcsBios::Switch2Pos ldgTaxiSw("LDG_TAXI_SW", 62);
// Fila 1 Columna 3 switch2pos ANTI SKID ON-OFF
DcsBios::Switch2Pos antiSkidSw("ANTI_SKID_SW", 63);
// Fila 1 Columna 4 switch2pos HOOK BYPASS FIELD-CARRIER
DcsBios::Switch2Pos hookBypassSw("HOOK_BYPASS_SW", 64);
// Fila 2 Columna 1 switch3pos MODE AA-AG
DcsBios::Switch2Pos masterModeAa("MASTER_MODE_AA", 60);
DcsBios::Switch2Pos masterModeAg("MASTER_MODE_AG", 59);
// Fila 2 Columna 2 switch2pos MASTER ARM-SAFE
DcsBios::Switch2Pos masterArmSw("MASTER_ARM_SW", 58);
// Fila 2 Columna 3 switch3pos DISPENSER BYPASS-ON-OFF
DcsBios::Switch3Pos cmsdDispenseSw("CMSD_DISPENSE_SW", 57, 56);
// Fila 2 Columna 4 rotaryswitch5pos ECM XMIT-REC-BIT-STBY-OFF
const byte ecmModeSwPins[5] = {9, 10, 11, 12, 14};
DcsBios::SwitchMultiPos ecmModeSw("ECM_MODE_SW", ecmModeSwPins, 5);
// Fila 3 Columna 1 switch3pos PROBE EXTEND-OFF-EMERG EXTEND
DcsBios::Switch3Pos probeSw("PROBE_SW", 15, 16);
// Fila 3 Columna 2 switch2pos HOOK EXTEND-RETRACT
DcsBios::Switch2Pos hookLever("HOOK_LEVER", 17);
// Fila 3 Columna 3 rotaryencoder RUD TRIM L R – T-O TRIM BUTTON
DcsBios::RotaryEncoder rudTrim("RUD_TRIM", "-3200", "+3200", 5, 3);
DcsBios::Switch2Pos toTrimBtn("TO_TRIM_BTN", 4);
// Fila 3 Columna 4 switch2pos DUMP ON-OFF
DcsBios::Switch2Pos fuelDumpSw("FUEL_DUMP_SW", 21);
// Fila 4 Columna 1 momentaryswitch3pos HDG
DcsBios::Switch3Pos leftDdiHdgSw("LEFT_DDI_HDG_SW", 23, 22);
// Fila 4 Columna 2 button JETT
DcsBios::Switch2Pos selJettBtn("SEL_JETT_BTN", 24);
// Fila 4 Columna 3 rotaryswitch5pos SELECT JETT L FIS MSL-SAFE-R FUS MSL-RACK LCHR-STORES
const byte selJettKnobPins[5] = {25, 26, 27, 28, 29};
DcsBios::SwitchMultiPos selJettKnob("SEL_JETT_KNOB", selJettKnobPins, 5);
// Fila 4 Columna 4 momentaryswitch3pos CRS
DcsBios::Switch3Pos leftDdiCrsSw("LEFT_DDI_CRS_SW", 31, 30);
// Fila 5 Columna 1 rotaryencoder COMM 1
DcsBios::RotaryEncoder ufcComm1ChannelSelect("UFC_COMM1_CHANNEL_SELECT", "DEC", "INC", 34, 32);
DcsBios::Switch2Pos ufcComm1Pull("UFC_COMM1_PULL", 33);
// Fila 5 Columna 2 potenciometro POSITION LIGHT
DcsBios::Potentiometer positionDimmer("POSITION_DIMMER", A0);
// Fila 5 Columna 3 potenciometro FORMATION LIGHT
DcsBios::Potentiometer formationDimmer("FORMATION_DIMMER", A1);
// Fila 5 Columna 4 rotaryencoder COMM 2
DcsBios::RotaryEncoder ufcComm2ChannelSelect("UFC_COMM2_CHANNEL_SELECT", "DEC", "INC", 67, 65);
DcsBios::Switch2Pos ufcComm2Pull("UFC_COMM2_PULL", 66);
// Fila 6 Columna 1 switch3pos FLIR ON-STBY-OFF
DcsBios::Switch3Pos flirSw("FLIR_SW", 38, 39);
// Fila 6 Columna 2 switch2pos LTD R ARM-SAFE
DcsBios::Switch2Pos ltdRSw("LTD_R_SW", 40);
// Fila 6 Columna 3 switch2pos LST NFLR - ON-OFF
DcsBios::Switch2Pos lstNflrSw("LST_NFLR_SW", 41);
// Fila 7 Columna 1 rotaryswitch4pos RADAR OFF-STBY-OPR-PULL EMERG
const byte radarSwPins[4] = {42, 43, 44, 45};
DcsBios::SwitchMultiPos radarSw("RADAR_SW", radarSwPins, 4);
// Fila 7 Columna 2 rotaryswitch8pos INS OFF-CV-GND-NAV-IFA-GYRO-GB-TEST
const byte insSwPins[8] = {46, 47, 48, 49, 50, 51, 52, 53};
DcsBios::SwitchMultiPos insSw("INS_SW", insSwPins, 8);
//LED INDICADOR HOOK
DcsBios::LED arrestingHookLt(0x74a0, 0x0400, 7);
//LED INDICADOR DE QUE ESTA ENCHUFADA LA BOTONERA
const int LED=3;
void setup() {
DcsBios::setup();
}
void loop() {
DcsBios::loop();
digitalWrite(LED,HIGH);
}
Todos los interruptores, pulsadores, conmutadores, potenciómetros y enconder funcionan y hacen lo que tienen que hacer, pero me encuentro con un problema de manejo a la hora de usar las radios (que las tengo asociadas a un Rotary-Encoder). Resulta que cada pulso que doy físicamente al encoder se refleja en el simulador con que de la emisora “1” pasa a la emisora “5”, es decir, pasa 4 emisoras y la verdad que es un fastidio.
He mirado varios post en internet pero, por una parte están en inglés y por otra, yo no controlo la programación en Arduino.
Alguien me podría echar un cable en la programación para reducir esa sensibilidad que describo.
Inserto el código Arduino que tengo actualmente, concretamente en // Fila 5 Columna 1 rotaryencoder COMM 1
y // Fila 5 Columna 4 rotaryencoder COMM 2.
Tell DCS-BIOS to use a serial connection and use interrupt-driven
communication. The main program will be interrupted to prioritize
processing incoming data.
This should work on any Arduino that has an ATMega328 controller
(Uno, Pro Mini, many others).
*/
#define DCSBIOS_IRQ_SERIAL
#include "DcsBios.h"
/* paste code snippets from the reference documentation here */
// Fila 1 Columna 1 switch2pos LAUNCH BAR RETRACT-EXTEND
DcsBios::Switch2Pos launchBarSw("LAUNCH_BAR_SW", 61);
// Fila 1 Columna 2 switch2pos LGD-TAXI LIGHT ON-OFF
DcsBios::Switch2Pos ldgTaxiSw("LDG_TAXI_SW", 62);
// Fila 1 Columna 3 switch2pos ANTI SKID ON-OFF
DcsBios::Switch2Pos antiSkidSw("ANTI_SKID_SW", 63);
// Fila 1 Columna 4 switch2pos HOOK BYPASS FIELD-CARRIER
DcsBios::Switch2Pos hookBypassSw("HOOK_BYPASS_SW", 64);
// Fila 2 Columna 1 switch3pos MODE AA-AG
DcsBios::Switch2Pos masterModeAa("MASTER_MODE_AA", 60);
DcsBios::Switch2Pos masterModeAg("MASTER_MODE_AG", 59);
// Fila 2 Columna 2 switch2pos MASTER ARM-SAFE
DcsBios::Switch2Pos masterArmSw("MASTER_ARM_SW", 58);
// Fila 2 Columna 3 switch3pos DISPENSER BYPASS-ON-OFF
DcsBios::Switch3Pos cmsdDispenseSw("CMSD_DISPENSE_SW", 57, 56);
// Fila 2 Columna 4 rotaryswitch5pos ECM XMIT-REC-BIT-STBY-OFF
const byte ecmModeSwPins[5] = {9, 10, 11, 12, 14};
DcsBios::SwitchMultiPos ecmModeSw("ECM_MODE_SW", ecmModeSwPins, 5);
// Fila 3 Columna 1 switch3pos PROBE EXTEND-OFF-EMERG EXTEND
DcsBios::Switch3Pos probeSw("PROBE_SW", 15, 16);
// Fila 3 Columna 2 switch2pos HOOK EXTEND-RETRACT
DcsBios::Switch2Pos hookLever("HOOK_LEVER", 17);
// Fila 3 Columna 3 rotaryencoder RUD TRIM L R – T-O TRIM BUTTON
DcsBios::RotaryEncoder rudTrim("RUD_TRIM", "-3200", "+3200", 5, 3);
DcsBios::Switch2Pos toTrimBtn("TO_TRIM_BTN", 4);
// Fila 3 Columna 4 switch2pos DUMP ON-OFF
DcsBios::Switch2Pos fuelDumpSw("FUEL_DUMP_SW", 21);
// Fila 4 Columna 1 momentaryswitch3pos HDG
DcsBios::Switch3Pos leftDdiHdgSw("LEFT_DDI_HDG_SW", 23, 22);
// Fila 4 Columna 2 button JETT
DcsBios::Switch2Pos selJettBtn("SEL_JETT_BTN", 24);
// Fila 4 Columna 3 rotaryswitch5pos SELECT JETT L FIS MSL-SAFE-R FUS MSL-RACK LCHR-STORES
const byte selJettKnobPins[5] = {25, 26, 27, 28, 29};
DcsBios::SwitchMultiPos selJettKnob("SEL_JETT_KNOB", selJettKnobPins, 5);
// Fila 4 Columna 4 momentaryswitch3pos CRS
DcsBios::Switch3Pos leftDdiCrsSw("LEFT_DDI_CRS_SW", 31, 30);
// Fila 5 Columna 1 rotaryencoder COMM 1
DcsBios::RotaryEncoder ufcComm1ChannelSelect("UFC_COMM1_CHANNEL_SELECT", "DEC", "INC", 34, 32);
DcsBios::Switch2Pos ufcComm1Pull("UFC_COMM1_PULL", 33);
// Fila 5 Columna 2 potenciometro POSITION LIGHT
DcsBios::Potentiometer positionDimmer("POSITION_DIMMER", A0);
// Fila 5 Columna 3 potenciometro FORMATION LIGHT
DcsBios::Potentiometer formationDimmer("FORMATION_DIMMER", A1);
// Fila 5 Columna 4 rotaryencoder COMM 2
DcsBios::RotaryEncoder ufcComm2ChannelSelect("UFC_COMM2_CHANNEL_SELECT", "DEC", "INC", 67, 65);
DcsBios::Switch2Pos ufcComm2Pull("UFC_COMM2_PULL", 66);
// Fila 6 Columna 1 switch3pos FLIR ON-STBY-OFF
DcsBios::Switch3Pos flirSw("FLIR_SW", 38, 39);
// Fila 6 Columna 2 switch2pos LTD R ARM-SAFE
DcsBios::Switch2Pos ltdRSw("LTD_R_SW", 40);
// Fila 6 Columna 3 switch2pos LST NFLR - ON-OFF
DcsBios::Switch2Pos lstNflrSw("LST_NFLR_SW", 41);
// Fila 7 Columna 1 rotaryswitch4pos RADAR OFF-STBY-OPR-PULL EMERG
const byte radarSwPins[4] = {42, 43, 44, 45};
DcsBios::SwitchMultiPos radarSw("RADAR_SW", radarSwPins, 4);
// Fila 7 Columna 2 rotaryswitch8pos INS OFF-CV-GND-NAV-IFA-GYRO-GB-TEST
const byte insSwPins[8] = {46, 47, 48, 49, 50, 51, 52, 53};
DcsBios::SwitchMultiPos insSw("INS_SW", insSwPins, 8);
//LED INDICADOR HOOK
DcsBios::LED arrestingHookLt(0x74a0, 0x0400, 7);
//LED INDICADOR DE QUE ESTA ENCHUFADA LA BOTONERA
const int LED=3;
void setup() {
DcsBios::setup();
}
void loop() {
DcsBios::loop();
digitalWrite(LED,HIGH);
}
Cabinas Virtuales.
Cabinas Virtuales.
nada en el código que has pegado parece hacer referencia a sensibilidad. Además, por el tipo de asignación que se hace es de tipo botón, quiere decir que cada actuación es como una pulsación (RotaryEncoder) vs otras asignaciones que sí funcionan como un valor contínuo (Potentiometer)
Cabinas Virtuales.
Cabinas Virtuales.
Hace mucho que no me meto pero recuerdo que no todos los encoder funcionan igual.
Echale un vistazo al manual de DCS:Bios fijate que dice que su biblioteca utiliza los de 4 pasos por ellos por defecto ,probablemente tu tienes otros diferntes y tienes queindicarlo en elcodigo.
Echale un vistazo al manual de DCS:Bios fijate que dice que su biblioteca utiliza los de 4 pasos por ellos por defecto ,probablemente tu tienes otros diferntes y tienes queindicarlo en elcodigo.
Los codificadores rotarios más comunes utilizan 4 pasos por detenida. Esto es lo que la Biblioteca de DCS-BIOS Arduino utiliza por defecto. Si su codificador rotual utiliza 2 o 1 pasos por detent, especifique el número de pasos pertenecido en los soportes angulares después de DcsBios::RotaryEncoder, así::Así:
Si te sigue dando problemas prueba con otro tipo de encoders.// two steps per detent:
DcsBios::RotaryEncoder<2> ilsMhz("ILS_MHZ", "DEC", "INC", PIN_A, PIN_B);
Cabinas Virtuales.
Cabinas Virtuales.
Es simplemente añadir <2> a mi línea de código
DcsBios::RotaryEncoder<2> ufcComm1ChannelSelect("UFC_COMM1_CHANNEL_SELECT", "DEC", "INC", 34, 32);
O el número que sea q estimo q si pasan 4 pasos sería 1
Esta tarde lo pruebo. Muchas gracias y ya cuento como me ha ido
DcsBios::RotaryEncoder<2> ufcComm1ChannelSelect("UFC_COMM1_CHANNEL_SELECT", "DEC", "INC", 34, 32);
O el número que sea q estimo q si pasan 4 pasos sería 1
Esta tarde lo pruebo. Muchas gracias y ya cuento como me ha ido
Cabinas Virtuales.
Cabinas Virtuales.
Lo he conseguido
Por un lado he puesto la siguiente línea después de #include "DcsBios.h"
typedef DcsBios::RotaryEncoderT<POLL_EVERY_TIME, DcsBios::FOUR_STEPS_PER_DETENT> FourStepRotaryEncoder; // A custom rotary encoder with four quadrature steps per physical detent.
Y más abajo la siguiente línea
FourStepRotaryEncoder ufcComm1ChannelSelect("UFC_COMM1_CHANNEL_SELECT", "DEC", "INC", 31, 22);
Y funciona como quería. Por cada pulso del encoder avanza o retrocede una emisora de la radio
También he aprovechado y lo he puesto en el encoder q gobierna el trimado
Muchas gracias por la ayuda y aquí queda por si a alguien le ocurriera lo mismo
Un saludo
Por un lado he puesto la siguiente línea después de #include "DcsBios.h"
typedef DcsBios::RotaryEncoderT<POLL_EVERY_TIME, DcsBios::FOUR_STEPS_PER_DETENT> FourStepRotaryEncoder; // A custom rotary encoder with four quadrature steps per physical detent.
Y más abajo la siguiente línea
FourStepRotaryEncoder ufcComm1ChannelSelect("UFC_COMM1_CHANNEL_SELECT", "DEC", "INC", 31, 22);
Y funciona como quería. Por cada pulso del encoder avanza o retrocede una emisora de la radio
También he aprovechado y lo he puesto en el encoder q gobierna el trimado
Muchas gracias por la ayuda y aquí queda por si a alguien le ocurriera lo mismo
Un saludo
Cabinas Virtuales.
Cabinas Virtuales.
Ya lo sé para la próxima.
Y ya que estamos tengo el botón del a/a y el botón de a/g en un switch de 2 posiciones ON-OFF-ON. Cuando le doy para el aire aire me lo marca perfectamente en el simulador pero cuando llevo el switch al centro no se desactiva y tengo q volver a marcar A/A para que se desactive. Igual me pasa con el A/G.
Seguramente hay algún comando para ello pero lo desconozco
Y ya que estamos tengo el botón del a/a y el botón de a/g en un switch de 2 posiciones ON-OFF-ON. Cuando le doy para el aire aire me lo marca perfectamente en el simulador pero cuando llevo el switch al centro no se desactiva y tengo q volver a marcar A/A para que se desactive. Igual me pasa con el A/G.
Seguramente hay algún comando para ello pero lo desconozco
No registered users