Rueda de pestaña de ajuste analógico FlightGear
Componentes y suministros
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Aplicaciones y servicios en línea
| ||||
| ||||
|
Acerca de este proyecto
La conexión de Arduino a FlightGear no es nada nuevo, pero descubrí que los wikis están desactualizados y los foros brindan valiosos consejos sobre dónde debe trabajar.
La idea era tener un comando analógico agradable, económico y compacto para controlar la rueda de la lengüeta de compensación del elevador de un avión en FlightGear. La wiki funciona hasta la parte de comunicación. Estrictamente hablando, no puede usar directamente la comunicación en serie para pasar comandos de Arduino a FlightGear. Tiene que solucionar el problema con Python para enviar paquetes a través de UDP.
¿Qué es una rueda de ajuste? Es un dispositivo analógico para controlar la deflexión de la aleta de compensación, que es un dispositivo aerodinámico para mantener una superficie de control (en este caso el ascensor que controla el cabeceo de la aeronave) en una posición determinada sin esfuerzo por parte del piloto. De wikipedia:
Requisitos adicionales para este proyecto:python con las bibliotecas serial
, conector
y sys
instalado. Suponiendo que se haya instalado Anaconda, las bibliotecas que faltan se pueden recuperar con el indicador de Anaconda escribiendo:
>>> conda install -c anaconda pyserial
lo mismo con serial
y socket
. Busque en Internet un paquete apropiado, generalmente los más descargados para su plataforma son buenos. Una vez que tenga Python con estas bibliotecas (y, por supuesto, FlightGear instalado) puede pasar a la siguiente sección.
Hay tres secuencias de comandos de código:un boceto de Arduino, una secuencia de comandos ejecutable de Python y una secuencia de comandos XML. El boceto de Arduino debe estar cargado en su placa. La secuencia de comandos de Python debe ejecutarse para permitir la comunicación entre Arduino y FlightGear. El script XML es un protocolo genérico de FlightGear que debe trasladarse a
El boceto de Arduino requiere el U8glib
Biblioteca. Como se menciona en el comentario, ajuste la línea 2 del boceto con su pantalla:
#include U8GLIB_SSD1306_128X64 u8g (U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C / TWI
Ver U8glib
ejemplos y documentación. El boceto debería funcionar incluso sin una pantalla, por lo que puede jugar sin comentarios visuales de su tablero.
Si no está satisfecho con la dirección de rotación, simplemente cambie la posición de los dos últimos argumentos en el siguiente mapa
instrucciones
w =map (p, 0,1023,100, -100); m =map (p, 0,1023,90,0);
para que los valores del potenciómetro vayan de -100 a 100 y el calibre de la aguja pase de 0 a 90 (este es un truco para sacar la aguja en la posición correcta, pruébalo tú mismo si tienes curiosidad).
La secuencia de comandos de Python incluye la dirección del host y el número de puerto serie. El host debe ser "localhost"
(si no funciona, intente con 127.0.0.1
), el puerto cualquiera (tal vez sea mejor uno que no esté siendo utilizado por otras aplicaciones, no lo sé), el puerto serie donde está conectada su placa puede leerse desde el IDE de Arduino. En mi caso, es "COM4"
. Nota:si prueba el Arduino con el monitor en serie, es posible que deba desconectar y volver a conectar su placa antes de ejecutar el script de Python para que funcione correctamente.
host ="localhost" port =21567 # buf =1024addr =(host, puerto) UDPSock =socket (AF_INET, SOCK_DGRAM) tty ="COM4" print ("tty is", tty)
La secuencia de comandos de Python puede estar ubicada en cualquier lugar. Puede ejecutarlo desde la línea de comandos de su sistema operativo. En mi caso (Windows), escribo en el símbolo del sistema:
Esto puede iniciarse antes o incluso después de iniciar FlightGear.
Finalmente, como se indicó anteriormente, el script XML debe moverse de una vez por todas a la carpeta de protocolo de su instalación de FlightGear. Ahora estás listo para ir. Inicie FlightGear con su modo preferido (línea de comando o lanzador) agregando el siguiente comando (¡sin espacio entre caracteres!) :
--generic =socket, in, 30, localhost, 21567, udp, arduinoElevatorTrim
donde le estamos diciendo a FlightGear que aplique un protocolo genérico a través de socket, lea la entrada 30 veces por segundo, en la dirección localhost, puerto 21567, protocolo UDP, instrucciones en el archivo arduinoElevatorTrim.xml. ¡Disfrute de su rueda de ajuste personal!
Código
- arduinoElevatorTrimOLED.ino
- arduinoElevatorTrim.py
- arduinoElevatorTrim.xml
arduinoElevatorTrimOLED.ino Arduino
Código para cargar en el Arduino Nano. Ajuste la línea 2 (tipo de pantalla) según sea necesario.#includeU8GLIB_SSD1306_128X64 u8g (U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C / TWI int xmax =128; int ymax =64; int xcenter =xmax / 2; int ycentro =ymax / 2 + 10; int arc =ymax / 2; int ángulo =0; char * label ="TRIM"; int labelXpos =53; int p, w, m; u8g_uint_t xx =0; int const potPin =A6; float potVal; // Medidor de vacío de función personalizada (uint8_t angle) {// dibujar el borde del indicador u8g.drawCircle (xcenter, ycenter, arc + 6, U8G_DRAW_UPPER_RIGHT); u8g.drawCircle (centro x, centro y, arco + 4, U8G_DRAW_UPPER_RIGHT); u8g.drawCircle (centro x, centro y, arco + 6, U8G_DRAW_UPPER_LEFT); u8g.drawCircle (centro x, centro y, arco + 4, U8G_DRAW_UPPER_LEFT); // dibuja el flotador de la aguja x1 =sin (2 * ángulo * 2 * 3.14 / 360); flotar y1 =cos (2 * ángulo * 2 * 3,14 / 360); u8g.drawLine (xcenter, ycenter, xcenter + arc * x1, ycenter-arc * y1); u8g.drawDisc (xcenter, ycenter, 5, U8G_DRAW_UPPER_LEFT); u8g.drawDisc (xcenter, ycenter, 5, U8G_DRAW_UPPER_RIGHT); u8g.setFont (u8g_font_chikita); // mostrar etiquetas de escala // u8g.drawStr (10, 42, "-1.0"); // u8g.drawStr (19, 14, "-0.5"); // u8g.drawStr (63, 14, "0"); // u8g.drawStr (92, 14, "0.5"); // u8g. drawStr (105, 42, "1.0"); u8g.drawStr (1, 42, "ABAJO"); u8g.drawStr (52, 17, "NEUT"); u8g.drawStr (105, 42, "ARRIBA"); // muestra la etiqueta del medidor u8g.setPrintPos (labelXpos, 32); u8g.print (etiqueta); // muestra el valor digital y alinea su posición u8g.setFont (u8g_font_profont22); if (w> =99) {u8g.setPrintPos (47,60); } si (w> =10 &&w <99) {u8g.setPrintPos (54,60); } si (w> =0 &&w <9) {u8g.setPrintPos (60,60); } si (w> =-9 &&w <0) {u8g.setPrintPos (48,60); } si (w> =-99 &&w <-9) {u8g.setPrintPos (42,60); } si (w <-99) {u8g.setPrintPos (35,60); } u8g.print (w);} configuración vacía () {Serial.begin (9600); u8g.setFont (u8g_font_chikita); u8g.setColorIndex (1); // asigna un valor de color predeterminado si (u8g.getMode () ==U8G_MODE_R3G3B2) {u8g.setColorIndex (255); } más si (u8g.getMode () ==U8G_MODE_GRAY2BIT) {u8g.setColorIndex (3); } más si (u8g.getMode () ==U8G_MODE_BW) {u8g.setColorIndex (1); } más si (u8g.getMode () ==U8G_MODE_HICOLOR) {u8g.setHiColorByRGB (255,255,255); }} bucle vacío () {potVal =analogRead (potPin); potVal =(potVal - 512.0) /512.0; Serial.print (potVal); Serial.print ("\ n"); // p es lo mismo que potVal, pero es un número entero p =analogRead (potPin); w =mapa (p, 0,1023,100, -100); m =mapa (p, 0,1023,90,0); // muestra la aguja y el dial xx =m; si (xx <45) {xx =xx + 135; } más {xx =xx - 45; } // bucle de imagen {u8g.firstPage (); hacer {calibre (xx); } while (u8g.nextPage ()); } retraso (10);}
arduinoElevatorTrim.py Python
Script que se ejecutará junto con FlightGear para "traducir" la comunicación en serie en paquetes UDP. Necesita tener instalado Python para ejecutar este script. Modifique la línea 14 (puerto USB donde está conectado el Arduino) según sea necesario.#! / Usr / bin / pythonimport sysimport serialfrom socket import * host ="localhost" port =21567 # buf =1024addr =(host, port) UDPSock =socket (AF_INET, SOCK_DGRAM) tty ="COM4" print ("tty is", tty) try:ser =serial.Serial (tty, 9600) excepto:print ("Error al conectarse a", tty) prevline ="" while 1:outline ='' line =ser.readline () if line! =Prevline:#alguna valor cambiado print (line) outline =line UDPSock.sendto (outline, addr) prevline =line
arduinoElevatorTrim.xml XML
Script que se agregará en la carpetaXml version ="1.0"?>\ n , Elevador trim / controles / vuelo / ascensor-trim float
Github
Repositorio en línea en Githubhttps://github.com/dciliberti/arduinoElevatorTrimOLEDEsquemas
En Fritzing no es posible pasar cables por debajo de los componentes. El cable de tierra de la pantalla puede pasar por debajo del Arduino Nano.Proceso de manufactura