Tabla de contenido:

Convertidor de joystick PPM a USB basado en Arduino (JETI) para FSX: 5 pasos
Convertidor de joystick PPM a USB basado en Arduino (JETI) para FSX: 5 pasos

Video: Convertidor de joystick PPM a USB basado en Arduino (JETI) para FSX: 5 pasos

Video: Convertidor de joystick PPM a USB basado en Arduino (JETI) para FSX: 5 pasos
Video: ppm signal from an arduino and an old joystick 2024, Mes de julio
Anonim
Convertidor de joystick PPM a USB basado en Arduino (JETI) para FSX
Convertidor de joystick PPM a USB basado en Arduino (JETI) para FSX
Convertidor de joystick PPM a USB basado en Arduino (JETI) para FSX
Convertidor de joystick PPM a USB basado en Arduino (JETI) para FSX

Decidí cambiar mi transmisor JETI DC-16 del Modo 2 al Modo 1, que básicamente cambia el acelerador y el elevador de izquierda a derecha y viceversa. Como no quería bloquear uno de mis modelos debido a una confusión de izquierda / derecha en mi cerebro, me preguntaba si es posible practicar un poco en FSX.

Leí y probé que los transmisores JETI realmente admiten un modo Joystick listo para usar, sin embargo, quería flexibilidad total para las asignaciones de ejes e interruptores y usar el TX como con un modelo real. Al usar la salida del receptor, también es posible aprovechar el procesamiento de la señal en el DC-16 y usar mezcladores, fases de vuelo, velocidades duales, lo que sea que pueda programar allí.

Recientemente encontré un buen tutorial sobre cómo hacer un dispositivo de entrada USB HID, es decir, un Joystick, con un Arduino barato como un Pro Micro:

www.instructables.com/id/Create-a-Joystick…

¡Esto permitiría todo lo necesario para controlar un avión / helicóptero / lo que sea en FSX! Numerosos ejes y botones disponibles.

Como acababa de tener un JETI RSAT2 de repuesto, decidí conectarlo con Arduino e intentar implementar un pequeño analizador PPM junto con la biblioteca de Joystick.

Supongo que cualquiera que siga estos pasos está familiarizado con la conexión y programación de un Arduino. ¡No aceptaré ninguna garantía por mal funcionamiento o daños!

Suministros

Necesitará…

  • cualquier Arduino compatible con la biblioteca de Joystick, utilicé un Sparkfun Pro Micro 5V / 16 MHz
  • una versión reciente del IDE de Arduino
  • cualquier receptor RC que emita una señal PPM, como el JETI RSAT2
  • algunos cables de puente (mínimo 3)
  • la biblioteca de Joystick instalada en Arduino IDE
  • la biblioteca arduino-timer:

Paso 1: Conecte el RX y el Arduino

Conecte el RX y el Arduino
Conecte el RX y el Arduino
Conecte el RX y el Arduino
Conecte el RX y el Arduino

El cableado es bastante sencillo. Decidí alimentar el Arduino solo desde USB, ya que emulará un dispositivo Joystick. Esto proporcionará al Arduino 5V, que también se pueden utilizar para alimentar el receptor RC.

Usé el Pin VCC, que proporciona una salida regulada, y el pin Gnd más cercano, simplemente conéctelo a los pines + y - del conector PPM. Cuando el Arduino se enciende, el receptor ahora también se enciende.

Para la señal PPM, decidí usar interrupciones para analizarlas. Las interrupciones están disponibles, p. Ej. en el pin 3, así que simplemente conéctelo allí; no hay un "pin RC nativo" en el arduino, pero posiblemente más y diferentes formas de leer en la señal del receptor.

Tuve que deshabilitar la alarma de voltaje RX, ya que el voltaje VCC con suministro USB será de alrededor de 4.5V solo, pero bastante estable, por lo que no hay ningún problema.

Paso 2: Obtener algunas señales PPM

Obteniendo algunas señales PPM
Obteniendo algunas señales PPM
Obteniendo algunas señales PPM
Obteniendo algunas señales PPM

Cuando se enciende el receptor Y el TX, recibía señales PPM como se muestra en la imagen. 16 canales, repetidos para siempre. Si Failsafe en el RSAT está deshabilitado y el transmisor se apaga, la salida PPM se deshabilitará.

Más información sobre PPM está disponible aquí:

  • https://en.wikipedia.org/wiki/Pulse-position_modul…
  • https://wiki.rc-network.de/index.php/PPM

Como no estoy volando cosas reales en este caso, no me importaron los tiempos teóricos y simplemente descubrí en el osciloscopio lo que mi receptor estaba emitiendo en realidad cuando movía las palancas de totalmente izquierda a totalmente derecha (configuración estándar en el TX). Parecía que -100% corresponde a pulsos con una longitud de 600 µs, y + 100% a 1600 µs. Tampoco me importaba la duración de los pulsos de pausa (400 µs) en mi código Arduino, pero asumí un espacio de cuadro de min. 3000 µs.

Paso 3: configurar el transmisor

Configuración del transmisor
Configuración del transmisor
Configuración del transmisor
Configuración del transmisor
Configuración del transmisor
Configuración del transmisor

Dado que sólo es necesario conocer la posición real de las superficies de control, es suficiente un canal / "servo" por función RC. En consecuencia, se puede realizar una configuración de transmisor bastante simple, similar a un modelo RC normal. Las funciones principales de alerón, elevador, timón y acelerador requieren cada una solo un canal de transmisión servo respectivamente. También agregué flaps, frenos y equipo, dejando 9 canales libres hasta ahora. Tenga en cuenta que los Flaps se pusieron en una fase de vuelo y no se controlan directamente mediante un stick, control deslizante o botón.

