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

Tout sur les cartes et la programmation des modules ARDUINO

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

Messagede JacquesZ » Lun 23 Mar 2015 19:18

Rebonjour à tous

Je continue ma découverte de l'Arduino en créant une rubrique spéciale Link2Fs, le logiciel de Jim Page servant d'interface entre une carte Arduino (on peut aller jusqu'à 5 cartes en USB) et FsX ou FS9 selon les cas.
http://www.jimspage.co.nz/intro.htm

Link2FS dans sa version "Expert" permet de travailler avec les OFFSETS de FSUIPC version enregistrée et avec toutes les variables publiées de SimConnect.

Link2FS est composé:
- d'un programme d'interface à lancer sur le PC où se trouve Fsim et qui communique avec la ou les cartes Arduino connectées en USB
- d'un script que l'on télécharge (une seule fois) sur l'Arduino via l'environnement de programmation, script qu'il convient de "personnaliser" pour l'usage que l'on souhaite (utilisation des broches en entrée/sortie, affichage de Leds, utilisation de servos, etc...).
Ce script est écrit dans un sous ensemble du langage C avec des instructions spécifiques Arduino.

En respectant quelques principes de base de l'échange d'informations entre le script Arduino et Link2FS, on peut donc ajouter des fonctions au simu et programmer des comportements, de la même manière que les cartes open Cockpit avec SIOC.

link2FS Multi est fourni avec des exemples de scripts, du plus simple au plus compliqué.
Dans ce Topic, je me propose de décrypter ces scripts au fur et à mesure de mes découvertes, de manière partager et à faire partager nos expériences sur le sujet.

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

Link2Fs démystifié: la structure du script ARDUINO (partie1)

Messagede JacquesZ » Mer 25 Mar 2015 12:48

Rebonjour à tous.

Pour l'utilisation et la programmation d'une carte Arduino proprement dite, (téléchargement de l'environnement de développement (ou "IDE", qui comprend entre autres un éditeur de code et un compilateur), installation éventuelle des drivers, etc...) je vous renvoie aux dizaines de Tutoriels très bien fait sur le Net, à commencer par le site officiel où on pourra charger l'IDE http://arduino.cc/en/Main/HomePage et l'indispensable tuto d'ESKIMON http://eskimon.fr/ebook-tutoriel-arduino

La référence du langage en français se trouve ICI: http://playground.arduino.cc/French/Reference

Nous l'avons vu, Link2FS http://www.jimspage.co.nz/intro.htm se décompose en un soft d'interface sur Windows ET un fichier script (avec extension .ino ou .pde) à télécharger sur l'Arduino via l'IDE.

Pour l'utilisation du module link2Fs Multi sous Windows, je vous renvoie aux explications du site de Jim Page http://www.jimspage.co.nz/Link2fs_Multi.htm.
Pour le script INO en revanche, il va falloir mettre un peu les mains dans le cambouis, c'est l'objet de ce tuto
LINK2FS: LA STRUCTURE DU SCRIPT ARDUINO qui sera en plusieurs parties.


Au menu d'aujourd'hui SETUP() & LES ENTREES/SORTIES.
-----------------------------------------------------------------------------------------------------------------------
Dans Link2fs, une fois téléchargé le logiciel ici http://www.jimspage.co.nz/link2fs_multi_fsx_v5h.zip, on se retrouve avec un dossier d'exemples "Demo INOs" qui contient plusieurs scripts à titre d'exemple, du plus simple au plus compliqué. On charge un script d'un double clic dans l'environnement de programmation (IDE) Arduino, et on le compile ensuite pour le "téléverser" sur la carte si elle est branchée en USB au PC.

La quasi majorité des scripts fournis à titre d'exemple possède la même section "Setup" (partie de code exécutée 1 fois à l'initialisation). Regardons d'un peu plus près ces scripts:

Dans la partie "Setup()" d'un script Link2Fs, pour chaque broche de la carte (numérotée de 0 à 69 pour une MEGA, de 0 à19 pour une UNO) on peut définir cette dernière soit comme une entrée, soit comme sortie en utilisant l'instruction
pinMode(N° de la broche, E/S), avec :
    - N° de la broche un entier variant entre 0 et 69 dans le cas d'une Mega, entre 0 et 19 pour une UNO
    - E/S un mot clef précisant si la broche doit être configurée en entrée (INPUT) ou en sortie (OUTPUT).

On retrouve cette manip dans l'extrait de script tiré du script "Multi_keys.ino" que je vous conseille d'ouvrir en même temps.
Ici les broches 3 à 70 (numérotées 2 à 69, car la broche physique n°1 est numérotée 0 sur l'Arduino!!!) sont configurées en entrée (INPUT) via une simple boucle "for" :
Code: Tout sélectionner
void setup()
{
  Kstringoldstate = "111111111111111111111111111111111111111111111111111111111111111111111";
 
  for (int KoutPin = 2; KoutPin < 70; KoutPin++)// Boucle pour affectation des broches de 2 à 70  Voir NOTE 1
  {
    pinMode(KoutPin, INPUT); // on indique à Arduino de traiter la broche n°XX comme une entrée digitale (ON/OFF)
    digitalWrite(KoutPin, HIGH);  // Voir NOTE 2
  }
 Serial.begin(115200);   
}

Note 1:
On utilise une variable appelée "KoutPin" qui va s'incrémenter de 2 à 70 (pour une MEGA). Il faut remplacer le 70 par 19 si on utilise une UNO qui a moins de broches.
Les broches 0 et 1 ne sont pas attribuées dans le script (voilà pourquoi KoutPin démarre à 2 dans la boucle!), car elles servent normalement à la communication Série ou SPI, ceci dit je n'ai pas noté de pbms particulier sur ces deux broches, on peut donc remplacer le 2 par un 0.

Note 2:
L'instruction "digitalWrite(KoutPin, HIGH)" présente également dans la boucle sert à activer la résistance "PullUP" interne de la carte pour chaque interrupteur branché. Cette manip évite de devoir interposer une résistance externe pour chaque interrupteur branché sur la carte (de manière à assurer un état électrique défini lorsque l'inter est ouvert).

Note 3:
L'instruction "Serial.begin(115200)" sert à configurer la vitesse du port série de la carte en Bits/sec (entre 9600 et 115200 habituellement), le port série étant transformé par un circuit de la carte en signal USB.
L'usage de la ligne Kstringoldstate = "111111111111111111111111111111111111111111111111111111111111111111111"; vous sera expliqué ultérieurement, elle ne sert pas à configurer nos entrées/sorties.
On pourra inclure dans cette section Setup() tout le code nécessaire à l'initialisation de notre programme, sachant que cette section n'est exécutée qu'une seule fois au démarrage de la carte, cad à sa mise sous tension (branchement via l'USB ou alim externe) ou lors d'un appui sur le bouton RESET de l'Arduino.
--------------------
A l'inverse, dans le script "Multi_annun.pde" qu'on trouve toujours dans le dossier "Demo INOS", Jim a choisi les broches 0 à 9, qui sont configurées pour allumer des Leds externes en 5V(pour un panneau d'annonciateurs par exemple):
Code: Tout sélectionner
void setup(){
  for (count=0;count<9;count++) {//la variable "count" varie dans notre boucle de 0 à 9
    pinMode(AnunPinNo[count], OUTPUT);
   digitalWrite(AnunPinNo[count], LOW);
  }

Note1: l'instruction "digitalWrite(AnunPinNo[count], LOW)" présente également dans la boucle sert à éteindre les LEDs. Attention, car ce coup ci on a des LEDs branchées sur les sorties, LEDs qui elles nécessitent une résistance externe à la carte. (Le calcul des résistances nécessaire pour les LEDs est un autre sujet).

Note2: A l'exception des broches analogiques (A0 à A15), la broche d'une Arduino configurée en OUTPUT ne peut être utilisée dans ce mode que comme une sortie digitale (en gros un interrupteur On/Off).
Mais au delà d'une simple diode qu'on allume, on pourra aussi piloter des relais externes (pour gérer directement du 220V ou des rampes de Leds 12V servant à l'éclairage du Tdb par exemple), voire piloter des moteurs pas à pas ou un petit servo moteur de modélisme (pour des indicateurs de volets par exemple),via le mode PWM (que je ne maîtrise pas pour l'instant).

Quelques conseils pour finir:
La broche N°13 pilote une Led qui est déjà soudée sur la carte Arduino , il est donc déconseillé de la configurer comme une entrée. Eviter aussi de mélanger les broches en entrée et en sortie, une erreur de branchement et vous risquez de griller le contrôleur! Privilégiez des "blocs" de broches (par exemple de 0 à 20 pour les sorties (annonciateurs), le reste des broches de 21 à 69 pour les entrées), ce sera plus efficace à programmer avec les deux boucles que nous venons de voir dans votre script "customisé", avec une boucle pour les entrées, une pour les sorties.

Bref, en paramétrant soigneusement la section Setup() on peut attribuer le comportement que l'on veut à chacune des broches de la carte.

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

Link2Fs démystifié: la structure du script ARDUINO (partie 2

Messagede JacquesZ » Mer 25 Mar 2015 19:11

LINK2FS: LA STRUCTURE DU SCRIPT ARDUINO
Nous continuons notre plongée dans les scripts Arduino livrés avec Link2FSX pour mieux les comprendre et les personnaliser.

Au menu d'aujourd'hui: LA SECTION LOOP()
Nous l'avons dit, tout script Arduino dispose obligatoirement au minimum d'une section setup() déjà étudiée dans la partie 1 de ce Tuto et d'une section loop() que nous allons examiner maintenant.

La section loop() exécute toutes les instructions écrites entre les deux accolades { } en boucle de manière répétée jusqu'à un appui sur le bouton "Reset" de la carte ou l'interruption de l'alimentation de celle-ci.
La section loop() ne démarre qu'une fois la section setup() exécutée.

La structure de la section loop() est toujours la même dans les scripts exemple fournis avec Link2fs.
Pour le tuto on va prendre le fichier qui a la section la plus complète (Dans le répertoire Demos INO le fichier Multi_Keys.ino), section qui est quand même relativement courte en terme de code...

L'avantage d'une boucle "courte", c'est qu'elle est exécutée très rapidement, et on va la garder la + courte possible en "externalisant" les routines consommatrices de temps. Ces dernières ne seront exécutées que si nécessaire.

Juste avant d'examiner en détail la section loop(), une précision importante:
Les exemples de scripts fournis sont destinés à fonctionner avec le module Link2fs chargé sous Windows.
Pour rappel, ce module d'interface (un simple EXE) doit être lancé en même temps que FS. La liaison avec la carte Arduino se fait par le port USB (qui émule un port série), et les échanges de données entre l'Arduino et Link2Fs Multi se font par simple échange de caractères à 115200 bauds.
Une fois que l'on a compris cela, le code suivant devient plus simple à comprendre (mes commentaires sont après le signe "//"):

Code: Tout sélectionner
void loop() {
// Section sous routines: on insère ici les appels vers les sous routines de traitement
// des entrées, des encodeurs, des afficheurs,etc...) (cela fera l'objet d'un autre partie du tuto.
          {INPUTS();} //Sous routine de traitement des broches configurées en entrées (NOTE 1)
          {OTHER();}// Sous routine qui traite autre chose(NOTE 2)
/// Fin de la section sous routines

NOTE 1:
Ne pas oublier le point virgule et les accolades pour les appels aux sous routines!

NOTE 2:
L'Arduino nécessite des précautions de programmation pour pas "engorger" le processeur de la carte avec des trucs dont il n'a rien à faire. Ceci est vrai par exemple dans le cadre d'utilisation d'encodeurs lorsqu'on veut les lire rapidement sans rater trop de "clics", ou d'une Led qui doit clignoter longtemps et régulièrement (un voyant "Master Warning" par exemple). Donc évitez d'encombrer la section loop() avec du code additionnel, au besoin faites un appel à une sous-routine.

On passe maintenant à la suite de la section loop()
Code: Tout sélectionner
// lecture du port série
  if (Serial.available()) { // Si le port série a fini de travailler
             CodeIn = getChar(); // on lit le premier caractère qui est dans le buffer de texte
// et on le stocke dans la variable  "CodeIn" qui a été déclarée un peu plus haut dans le code


Dans cette partie de code, on interroge le port série pour savoir si FS2Link multi a envoyé un ou plusieurs "caractères code" suite à un évènement SIMCONNECT dans Fsim. A noter qu'une fois le caractère lu dans le buffer série, il est "perdu", et automatiquement remplacé par le caractère suivant.

Le ou les "caractères code" envoyés vont dépendre du paramétrage de Fs2Link dans les deux onglets "SimConnect extraction":
Image
Si la case correspondant à l'évènement SimConnect choisi est cochée, Link2FSMulti va surveiller automatiquement l'évènement en question (FS étant en fonctionnement bien sûr rigolus ) et envoyer sur le port série un ou plusieurs caractères correspondant au code attendu dès que ce paramètre est modifié par FS.

Par exemple:
Si on manoeuvre la manette de train sur FS via une commande clavier, un clic souris OU un inter connecté à l'Arduino (NOTE 1), et qu'on a au préalable coché la case "Gear nose" dans l'onglet "FsConnect Extractions(1)" dans la colonne "Indications", link2Fs va envoyer la séquence de caractères suivants sur le port série: <A100 (NOTE 2)

Il ne reste plus qu'à interpréter le 1er "caractère code" reçu dans l'Arduino et à quitter temporairement la boucle principale loop() en exécutant la sous routine appropriée. Une fois la sous routine exécutée, le programme reprend automatiquement à l'instruction suivante dans la section loop().

NOTE 1:
Dans un prochain tuto on verra comment "causer" à Fsim via une information en entrée reçu par l'Arduino.

NOTE 2:
Les "caractères code" ont été attribué par Jim Page, on ne peut pas les changer. Le "caractère code" pour chaque événement SIMCONNECT est indiqué dans link2FS Multi au niveau des deux onglets précités, immédiatement à droite de la case à cocher correspondante (par ex. "<A" pour l'indication "train avant", "?B" pour l'indication "Fire engine 1")

Vous êtes toujours là? Bon on continue:
Code: Tout sélectionner
// traitement du 1er caractère reçu dans le port série
   if (CodeIn == '=') {EQUALS();} // Le caractère reçu est  "=" (NAV/COM radios et Autopilote)
// Si oui, on traite la suite dans la section {EQUALS} et on revient
    if (CodeIn == '<') {LESSTHAN();}// Le caractère reçu est  "<" (Indications diverses)
//Si oui on traite la suite dans la section {LESSTHAN} et on revient
    if (CodeIn == '?') {QUESTION();}// le caractère reçu est "?" (Variables Système)
//Si oui on traite la suite dans la section {QUESTION} et on revient
   if (CodeIn == '/') {SLASH();}// le caractère reçu est  "/" (Annunciateurs)
//Si oui on traite la suite dans la section {SLASH} et on revient
 }
} // end of void loop


Et voilà. On peut maintenant traiter les évènements envoyés par FS via SIMCONNECT--> Link2FS multi--> Arduino et par exemple allumer une led verte pour dire que la roulette de train est sortie, mais on verra cela dans un prochain épisode....

To be continued...

Jacques
Dernière édition par JacquesZ le Ven 22 Jan 2016 23:05, é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 A320 hérétique » Mer 25 Mar 2015 20:33

Bonjour Jacques,

merçi pour cette initiation, je constate que FS2Link a bien évolué, et en effet plus de pb pour aller du switch à FS et de FS à la led sous le contrôle de l'Arduino.

Je voudrais cependant attirer l'attention sur un point important, à ceux qui auraient l'intention d'en faire un substitut à SIOC :
Tu soulignes à plusieurs reprises qu'il ne faut pas surcharger la boucle "loop" afin de ne pas étouffer l'Arduino, et donc reporter le code quand c'est possible dans des sous-programmes externes ; mais cela ne change rien !!! que le code soit littéralement dans la boucle ou en dehors, il sera exécuté ... de plus, Arduino exécute un code compilé, donc vraiment rien à attendre du déport dans des sous-programmes au plan des perf ; en revanche, code plus lisible, plus maintenable, plus concis ...
La seule façon de ne pas étouffer l'Arduino, c'est de ne pas trop lui en demander ! c'est là où SIOC prend l'avantage, puisqu'il s'agit d'un langage évènementiel : pas d'événement, c'est à dire pas de changement d'état, et pas de charge.
En revanche, l'Arduino offre une belle souplesse, puisqu'il amène beaucoup plus de facilités de programmation que SIOC, qui d'un point de vue théorique ne peut prétendre être un langage de programmation.

Pour ma part, je pense l'utiliser dans mon simu, pas pour remplacer SIOC, mais plutôt comme un super PIC.

En attendant, vivement la suite de ton tuto !

Cordialement, Michel
http://www.myA320sim.com
Simu mixte P3D/FS2020, serveur P3Dv4/A320 FMGS (7700k et GTX 1070 sous W10 64), client P3Dv4/FS2020 (i9-12900K et RTX 3080 Ti sous W10 64), 3 vdp Optoma GT1080E, client A320 FMGS (2600k sous W10 64).
Avatar de l’utilisateur
A320 hérétique
 
Messages: 3355
Inscription: 2/09/12
Localisation: Pornic

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

Messagede JacquesZ » Mer 25 Mar 2015 21:21

Michel

On est bien d'accord, SIOC pour les cartes OC est supérieur dans ce domaine de part son côté évenementiel: il ne fonctionne que lorsqu'on s'en sert!

Pour l'Arduino, on a pour l'instant intérêt à ce que la boucle principale soit la plus courte possible, pour éviter des erreurs de timing avec les encodeurs (vécu) qui ne sont pas interrogés assez fréquemment. Avec une boucle contenant principalement des appels à des sous routines via des tests on évalue la nécessité d'aller dans la sous routine concernée ou pas.

Je pense également que link2Fs dans sa version actuelle peut certainement être améliorée dans sa partie programme au niveau du Arduino, d'où ma démarche (je défriche en même temps...).

J'ai l'impression qu'en utilisant cette bibliothèque de gestion des évènements trouvée ici https://code.google.com/p/ebl-arduino/wiki/LedControl, on devrait pouvoir résoudre une partie du pbm.
Je vais creuser ça quand j'aurai un moment.

Cordialement
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 A320 hérétique » Jeu 26 Mar 2015 02:20

Jacques,
C'est toute la bibliotheque Arduino-ebl qu'il faut considérer ! Apparement tout ce qu'il faut pour travailler en evenementiel, super trouvaille bravoaffiche
Michel
http://www.myA320sim.com
Simu mixte P3D/FS2020, serveur P3Dv4/A320 FMGS (7700k et GTX 1070 sous W10 64), client P3Dv4/FS2020 (i9-12900K et RTX 3080 Ti sous W10 64), 3 vdp Optoma GT1080E, client A320 FMGS (2600k sous W10 64).
Avatar de l’utilisateur
A320 hérétique
 
Messages: 3355
Inscription: 2/09/12
Localisation: Pornic

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

Messagede PARALAILE » Jeu 26 Mar 2015 09:45

Merci JacquesZ, pour ce tuto.
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
Avatar de l’utilisateur
PARALAILE
 
Messages: 111
Inscription: 11/11/12

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

Messagede dreambox » Jeu 26 Mar 2015 12:14

JacquesZ a écrit:
J'ai l'impression qu'en utilisant cette bibliothèque de gestion des évènements trouvée ici https://code.google.com/p/ebl-arduino/wiki/LedControl, on devrait pouvoir résoudre une partie du pbm.
Je vais creuser ça quand j'aurai un moment.

Jacques


Bonjour Jacques

Belle découverte cette bibliothèque applaublanc , j'adopte chouettedoights

DREAMBOX
Avatar de l’utilisateur
dreambox
 
Messages: 303
Inscription: 23/11/13
Localisation: F62950 Noyelles-Godault

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

Messagede FiX » Jeu 26 Mar 2015 13:24

Très bonne touvaille!
Par contre je ne vois pas où l'on télécharge cette bibilio? gratgrat
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 dreambox » Jeu 26 Mar 2015 13:55

FiX a écrit:Très bonne touvaille!
Par contre je ne vois pas où l'on télécharge cette bibilio? gratgrat


C'est là https://code.google.com/p/ebl-arduino/downloads/list

DREAMBOX
Avatar de l’utilisateur
dreambox
 
Messages: 303
Inscription: 23/11/13
Localisation: F62950 Noyelles-Godault

Suivante

Retourner vers Interface & logiciel ARDUINO





Qui est en ligne

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