Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Molette de trim analogique FlightGear

Composants et fournitures

Arduino Nano R3
ou carte compatible
× 1
Potentiomètre rotatif (générique)
× 1
Condensateur 100 µF
× 1
Adafruit SSD1306 0.96 pouces OLED
× 1
Câbles de raccordement (générique)
× 1

Applications et services en ligne

Arduino IDE
Anaconda
FlightGear

À propos de ce projet

La connexion d'Arduino à FlightGear n'a rien de nouveau, mais j'ai trouvé que les wikis sont obsolètes et les forums donnent de précieux conseils sur lesquels vous devez travailler.

L'idée était d'avoir une commande analogique sympa, bon marché et compacte pour contrôler la molette de compensateur de profondeur d'un avion dans FlightGear. Le wiki fonctionne jusqu'à la partie communication. À proprement parler, vous ne pouvez pas utiliser directement la communication série pour transmettre des commandes d'Arduino à FlightGear. Vous devez contourner le problème avec Python pour envoyer des paquets via UDP.

Qu'est-ce qu'une roue de trim ? Il s'agit d'un dispositif analogique permettant de contrôler le braquage du trim tab, qui est un dispositif aérodynamique permettant de maintenir une gouverne (en l'occurrence la gouverne de profondeur contrôlant le tangage de l'avion) ​​dans une position donnée sans effort de la part du pilote. De wikipédia :

Exigences supplémentaires pour ce projet :python avec les bibliothèques serial , socket , et sys installée. En supposant qu'Anaconda a été installé, les bibliothèques manquantes peuvent être récupérées avec l'invite Anaconda en tapant :

>>> conda install -c anaconda pyserial

idem avec serial et socket . Recherchez sur Internet un package approprié, généralement les plus téléchargés pour votre plate-forme sont bons. Une fois que vous avez python avec ces bibliothèques (et, bien sûr, FlightGear installé), vous pouvez passer à la section suivante.

Il existe trois scripts de code :une esquisse Arduino, un script exécutable python et un script XML. Le sketch Arduino doit être chargé sur votre carte. Le script python doit être exécuté pour permettre la communication entre Arduino et FlightGear. Le script XML est un protocole générique FlightGear qui doit être déplacé vers /data/protocol une fois pour toutes.

Le sketch Arduino nécessite le U8glib bibliothèque. Comme mentionné dans le commentaire, ajustez la ligne 2 du croquis avec votre affichage :

#include U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0) ; // I2C / TWI 

Voir U8glib exemples et documentations. Le croquis devrait fonctionner même sans écran, vous pouvez donc jouer sans retour visuel de votre tableau.

Si vous n'êtes pas satisfait du sens de rotation, changez simplement la position des deux derniers arguments dans la map suivante instructions

w =carte(p,0,1023,100,-100);m =carte(p,0,1023,90,0); 

pour que les valeurs du potentiomètre passent de -100 à 100 et la jauge de l'aiguille de 0 à 90 (c'est une astuce pour tirer l'aiguille dans la bonne position, essayez vous-même si vous êtes curieux).

Le script python inclut l'adresse de l'hôte et le numéro de port série. L'hôte doit être "localhost" (si ça ne marche pas, essayez avec 127.0.0.1 ), le port quelconque (c'est peut-être mieux qu'il ne soit pas utilisé par d'autres applications, je ne sais pas), le port série sur lequel votre carte est connectée peut être lu à partir de l'IDE Arduino. Dans mon cas, c'est "COM4" . Remarque :si vous testez l'Arduino avec le moniteur série, vous devrez peut-être déconnecter et reconnecter votre carte avant d'exécuter le script python afin de le faire fonctionner correctement.

host ="localhost"port =21567#buf =1024addr =(host,port)UDPSock =socket(AF_INET,SOCK_DGRAM)tty="COM4"print("tty is ", tty) 

Le script python peut être situé n'importe où. Vous pouvez l'exécuter à partir de la ligne de commande de votre système d'exploitation. Dans mon cas (Windows), je tape dans l'invite de commande :

python c:\path\to\file\arduinoElevatorTrim.py

Cela peut être lancé avant ou même après le démarrage de FlightGear.

Enfin, comme indiqué précédemment, le script XML doit être déplacé une fois pour toutes dans le dossier protocole de votre installation FlightGear. Maintenant, vous êtes prêt à partir. Lancez FlightGear avec votre mode préféré (ligne de commande ou lanceur) en ajoutant la commande suivante (pas d'espace entre les caractères !) :

--generic=socket,in,30,localhost,21567,udp,arduinoElevatorTrim

où nous disons à FlightGear d'appliquer un protocole générique via socket, lisez l'entrée 30 fois par seconde, sur l'adresse localhost, port 21567, protocole UDP, instructions dans le fichier arduinoElevatorTrim.xml. Profitez de votre volant de finition personnel !

Code

  • arduinoElevatorTrimOLED.ino
  • arduinoElevatorTrim.py
  • arduinoElevatorTrim.xml
arduinoElevatorTrimOLED.inoArduino
Code à charger sur l'Arduino Nano. Ajustez la ligne 2 (type d'affichage) au besoin.
#include U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0) ; // I2C / TWI entier xmax =128 ; entier ymax =64 ; int xcentre =xmax/2; int ycentre =ymax/2+10 ; arc int =ymax/2; angle entier =0; char* étiquette ="TRIM" ; int étiquetteXpos =53 ; int p, w, m;u8g_uint_t xx =0;int const potPin =A6;float potVal;// Custom functionvoid gauge(uint8_t angle) { // dessine la bordure de la jauge 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); // dessine le flotteur de l'aiguille x1 =sin(2*angle*2*3.14/360); float y1 =cos(2*angle*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); // afficher les étiquettes d'échelle// 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"); // affiche l'étiquette de la jauge u8g.setPrintPos(labelXpos,32); u8g.print(étiquette); // affiche la valeur numérique et aligne sa position 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) ; // attribuer la valeur de couleur par défaut 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); }}boucle vide() { potVal =analogRead(potPin); potVal =(potVal - 512,0)/512,0 ; Serial.print(potVal); Serial.print("\n"); // p est le même que potVal, mais c'est un entier p =analogRead(potPin); w =carte(p,0,1023,100,-100); m =carte(p,0,1023,90,0); // afficher l'aiguille et composer xx =m; si (xx <45){ xx =xx + 135 ; } autre { xx =xx - 45 ; } // boucle d'image { u8g.firstPage(); faire { jauge(xx); } while( u8g.page suivante() ); } délai(10);}
arduinoElevatorTrim.pyPython
Script à exécuter avec FlightGear pour "traduire" la communication série en paquets UDP. Vous devez installer Python pour exécuter ce script. Modifiez la ligne 14 (port USB où l'Arduino est connecté) selon vos besoins.
#!/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 est ", tty)try:ser =serial.Serial(tty,9600)except:print("Erreur de connexion à " , tty) prevline=""while 1 :outline='' line=ser.readline() if line !=prevline :#une valeur modifiée print(line) outline=line UDPSock.sendto(outline,addr) prevline=line
arduinoElevatorTrim.xmlXML
Script à ajouter dans le dossier /data/Protocol. Faites-le une fois pour toutes.
  \n ,  Trim d'ascenseur /controls/flight/elevator-trim float  
Github
Référentiel en ligne sur Githubhttps://github.com/dciliberti/arduinoElevatorTrimOLED

Schémas

Chez Fritzing, il n'est pas possible de faire passer des fils sous les composants. Le fil de terre de l'écran peut passer sous l'Arduino Nano.

Processus de fabrication

  1. Dés numériques Arduino
  2. Iron Man
  3. Horloge POV LED de style analogique
  4. Trouvez-moi
  5. Bras robotique Arduino imprimé en 3D
  6. Contrôle de l'humidificateur Arduino
  7. NeoMatrix Arduino Pong
  8. Joystick Arduino
  9. Récepteur radio FM Arduino TEA5767