FlightGear analoges Trimm-Tabrad
Komponenten und Verbrauchsmaterialien
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Apps und Onlinedienste
| ||||
| ||||
|
Über dieses Projekt
Arduino mit FlightGear zu verbinden ist nichts Neues, aber ich habe festgestellt, dass Wikis veraltet sind und Foren wertvolle Hinweise geben, wo man etwas umgehen muss.
Die Idee war, einen schönen, billigen und kompakten analogen Befehl zu haben, um das Höhenruder-Trimmrad eines Flugzeugs in FlightGear zu steuern. Das Wiki funktioniert bis zum Kommunikationsteil. Streng genommen können Sie die serielle Kommunikation nicht direkt verwenden, um Befehle von Arduino an FlightGear zu übergeben. Um Pakete über UDP zu senden, müssen Sie mit Python umgehen.
Was ist ein Trimmrad? Es ist ein analoges Gerät, um die Auslenkung der Trimmklappe zu steuern, die ein aerodynamisches Gerät ist, um eine Steuerfläche (in diesem Fall das Höhenruder, das die Flugzeugneigung steuert) ohne Anstrengung des Piloten in einer bestimmten Position zu halten. Aus Wikipedia:
Zusätzliche Anforderungen für dieses Projekt:Python mit den Bibliotheken seriell
, Buchse
, und sys
Eingerichtet. Angenommen, Anaconda wurde installiert, können die fehlenden Bibliotheken mit der Anaconda-Eingabeaufforderung abgerufen werden, indem Sie Folgendes eingeben:
>>> conda install -c anaconda pyserial
das gleiche mit seriell
und Buchse
. Suchen Sie im Internet nach einem geeigneten Paket, normalerweise sind die am häufigsten heruntergeladenen für Ihre Plattform gut. Sobald Sie Python mit diesen Bibliotheken (und natürlich FlightGear installiert) haben, können Sie mit dem nächsten Abschnitt fortfahren.
Es gibt drei Codeskripte:eine Arduino-Skizze, ein ausführbares Python-Skript und ein XML-Skript. Die Arduino-Skizze muss auf Ihrem Board geladen werden. Das Python-Skript muss ausgeführt werden, um die Kommunikation zwischen Arduino und FlightGear zu ermöglichen. Das XML-Skript ist ein generisches FlightGear-Protokoll, das nach
Die Arduino-Skizze erfordert das U8glib
Bücherei. Passen Sie, wie im Kommentar erwähnt, die Zeile 2 der Skizze an Ihre Anzeige an:
#include U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI
Siehe U8glib
Beispiele und Dokumentation. Der Sketch sollte auch ohne Display funktionieren, sodass du ohne visuelles Feedback von deinem Board spielen kannst.
Wenn Sie mit der Drehrichtung unzufrieden sind, vertauschen Sie einfach die Position der letzten beiden Argumente in der folgenden Karte
Anleitung
w =Karte(p,0,1023,100,-100);m =Karte(p,0,1023,90,0);
so dass die Werte des Potentiometers von -100 bis 100 und die Nadelstärke von 0 bis 90 gehen (dies ist ein Trick, um die Nadel in die richtige Position zu ziehen, versuchen Sie es selbst, wenn Sie neugierig sind).
Das Python-Skript enthält die Hostadresse und die Seriennummer des seriellen Ports. Der Host sollte "localhost"
sein (Wenn es nicht funktioniert, versuchen Sie es mit 127.0.0.1
), der Port any (vielleicht ist es besser, der nicht von anderen Anwendungen verwendet wird, ich weiß es nicht), der serielle Port, an dem Ihr Board angeschlossen ist, kann von der Arduino IDE gelesen werden. In meinem Fall ist es "COM4"
. Hinweis:Wenn Sie das Arduino mit dem seriellen Monitor testen, müssen Sie möglicherweise Ihr Board trennen und erneut anschließen, bevor Sie das Python-Skript ausführen, damit tomakeit ordnungsgemäß funktioniert.
host ="localhost"port =21567#buf =1024addr =(host,port)UDPSock =socket(AF_INET,SOCK_DGRAM)tty="COM4"print("tty is", tty)
Das Python-Skript kann sich überall befinden. Sie können es über die Befehlszeile Ihres Betriebssystems ausführen. In meinem Fall (Windows) gebe ich die Eingabeaufforderung ein:
python c:\path\to\file\arduinoElevatorTrim.py
Dies kann vor oder sogar nach dem Starten von FlightGear gestartet werden.
Abschließend muss das XML-Skript, wie bereits erwähnt, ein für alle Mal in den Protokollordner Ihrer FlightGear-Installation verschoben werden. Jetzt sind Sie bereit zu gehen. Starten Sie FlightGear mit Ihrem bevorzugten Modus (Befehlszeile oder Startprogramm), indem Sie den folgenden Befehl hinzufügen (kein Leerzeichen zwischen den Zeichen!) :
--generic=socket,in,30,localhost,21567,udp,arduinoElevatorTrim
wo wir FlightGear anweisen, ein generisches Protokoll über Socket anzuwenden, lesen Sie die Eingabe 30 Mal pro Sekunde auf der Adresse localhost, Port 21567, UDP-Protokoll, Anweisungen in der Datei arduinoElevatorTrim.xml. Genießen Sie Ihr persönliches Trimmrad!
Code
- arduinoElevatorTrimOLED.ino
- arduinoElevatorTrim.py
- arduinoElevatorTrim.xml
arduinoElevatorTrimOLED.inoArduino
Code zum Laden auf dem Arduino Nano. Passen Sie Zeile 2 (Anzeigetyp) nach Bedarf an.#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; int arc =ymax/2; int-Winkel =0; char* Etikett ="TRIM"; int labelXpos =53; int p, w, m;u8g_uint_t xx =0;int const potPin =A6;float potVal;// Benutzerdefinierte Funktionvoid Gauge(uint8_t angle) { // Rahmen der Gauge zeichnen 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); // Zeichne den Nadelschwimmer x1 =sin(2*angle*2*3.14/360); float y1 =cos(2*Winkel*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); // Skalenbeschriftungen anzeigen // 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, "DOWN"); u8g.drawStr( 52, 17 , "NEUT"); u8g.drawStr( 105, 42, "UP"); // Messgerät-Label anzeigen u8g.setPrintPos (labelXpos,32); u8g.print (Etikett); // Digitalwert anzeigen und Position ausrichten u8g.setFont (u8g_font_profont22); wenn (w>=99) { u8g.setPrintPos(47,60); aufrechtzuerhalten. Wenn (w>=10 &&w <99) {u8g.setPrintPos(54,60); aufrechtzuerhalten. Wenn (w>=0 &&w <9) {u8g.setPrintPos(60,60); aufrechtzuerhalten. Wenn (w>=-9 &&w <0) {u8g.setPrintPos(48,60); aufrechtzuerhalten. Wenn (w>=-99 &&w <-9) { u8g.setPrintPos(42,60); aufrechtzuerhalten. Wenn (w <-99) {u8g.setPrintPos(35,60); } u8g.print (w);}void setup () { Serial.begin (9600); u8g.setFont(u8g_font_chikita); u8g.setColorIndex(1); // Standardfarbwert zuweisen if ( u8g.getMode () ==U8G_MODE_R3G3B2 ) { u8g.setColorIndex(255); aufrechtzuerhalten. Sonst if (u8g.getMode() ==U8G_MODE_GRAY2BIT) { u8g.setColorIndex(3); aufrechtzuerhalten. Sonst if (u8g.getMode() ==U8G_MODE_BW) { u8g.setColorIndex(1); aufrechtzuerhalten. Sonst 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); Serial.print("\n"); // p ist das gleiche wie potVal, aber es ist eine ganze Zahl p =analogRead (potPin); w =map(p,0,1023,100,-100); m =Karte(p,0,1023,90,0); // Zeige Nadel und Zifferblatt xx =m; wenn (xx <45) {xx =xx + 135; aufrechtzuerhalten. Sonst {xx =xx - 45; } // Bildschleife { u8g.firstPage (); tun { Messgerät (xx); } while(u8g.nextPage()); } Verzögerung(10);}
arduinoElevatorTrim.pyPython
Skript, das zusammen mit FlightGear ausgeführt wird, um die serielle Kommunikation in UDP-Pakete zu "übersetzen". Sie müssen Python installiert haben, um dieses Skript auszuführen. Ändern Sie Zeile 14 (USB-Port, an dem das Arduino angeschlossen ist) nach Bedarf.#!/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)außer:print("Fehler beim Verbinden mit ", tty) prevline=""while 1:outline='' line=ser.readline() if line !=prevline:#ein Wert geändert print(line) outline=line UDPSock.sendto(outline,addr) prevline=line
arduinoElevatorTrim.xmlXML
Skript, das im Ordner\n , Elevator trim /controls/flight/elevator-trim float
Github
Online-Repository auf Githubhttps://github.com/dciliberti/arduinoElevatorTrimOLEDSchaltpläne
In Fritzing ist es nicht möglich, Drähte unter Komponenten zu führen. Das Erdungskabel des Displays kann unter den Arduino Nano gehen.Herstellungsprozess