Interfaçage Arduino & Fsim9/X: Link2Fs démystifié

Tout sur les cartes et la programmation des modules ARDUINO

Re: Interfaçage Arduino & Fsim9/X: Link2Fs démystifié

Messagede FiX » Jeu 26 Mar 2015 22:29

Merci.
i7 2600k/P8P67pro/16Go PC3 17000/RX 580/SSD 250 Go et 120Go/W10x64
https://www.facebook.com/cessna150.sim
Avatar de l’utilisateur
FiX
 
Messages: 4664
Inscription: 8/01/10
Localisation: Reims/Maubeuge

Re: Interfaçage Arduino & Fsim9/X: Link2Fs démystifié

Messagede JacquesZ » Ven 27 Mar 2015 10:12

PARALAILE a écrit:Il me tarde que tu nous explique :
L'usage de la ligne Kstringoldstate = "111111111111111111111111111111111111111111111111111111111111111111111"; vous sera expliqué ultérieurement,

est ce une espèce de tableau qui ouvre toutes les connections.
Je le vois souvent dans les scripts dédiés à Link2Fs
Dominique --> DC-3

Dominique c'était pour entretenir le suspense! Sinon on perd des lecteurs

Je me suis également posé la question sur cette étrange ligne.
En fait la réponse tient au nom de la variable , et en comptant le nombre de 1: il y en a 70 comme les broches sur une MÉGA
La variable 'est en fait une simple chaîne de cactères qui va stocker de manière provisoire l'état de toutes les entrés/sorties sous forme de 1 ou 0.

Ca n'a rien à voir avec le langage Arduino, c'est juste une "manip" qui va servir dans la sous routine INPUTS pour comparer via une boucle l'état actuel de chaque broche avec son état antérieur ("oldState").
On va lire la chaîne caractère/caractère et voir si l'état a changé.
Si c'est le cas, on traite l'instruction et on remplace le 1 par un 0 (ou inversement) dans la chaîne Kstringoldstate. On va retrouver tout ça dans la routine INPUTS qui fera l'objet d'une autre partie du tuto

C'est une gestion un peu capilotractée des évènements, mais ça marche!
Perso j'aurais plutôt géré ça avec un tableau de 70 broches pour pouvoir y accéder directement sans re scanner la chaîne via une boucle à chaque fois. Mais sa technique est peut-être plus efficace en terme de place mémoire une fois compilée, je ne sais pas....

Jacques
Dernière édition par JacquesZ le Sam 28 Mar 2015 19:30, édité 1 fois.
Ma chaîne YouTube Tutos sur l’A320 par un Pilote de Ligne: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2848
Inscription: 24/11/10

Re: Interfaçage Arduino & Fsim9/X: Link2Fs démystifié

Messagede PARALAILE » Ven 27 Mar 2015 12:01

Merci Jacques
Dominique c'était pour entretenir le suspense!

désolé!

Sinon on perd des lecteurs

ça métonnerai!
Avatar de l’utilisateur
PARALAILE
 
Messages: 111
Inscription: 11/11/12

Link2Fs démystifié: GERER UN EVENEMENT SIMCONNECT

Messagede JacquesZ » Sam 28 Mar 2015 19:09

Rebonjour à Tous

Partie 3 du Tuto "Link2FS démystifié", aujourd'hui GERER UN EVENEMENT SIMCONNECT: EQUAL(),LESSTHAN(), QUESTION() and SLASH():