Paso 4: Ejecutar el joystick

Ejecutando el Joystick
Ejecutando el Joystick
Ejecutando el Joystick
Ejecutando el Joystick

La biblioteca de Joystick es bastante fácil de usar y proporciona algunos ejemplos y pruebas. Debería ser útil verificar primero si el Arduino se detecta como un Joystick adecuado, las instrucciones vinculadas en la sección de entrada y la biblioteca en sí brindan una buena guía.

En el panel de control de Dispositivos e Impresoras, Arduino se mostraba como "Sparkfun Pro Micro", y la ventana de prueba del joystick mostraba 7 ejes y muchos botones compatibles. Incluso se puede usar un interruptor de sombrero cuando se programa en el Arduino.

Paso 5: codificación del Arduino

Codificando el Arduino
Codificando el Arduino
Codificando el Arduino
Codificando el Arduino

Lo que todavía falta es el análisis real de la señal PPM y la asignación a los ejes y botones del joystick. Me decidí por el siguiente mapeo:

Asignación de canal / función / joystick:

  1. Acelerador -> Eje del acelerador
  2. Alerón -> eje X
  3. Ascensor -> eje Y
  4. Timón -> eje de rotación X
  5. Flaps -> eje de rotación Y
  6. Freno -> eje Z
  7. Engranaje -> Botón 0

Cuando la marcha está baja, se debe presionar el primer botón del Joystick y se liberará al subir la marcha. Sin embargo, esto requerirá FSUIPC para FSX, listo para usar, FSX aceptará solo un botón para alternar el engranaje, que no es exactamente lo que está sucediendo con mis modelos.

Proporcioné mi versión actual del código con muchos comentarios, lo que me está funcionando bastante bien; siéntase libre de cambiar su asignación o agregar nuevas funciones. Los últimos 9 canales RC no se utilizan actualmente.

Para la configuración, la clase Joystick debe inicializarse, básicamente definiendo los rangos del eje numérico:

/ * Establecer rango de ejes (definido en el encabezado, 0 - 1000) * /

Joystick.setXAxisRange (CHANNEL_MIN, CHANNEL_MAX); Joystick.setYAxisRange (CHANNEL_MIN, CHANNEL_MAX); …

Usando valores de 0 a 1000, es posible mapear directamente la longitud del pulso (600 - 1600µs) a los valores del joystick sin reescalar.

El DIN 3 se inicializa como entrada digital, pullups habilitados y una interrupción adjunta:

pinMode (PPM_PIN, INPUT_PULLUP);

attachInterrupt (digitalPinToInterrupt (PPM_PIN), PPM_Pin_Changed, CHANGE);

Para fines de depuración, agregué algunas impresiones a través de la interfaz serial a intervalos regulares, usando la biblioteca arduino-timer:

si (SERIAL_PRINT_INTERVAL> 0) {

Scheduler.every (SERIAL_PRINT_INTERVAL, (void *) -> bool {SerialPrintChannels (); return true;}); }

La interrupción del pin se llamará siempre que el valor lógico del pin haya cambiado, es decir, para cada flanco de la señal PPM. Evalúe la longitud del pulso con solo sincronizar usando micros ():

uint32_t curTime = micros ();

uint32_t pulseLength = curTime - edgeTime; uint8_t curState = digitalRead (PPM_PIN);

Al evaluar el estado del pin actual y combinarlo con la longitud del pulso y los pulsos pasados, se pueden clasificar los nuevos pulsos. El siguiente condicional detectará la brecha entre cuadros:

if (lastState == 0 && pulseLength> 3000 && pulseLength <6000)

Para los pulsos posteriores, la longitud del pulso se asignará a un estado de eje recortando y sesgando la longitud del pulso para que coincida con el rango del eje del joystick:

uint16_t rxLength = pulseLength;

rxLength = (rxLength> 1600)? 1600: rxLength; rxLength = (rxLength <600)? 600: rxLength; rxChannels [curChannel] = rxLength - 600;

La matriz rxChannels eventualmente contiene 16 valores de 0 a 1000, que indican las posiciones de los botones / controles deslizantes y controles.

Después de recibir 16 canales, se realiza el mapeo al Joystick:

/ * ejes * /

Joystick.setThrottle (canales [0]); Joystick.setXAxis (canales [1]); Joystick.setYAxis (1000 canales [2]); Joystick.setRxAxis (canales [3]); Joystick.setRyAxis (canales [4]); Joystick.setZAxis (1000 canales [5]); / * botones * / Joystick.setButton (0, (canales [6] <500? 1: 0)); / * actualizar datos a través de USB * / Joystick.sendState ();

Invertí algunos ejes en el código, lo que no es absolutamente necesario, ya que el eje también se puede invertir cambiando la dirección del servo o la asignación en FSX. Sin embargo, decidí mantener las direcciones de los servos y también la asignación FSX original.

El botón se enciende o apaga mediante el canal de umbral 7.

Y no olvide marcar el programador … de lo contrario, no se verán impresiones de depuración.

bucle vacío () {

planificador.tick (); }

En la captura de pantalla que adjunto, puede ver que el canal 1 se movió de 1000 (aceleración máxima) a 0 (inactivo).

FSX detectará el Arduino como cualquier otro Joystick, así que simplemente asigne el botón y los ejes y diviértase despegando.

Lo que realmente me gusta de este enfoque es que puede usar su transmisor como con un modelo real, p. utilizando fases de vuelo, etc.

Recomendado: