FlightGear Analog Trim Tab Wheel
Componenten en benodigdheden
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Apps en online services
| ||||
| ||||
|
Over dit project
Arduino verbinden met FlightGear is niets nieuws, maar ik heb gemerkt dat wiki's verouderd zijn en dat forums waardevolle tips geven waar je moet werken.
Het idee was om een mooi, goedkoop en compact analoog commando te hebben om het lifttrimwiel van een vliegtuig in FlightGear te besturen. De wiki werkt tot het communicatiegedeelte. Strikt genomen kunt u seriële communicatie niet rechtstreeks gebruiken om opdrachten van Arduino naar FlightGear door te geven. Je moet een tijdelijke oplossing met Python gebruiken om pakketten via UDP te verzenden.
Wat is een trimwiel? Het is een analoog apparaat om de afbuiging van het trimvlak te regelen, een aerodynamisch apparaat om een stuuroppervlak (in dit geval de lift die de vliegtuighelft regelt) in een bepaalde positie te houden zonder inspanning van de piloot. Van wikipedia:
Aanvullende vereisten voor dit project:python met de bibliotheken serieel
, stopcontact
, en sys
geïnstalleerd. Ervan uitgaande dat Anaconda is geïnstalleerd, kunnen de ontbrekende bibliotheken worden opgehaald met de Anaconda-prompt door te typen:
>>> conda install -c anaconda pyserial
hetzelfde met serieel
en socket
. Zoek op internet naar een geschikt pakket, meestal zijn de meest gedownloade voor uw platform goed. Zodra je Python met deze bibliotheken hebt (en natuurlijk FlightGear geïnstalleerd), kun je naar het volgende gedeelte gaan.
Er zijn drie codescripts:een Arduino-schets, een uitvoerbaar python-script en een XML-script. De Arduino-schets moet op uw bord worden geladen. Het python-script moet worden uitgevoerd om communicatie tussen Arduino en FlightGear mogelijk te maken. Het XML-script is een generiek FlightGear-protocol dat moet worden verplaatst naar
De Arduino-schets vereist de U8glib
bibliotheek. Zoals vermeld in de opmerking, pas lijn 2 van de schets aan met je display:
#include U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI
Zie U8glib
voorbeelden en documentatie. De schets zou zelfs zonder display moeten werken, dus je kunt spelen zonder visuele feedback van je bord.
Als je niet tevreden bent met de draairichting, verander dan gewoon de positie van de laatste twee argumenten in de volgende kaart
instructies
w =kaart(p,0,1023,100,-100);m =kaart(p,0,1023,90,0);
zodat de waarden van de potentiometer van -100 naar 100 gaan en de naalddikte van 0 naar 90 (dit is een truc om de naald in de juiste positie te trekken, probeer het zelf als je nieuwsgierig bent).
Het python-script bevat het hostadres en het seriele poortnummer. De host moet "localhost"
zijn (als het niet werkt, probeer het dan met 127.0.0.1
), de poort willekeurig (misschien is het beter een die niet door andere toepassingen wordt gebruikt, ik weet het niet), de seriële poort waarop je bord is aangesloten, kan worden gelezen uit de Arduino IDE. In mijn geval is het "COM4"
. Opmerking:als u de Arduino test met de seriële monitor, moet u mogelijk uw bord loskoppelen en opnieuw aansluiten voordat u het python-script uitvoert om het correct te laten werken.
host ="localhost"port =21567#buf =1024addr =(host,poort)UDPSock =socket(AF_INET,SOCK_DGRAM)tty="COM4"print("tty is", tty)
Het python-script kan overal staan. U kunt het uitvoeren vanaf de opdrachtregel van uw besturingssysteem. In mijn geval (Windows) typ ik in de opdrachtprompt:
python c:\path\to\file\arduinoElevatorTrim.py
Dit kan worden gestart voor of zelfs na het starten van FlightGear.
Tot slot, zoals eerder vermeld, moet het XML-script eens en voor altijd worden verplaatst naar de protocolmap van uw FlightGear-installatie. Nu ben je klaar om te gaan. Start FlightGear met uw voorkeursmodus (opdrachtregel of opstartprogramma) door het volgende commando toe te voegen (geen spatie tussen tekens!) :
--generic=socket,in,30,localhost,21567,udp,arduinoElevatorTrim
waar we FlightGear vertellen om een generiek protocol via socket toe te passen, invoer 30 keer per seconde te lezen, op het adres localhost, poort 21567, UDP-protocol, instructies in het bestand arduinoElevatorTrim.xml. Veel plezier met je persoonlijke trimwiel!
Code
- arduinoElevatorTrimOLED.ino
- arduinoElevatorTrim.py
- arduinoElevatorTrim.xml
arduinoElevatorTrimOLED.inoArduino
Code om op de Arduino Nano te laden. Pas regel 2 (type weergave) indien nodig aan.#includeU8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI int xmax =128; int ymax =64; int xcentrum =xmax/2; int ycentrum =ymax/2+10; int boog =ymax/2; int-hoek =0; char* label ="TRIM"; int labelXpos =53; int p, w, m;u8g_uint_t xx =0;int const potPin =A6;float potVal;// Aangepaste functionvoid gauge (uint8_t angle) {// teken de rand van de meter 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); // teken de naaldvlotter x1 =sin (2 * hoek * 2 * 3.14/360); float y1 =cos (2*hoek*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); // toon schaallabels// 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, "OMLAAG"); u8g.drawStr( 52, 17 , "NEUT"); u8g.drawStr( 105, 42, "UP"); // toon meterlabel u8g.setPrintPos(labelXpos,32); u8g.print(label); // toon digitale waarde en lijn de positie uit 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); // wijs standaard kleurwaarde toe als ( 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); }}void loop() { potVal =analogRead(potPin); potVal =(potVal - 512.0)/512.0; Serial.print(potVal); Serieel.print("\n"); // p is hetzelfde als potVal, maar het is een geheel getal p =analogRead(potPin); w =kaart(p,0,1023,100,-100); m =kaart(p,0,1023,90,0); // toon naald en kies xx =m; als (xx <45){ xx =xx + 135; } anders { xx =xx - 45; } // afbeeldingslus { u8g.firstPage(); doe { meter(xx); } while( u8g.nextPage() ); } vertraging(10);}
arduinoElevatorTrim.pyPython
Script dat samen met FlightGear moet worden uitgevoerd om seriële communicatie te "vertalen" naar UDP-pakketten. Je moet Python geïnstalleerd hebben om dit script uit te voeren. Wijzig regel 14 (USB-poort waarop de Arduino is aangesloten) indien nodig.#!/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)behalve:print("Fout bij verbinden met ", tty) prevline=""while 1:outline='' line=ser.readline() if line !=prevline:#some value changes print(line) outline=line UDPSock.sendto(outline,addr) prevline=line
arduinoElevatorTrim.xmlXML
Script dat moet worden toegevoegd in de map\n , Elevator trim /controls/flight/elevator-trim float
Github
Online repository op Githubhttps://github.com/dciliberti/arduinoElevatorTrimOLEDSchema's
Bij Fritzing is het niet mogelijk om draden onder componenten door te voeren. De aardingsdraad van het display kan onder de Arduino Nano gaan.Productieproces