Tabla de contenido:
- Suministros
- Paso 1: Conecte el RX y el Arduino
- Paso 2: Obtener algunas señales PPM
- Paso 3: configurar el transmisor
- Paso 4: Ejecutar el joystick
- Paso 5: codificación del Arduino
Video: Convertidor de joystick PPM a USB basado en Arduino (JETI) para FSX: 5 pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:41
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
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
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
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
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
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:
- Acelerador -> Eje del acelerador
- Alerón -> eje X
- Ascensor -> eje Y
- Timón -> eje de rotación X
- Flaps -> eje de rotación Y
- Freno -> eje Z
- 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:
¡Convertidor buck de salida de 5 V de alta eficiencia para bricolaje !: 7 pasos
¡Convertidor Buck de salida de 5 V de alta eficiencia para bricolaje!: Quería una forma eficiente de reducir los voltajes más altos de los paquetes de LiPo (y otras fuentes) a 5 V para proyectos de electrónica. En el pasado, he usado módulos de dólar genéricos de eBay, pero el control de calidad cuestionable y la capacidad electrolítica sin nombre
Convertidor Boost basado en Esp8266 con una increíble interfaz de usuario Blynk con regulador de retroalimentación: 6 pasos
Convertidor Boost basado en Esp8266 con una increíble interfaz de usuario Blynk con regulador de retroalimentación: En este proyecto, le mostraré una forma eficiente y común de cómo aumentar los voltajes de CC. Te mostraré lo fácil que puede ser construir un convertidor boost con la ayuda de un Nodemcu. Vamos a construirlo. También incluye un voltímetro en pantalla y una retroalimentación
Convertidor de impulso para aerogeneradores pequeños: 6 pasos
Convertidor de impulso para turbinas eólicas pequeñas: en mi último artículo sobre controladores de seguimiento del punto de máxima potencia (MPPT) mostré un método estándar para explotar la energía proveniente de una fuente variable como una turbina eólica y cargar una batería. El generador que usé fue un motor paso a paso Nema
Termómetro infrarrojo sin contacto basado en Arduino - Termómetro basado en infrarrojos con Arduino: 4 pasos
Termómetro infrarrojo sin contacto basado en Arduino | Termómetro basado en infrarrojos con Arduino: Hola chicos, en este instructivo, haremos un termómetro sin contacto con arduino, ya que a veces la temperatura del líquido / sólido es demasiado alta o demasiado baja y luego es difícil hacer contacto con él y leer su temperatura entonces en ese escenario
Generador de música basado en el clima (generador Midi basado en ESP8266): 4 pasos (con imágenes)
Generador de música basado en el clima (Generador Midi basado en ESP8266): Hola, hoy explicaré cómo hacer tu propio generador de música basado en el clima. Está basado en un ESP8266, que es como un Arduino, y responde a la temperatura, la lluvia y la intensidad de la luz. No espere que haga canciones completas o programas de acordes