FlightGear Analog Trim Tab Wheel
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Aplicativos e serviços online
| ||||
| ||||
|
Sobre este projeto
Conectar o Arduino ao FlightGear não é nada novo, mas descobri que os wikis estão desatualizados e os fóruns fornecem dicas preciosas sobre as quais você deve contornar.
A ideia era ter um comando analógico bom, barato e compacto para controlar a roda do compensador de profundor de uma aeronave no FlightGear. O wiki funciona até a parte de comunicação. Estritamente falando, você não pode usar a comunicação serial diretamente para passar comandos do Arduino para o FlightGear. Você deve contornar com Python para enviar pacotes via UDP.
O que é uma roda de acabamento? É um dispositivo analógico para controlar a deflexão do compensador, que é um dispositivo aerodinâmico para manter uma superfície de controle (neste caso, o profundor que controla o passo da aeronave) em uma determinada posição sem esforço do piloto. Da wikipedia:
Requisitos adicionais para este projeto:python com as bibliotecas
serial
, socket
e sys
instalado. Assumindo que o Anaconda foi instalado, as bibliotecas ausentes podem ser recuperadas com o prompt do Anaconda digitando:>>> conda install -c anaconda pyserial
o mesmo com
serial
e socket
. Pesquise na internet por um pacote adequado, geralmente os mais baixados para sua plataforma são bons. Depois de ter o python com essas bibliotecas (e, é claro, o FlightGear instalado), você pode ir para a próxima seção. Existem três scripts de código:um esboço do Arduino, um script executável python e um script XML. O esboço do Arduino deve ser carregado em sua placa. O script python deve ser executado para permitir a comunicação entre o Arduino e o FlightGear. O script XML é um protocolo genérico FlightGear que deve ser movido para
O esboço do Arduino requer o
U8glib
biblioteca. Conforme mencionado no comentário, ajuste a linha 2 do esboço com sua exibição: #include U8GLIB_SSD1306_128X64 u8g (U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C / TWI
Veja
U8glib
exemplos e documentação. O esboço deve funcionar mesmo sem um visor, então você pode jogar sem feedback visual de seu tabuleiro. Se você não estiver satisfeito com a direção de rotação, basta trocar a posição dos dois últimos argumentos no seguinte
mapa
instruções w =map (p, 0,1023,100, -100); m =map (p, 0,1023,90,0);
de forma que os valores do potenciômetro vão de -100 a 100 e a bitola da agulha vai de 0 a 90 (truque para desenhar a agulha na posição correta, experimente você mesmo se tiver curiosidade).
O script python inclui o endereço do host e o número da porta serial. O host deve ser
"localhost"
(se não funcionar, tente com 127.0.0.1
), a porta any (talvez seja melhor uma que não esteja em uso por outros aplicativos, não sei), a porta serial onde sua placa está conectada pode ser lida do IDE do Arduino. No meu caso, é "COM4"
. Observação:se você testar o Arduino com o monitor serial, pode ser necessário desconectar e reconectar sua placa antes de executar o script Python para que funcione corretamente. host ="localhost" port =21567 # buf =1024addr =(host, porta) UDPSock =socket (AF_INET, SOCK_DGRAM) tty ="COM4" print ("tty is", tty)
O script python pode estar localizado em qualquer lugar. Você pode executá-lo a partir da linha de comando do seu sistema operacional. No meu caso (Windows), digito no prompt de comando:
python c:\ path \ to \ file \ arduinoElevatorTrim.py
Isso pode ser iniciado antes ou mesmo depois de iniciar o FlightGear.
Finalmente, como afirmado anteriormente, o script XML deve ser movido de uma vez por todas na pasta de protocolo de sua instalação do FlightGear. Agora você está pronto para ir. Inicie o FlightGear com seu modo preferido (linha de comando ou iniciador) adicionando o seguinte comando (sem espaço entre os caracteres!) :
--generic =socket, in, 30, localhost, 21567, udp, arduinoElevatorTrim
onde estamos dizendo ao FlightGear para aplicar um protocolo genérico via socket, ler a entrada 30 vezes por segundo, no endereço localhost, porta 21567, protocolo UDP, instruções no arquivo arduinoElevatorTrim.xml. Desfrute da sua roda de acabamento pessoal!
Código
- arduinoElevatorTrimOLED.ino
- arduinoElevatorTrim.py
- arduinoElevatorTrim.xml
arduinoElevatorTrimOLED.ino Arduino
Código para carregar no Arduino Nano. Ajuste a linha 2 (tipo de display) conforme necessário.#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 ycenter =ymax / 2 + 10; arco interno =ymax / 2; ângulo interno =0; char * label ="TRIM"; int labelXpos =53; int p, w, m; u8g_uint_t xx =0; int const potPin =A6; float potVal; // medidor de função vazio personalizado (ângulo uint8_t) {// desenhar a borda do medidor u8g.drawCircle (xcenter, ycenter, arc + 6, U8G_DRAW_UPPER_RIGHT); u8g.drawCircle (xcenter, ycenter, arc + 4, U8G_DRAW_UPPER_RIGHT); u8g.drawCircle (xcenter, ycenter, arc + 6, U8G_DRAW_UPPER_LEFT); u8g.drawCircle (xcenter, ycenter, arc + 4, U8G_DRAW_UPPER_LEFT); // desenha o flutuador da agulha x1 =sin (2 * ângulo * 2 * 3,14 / 360); float 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); // mostra rótulos 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, "PARA BAIXO"); u8g.drawStr (52, 17, "NEUT"); u8g.drawStr (105, 42, "UP"); // mostra o rótulo do medidor u8g.setPrintPos (labelXpos, 32); u8g.print (etiqueta); // mostra o valor digital e alinha sua posição u8g.setFont (u8g_font_profont22); if (w> =99) {u8g.setPrintPos (47,60); } if (w> =10 &&w <99) {u8g.setPrintPos (54,60); } if (w> =0 &&w <9) {u8g.setPrintPos (60,60); } if (w> =-9 &&w <0) {u8g.setPrintPos (48,60); } if (w> =-99 &&w <-9) {u8g.setPrintPos (42,60); } if (w <-99) {u8g.setPrintPos (35,60); } u8g.print (w);} void setup () {Serial.begin (9600); u8g.setFont (u8g_font_chikita); u8g.setColorIndex (1); // atribuir valor de cor padrão if (u8g.getMode () ==U8G_MODE_R3G3B2) {u8g.setColorIndex (255); } else if (u8g.getMode () ==U8G_MODE_GRAY2BIT) {u8g.setColorIndex (3); } else if (u8g.getMode () ==U8G_MODE_BW) {u8g.setColorIndex (1); } else if (u8g.getMode () ==U8G_MODE_HICOLOR) {u8g.setHiColorByRGB (255,255,255); }} loop vazio () {potVal =analogRead (potPin); potVal =(potVal - 512,0) /512,0; Serial.print (potVal); Serial.print ("\ n"); // p é o mesmo que potVal, mas é um inteiro p =analogRead (potPin); w =mapa (p, 0,1023,100, -100); m =mapa (p, 0,1023,90,0); // mostra a agulha e marca xx =m; if (xx <45) {xx =xx + 135; } else {xx =xx - 45; } // loop de imagem {u8g.firstPage (); faça {calibre (xx); } while (u8g.nextPage ()); } atraso (10);}
arduinoElevatorTrim.py Python
Script a ser executado junto com o FlightGear para "traduzir" a comunicação serial em pacotes UDP. Você precisa do Python instalado para executar este script. Modifique a linha 14 (porta USB onde o Arduino está conectado) conforme necessário.#! / Usr / bin / pythonimport sysimport serialfrom socket import * host ="localhost" port =21567 # buf =1024addr =(host, porta) UDPSock =socket (AF_INET, SOCK_DGRAM) tty ="COM4" print ("tty é", tty) try:ser =serial.Serial (tty, 9600) exceto:print ("Erro ao conectar a", tty) prevline ="" enquanto 1:contorno ='' linha =ser.readline () if linha! =Prevline:#algum valor alterado print (linha) contorno =linha UDPSock.sendto (contorno, addr) prevline =linha
arduinoElevatorTrim.xml XML
Script a ser adicionado na pastaXml version ="1.0"?>\ n , Compensação do elevador / controls / flight / elevator-trim float
Github
Repositório online em Githubhttps://github.com/dciliberti/arduinoElevatorTrimOLEDEsquemas
No Fritzing, não é possível passar os fios abaixo dos componentes. O fio terra da tela pode ficar sob o Arduino Nano.Processo de manufatura