Après la section setup()( et la section loop(), on va étudier aujourd'hui les quatre sous routines que l'on retrouve normalement dans tout script Link2FS: EQUAL(),LESSTHAN(), QUESTION() et SLASH().

Ces quatre sous routines (appelées aussi "void", en ce sens qu'elle ne retournent aucun paramètre) permettent de traiter les évènements Simconnect reçus en entrée par la Carte Arduino et transmis par la partie "Windows" du programme Link2FS Multi qui doit se trouver sur le même PC que celui qui fait tourner FS9/FSX/P3D.

Les sous routines sont nommées par le premier "caractère code" de l'évènement envoyé à l'Arduino via le buffer série (USB), à savoir les caractères '=','<','?' et '/'. Le choix des caractères est arbitraire, il a été fait par l'auteur du programme Link2FS Jim Page.

NOTE: Je vous recommande dans votre script de base d'intégrer directement l'ensemble des sous routines, même si elles ne servent à rien pour l'instant, ce sera plus simple lors de l'extension ultérieures des fonctionnalités de votre script. Vous pouvez vous inspirer du script 'Multi_Keys_Gear_Simconnect.ino' que l'on trouve dans le répertoire Demo INOs du répertoire d'installation de Link2FS.

Les quatres routines fonctionnent selon le même principe, aussi nous allons voir le fonctionnement de la routine LESSTHAN() qui adresse les évènement liés aux indicateurs divers (position du train, position des volets, fuel, paramètres moteur, phares, etc...). Tous les codes traités par cette section LESSTHAN() commencent par le caractère '<', d'où son nom.

Le paramètre correspondant est surveillé par Link2FS si on a coché la case correspondante dans les onglets 'FSConnect Extractions'. Pour le tuto, on va supposer qu'on a coché les cases <A Gear Nose , <B Gear left , <C Gear Right et <G Flaps position. Ainsi LINK2FS va "surveiller" les événements correspondants en interrogeant régulièrement FSim (NOTE 1) et envoyer dans le Buffer série les codes appropriés (NOTE 2).
Par exemple pour le train avant, le code envoyé sera sous la forme <AXXX, avec XXX représentant dans ce cas en % la position de l'élément de train qui va varier de 000(rentré) à 100(complètement sorti).

NOTE 1:
La fréquence d'interrogation par Link2FS des évènements Simconnect est réglée individuellement pour chaque carte branchée, dans l'onglet "Communication Settings" sous le paramètre "Cycle Time"(M/s). Ainsi une valeur de 200 signifie que Link2Fs va interroger FSX sur les paramètres qu'on lui a demandé de suivre toutes les 200 millisecondes.
La valeur "Refresh Time" indique à Link2Fs la fréquence à laquelle il doit republier l'information obtenue sur le port série. La valeur de 5 secondes est correcte dans la plupart des cas.

NOTE 2 :
Souvenez vous que chaque fois qu'un caractère est demandé par la sous-routine getChar(), il est automatiquement enlevé du buffer.

Dans notre exemple, on suppose que LINK2FS a envoyé dans le buffer série(USB) le code '<A100'. Si vous vous souvenez du tuto précédent, la section loop() a déjà intercepté le premier caractère code (le '<'), l'a traité et a donc transféré le traitement de la suite à la section LESSTHAN(). Le prochain caractère disponible dans le buffer série est donc le caractère 'A'.

vous suivez toujours? C'est parti:
Code: Tout sélectionner
void LESSTHAN(){    // la routine de gestion des codes d'indications commençant par <
CodeIn = getChar(); // On interroge le port série pour récupérer le prochain caractère (NOTE 1)
                              //et on le stocke dans la variable CodeIn  (dans notre exemple, c'est le caractère 'A')

  switch(CodeIn) {     //on va réagir en fonction du caractère trouvé dans CodeIn
    case 'A':               // Si c'est le caractère 'A', c'est l'indicateur de train avant
                              // On exécute toutes les instructions suivantes jusqu'à rencontrer l'instruction  "break;"
      gearN = "";         // On crée une variable chaîne de caractère pour récupérer les caractères suivant le 'A' et l'initialise
      gearN += getChar(); // on récupère le 1er caractère après le 'A', dans notre exemple le caractère '1'
      gearN += getChar(); // on récupère le 2e caractère après le 'A', dans notre exemple le caractère '0' qu'on ajoute au 1er
      gearN += getChar(); // on récupère le 3e caractère après le 'A', dans notre exemple le caractère '0' qu'on ajoute aussi
      gearNi = gearN.toInt(); // on convertit la chaine de caractère "100" en un entier avec la méthode toInt()
                                        //et on stocke le nombre obtenu dans  la variable gearNi

      if (gearNi > 99){                             // le train est il quasiment sorti (>99%)?
                      digitalWrite(2, HIGH);   // Si oui, on allume la led branchée sur la broche n°2 (NOTE 2)
                                                          //en envoyant la valeur "HIGH" à cette branche via l'instruction digitalWrite 
                      }       
                      else{                          // sinon on garde la led éteinte
                     digitalWrite(2, LOW); //en envoyant la valeur "LOW" à cette branche via l'instruction digitalWrite
                     }
       break; // On a fini l'instruction Switch, on retourne à la boucle loop()
 

NOTE 1:
La sous routine getChar() interroge le port série, puis retourne sous forme de caractère le premier code du buffer. Ce caractère est automatiquement enlevé du buffer lors de l'appel, attention à ne pas perdre de caractères.

NOTE 2:
L'instruction Arduino digitalWrite(PinNumber, XXXX) avec XXX prenant la valeur "HIGH" ou "LOW" permet d'indiquer à l'Arduino d'envoyer ("HIGH") ou de ne pas envoyer ("LOW") un courant de 5V sur la broche correspondante. La broche devra avoir été configurée comme une sortie ("OUTPUT") au préalable dans la section setup() via l'instruction pinMode(PinNumber,OUTPUT), comme vu dans le Tuto partie 1.

On continue ?:
Code: Tout sélectionner
// Si le premier caractère lu n'est pas 'A', on passe au suivant
    case 'B':         // est ce que c'est le 'B' (train gauche)? Si oui on traite l'instruction jusqu'à rencontrer l'instruction break
      gearL = "";  // on fait exactement la même chose que pour la roulette de nez
      gearL += getChar();
      gearL += getChar();
      gearL += getChar();
      gearLi = gearL.toInt(); // convert it to an integer (Thanks Phill)
         // on allume ou éteint la Led verte branchée sur la broche 3
      if (gearLi > 99){digitalWrite(3, HIGH);}else{digitalWrite(3, LOW);}
 break; //on a fini l'instruction switch
     
    case 'C':         // est ce que c'est le 'C' (train droit)? Si oui on traite l'instruction jusqu'à rencontrer l'instruction break
        gearR = ""; // on fait exactement la même chose que pour la roulette de nez
      gearR += getChar();
      gearR += getChar();
      gearR += getChar();
      gearRi = gearR.toInt(); // convert it to an integer (Thanks Phill)
         // on allume ou éteint la Led verte branchée sur la broche 4
      if (gearRi > 99){digitalWrite(4, HIGH);}else{digitalWrite(4, LOW);}
    break; // On a fini l'instruction Switch
 
    case 'G': // est ce que c'est la position des volets? 
                           // vous avez compris le principe, alors je vous laisse remplir cet espace avec votre propre routine !!!
                           // par exemple on peut imaginer allumer une diode jaune lorsque le volet est "en transition"
                           // et allumer une diode verte pour la position Full Flaps
                          // ou bien piloter un servomoteur d'indications de position des flaps (ce point fera l'objet d'un autre tuto)
    break;  // On a fini l'instruction Switch,
   } // cette accolade fermante signifie la fin de l'instruction Switch/Case
} // Fin de la sous routine LESSTHAN(), on retourne à la boucle loop()


On peut évidemment complexifier le code à loisir par exemple en allumant en plus une diode rouge pour indiquer que le train est en transition, tant que la somme des variables GearNi, GearLi et GearRi est inférieure à 300 (100+100+100).

Une dernière remarque: Le nombre d'appels faits à la routine getChar dans une section "case/break" dépend du nombre de caractères associés à l'évènement simconnect. Il peut varier fortement, par exemple:
    -1 caractère seulement suit le =V pour l'état de l'indicateur ILS Marker (ce caractère peut prendre la valeur 0,1,2 ou 3),
    -1 caractère suit le =a pour l'état de l'autopilote (0=inactif,1=actif)
    -10 caractères suivent le <f pour l'état des interrupteurs éclairage/phare (à tester, chacun prenant la valeur 0 ou 1)

Et voilà, on sait maintenant allumer trois diodes branchées sur les broches 2, 3 et 4 pour avoir les "trois vertes" quand on aura manoeuvré la manette de train dans FS soit par le raccourci clavier classique, soit par un clic souris sur le Tdb virtuel, soit via un vrai levier ou un inter branché dans notre cockpit physique.

Cette dernière option fera l'objet d'un prochain tuto sur la section "INPUTS()"

To be continued...
Jacques
Ma chaîne YouTube Tutos sur l’A320 par un Pilote de Ligne: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2848
Inscription: 24/11/10

Re: Interfaçage Arduino & Fsim9/X: Link2Fs démystifié

Messagede JacquesZ » Ven 22 Jan 2016 23:10

Pour ceux qui attendent impatiemment la suite du Tuto, toutes mes excuses, je suis un peu occupé en ce moment avec mon ATPL théorique (c'est plus prenant que ce que je pensais).
Mais je ne vous oublie pas, je vais m'y remettre bientôt!

Jacques
Ma chaîne YouTube Tutos sur l’A320 par un Pilote de Ligne: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2848
Inscription: 24/11/10

Re: Interfaçage Arduino & Fsim9/X: Link2Fs démystifié

Messagede André » Sam 8 Avr 2017 17:10

Bonjour à tous
je ré-ouvre se poste
et la suis complètement perdu murrouge
je ne comprend pas comment câblé la carte arduino en fonction des données extrais de link2fs gratgrat gratgrat gratgrat
Avatar de l’utilisateur
André
 
Messages: 111
Inscription: 25/08/10

Re: Interfaçage Arduino & Fsim9/X: Link2Fs démystifié

Messagede JacquesZ » Sam 8 Avr 2017 21:56

Bonsoir André

Pour faire court, dans le dernier élément de code du tuto il y avait ça

Code: Tout sélectionner
   case 'C':         // est ce que c'est le 'C' (train droit)? Si oui on traite l'instruction jusqu'à rencontrer l'instruction break
        gearR = ""; // on fait exactement la même chose que pour la roulette de nez
      gearR += getChar();
      gearR += getChar();
      gearR += getChar();
      gearRi = gearR.toInt(); // convert it to an integer (Thanks Phill)
         // on allume ou éteint la Led verte branchée sur la broche 4
      if (gearRi > 99){ digitalWrite(4, HIGH);}else{digitalWrite(4, LOW);}
    break; // On a fini l'instruction Switch


La réponse à ta question est là:

// on allume ou éteint la Led verte branchée sur la broche 4
if (gearRi > 99){ digitalWrite(4, HIGH);}else{digitalWrite(4, LOW);}

Donc en gros il faut une LED verte branchée sur la broche 4 de l'Arduino via une résistance adaptée (415 Ohms de mémoire, à vérifier) pour ne pas la griller, et l'autre patte de la led branchée sur l'entrée GND et ça devrait marcher, ta led va s'allumer lorsque le train est sorti.

Pour la partie électronique, je te conseille un bouquin de base du style Arduino pour les Nuls pour savoir comment brancher les différents capteurs et diodes.

Fab ou Philippe (DreamBox) pourra sans doute élaborer un peu plus sur le sujet je pense...

Jacques
Ma chaîne YouTube Tutos sur l’A320 par un Pilote de Ligne: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2848
Inscription: 24/11/10

Re: Interfaçage Arduino & Fsim9/X: Link2Fs démystifié

Messagede JacquesZ » Sam 8 Avr 2017 22:17

Pour la suite du TUTO, Ce sera au mois de Juin une fois mes exams terminés je repars dans le developpement de mon sim, maintenant que j'ai reçu mes panels de Franck je suis motivé!
Ma chaîne YouTube Tutos sur l’A320 par un Pilote de Ligne: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2848
Inscription: 24/11/10

Re: Interfaçage Arduino & Fsim9/X: Link2Fs démystifié

Messagede pierre01 » Sam 8 Avr 2017 22:30

JacquesZ a écrit:Donc en gros il faut une LED verte branchée sur la broche 4 de l'Arduino via une résistance adaptée (415 Ohms de mémoire, à vérifier) pour ne pas la griller


415 Ohms, c'est pas très standard ça ??? gratgrat
Allez au pif : 390 ou 470 Ohms, pour une LED sous 5V ça va le faire !
A+
Pierre.
Avatar de l’utilisateur
pierre01
 
Messages: 1769
Inscription: 19/04/09
Localisation: Vers Vesoul (Haute Saône)

Re: Interfaçage Arduino & Fsim9/X: Link2Fs démystifié

Messagede fab » Sam 8 Avr 2017 22:34

oui 470 ohms, c'est bon ...

Je n'ai plus d'arduino sous la main, mais si tu nous poses une question plus précise, on pourras y répondre gratgrat
Avatar de l’utilisateur
fab
 
Messages: 4414
Inscription: 26/12/12
Localisation: Roubaix

PrécédenteSuivante

Retourner vers Interface & logiciel ARDUINO





Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités