Sim Open Interface ! Qu'est ce que c'est

Sim Open Interface (SimOpInt) vise à faciliter la création d'un véritable environnement de cockpit pouvant communiquer avec un simulateur de vol. Sim Open Interface se compose de 2 parties distinctes. Matériel et logiciel.

  • L'interface matériel est construite autour d’un ordinateur Raspberry Pi Nano.

  • L'interface logiciel est écrit en Python 3.

Une envie, une idée

J'ai commencé à m'amuser avec le simulateur open source Flightgear. Les prémices de ce qu'allait devenir Sim Open Interface sont encore disponible dans le wiki Flightgear, j'avais appelé mon projet FG Interface.

Au début je souhaitais savoir s'il était possible de communiquer avec la simulation. Rapidement, avec un simple client telnet et le serveur intégré au simulateur, il est devenu facile d'écrire mes premiers scripts en Python. Le langage Python a été choisi car la classe telnet était disponible dans les sources Flightgear et que c'est un language que je maitrisais déjà. Les premier scripts écrits m'ont permis d'automatiser certaines actions, mais je n'étais encore pas capable à ce moment-là d'utiliser des interrupteurs ou autres pour agir sur le simulateur.

Nous sommes en 2014, et cette année le vieux bonhomme rouge et blanc m'apporte un truc merveilleux, une nouvelle génération de nano ordinateur capable d'embarquer une version complète de Linux, cpu mono core, le RPi était un petit bonhomme, 512 Mo de RAM et une carte reseau full duplex TCP/IP RJ45 100 Mb/s.

Raspberry PI Model A

Une première version !

Peu de temps après, le mariage fut célébré. C'était facile à installer, tous les pilotes matériels existaient déjà et la plupart du temps une bibliothèque de bas niveau aussi. Rapidement les possibilités offertes par la framboise ont largement dépassé mes attentes. 

Les premiers tests ont montré à quel point il était facile de connecter afficheurs, capteurs, interrupteurs et bien d'autre chose au Raspberry Pi. Mais pour rendre l'utilisation plus simple il a été nécessaire d'écrire quelques librairies pour encapsuler les fonctions des librairies de bas niveau. Des tests avec différents type d'actionneurs ont été mis en œuvre pour s'assurer que l'on pourrait piloter tous les éléments que l'on peut retrouver dans un cockpit. 

Ci dessous les premiers test avec des interrupteurs, des boutons poussoir et une encodeur rotatif.


Finalement, un an plus tard, après avoir fait quelques courses et passé du temps entre fer à souder, électronique et apprentissage du langage python, j'ai pu construire la première interface hardware, un véritable prototype doté de 256 sorties et 128 entrées.

Entièrement conçus "maison", cette première version du hardware a été élaborée à partir de carte de AB Electroniques UK pour les cartes d'entrées et de carte Adafruit pour les cartes de sorties. Le tout installé dans un boitier type rack 1U


Image

Durant ce laps de temps, le Raspberry Generation 2 était arrivé :

  • CPU ARMv7 Cortex A7 (Quad Core) 900 Mhz

  • 1 Go de RAM

Image

Dans les années qui ont suivs, beaucoup de travail a été réalisé depuis les premiers test où je jouais avec l'arborescence des propriétés sur un simple client telnet.

Chaque élément du cockpit implémenté est représenté dans l'interface par un objet virtuel manipulable au sein de l'interface. Selon le type d'objet [interrupteur, indicateur, afficheur...] ceci donne accès à différentes méthodes permettant la gestion de l'objet.

Par exemple, dans un objet d'affichage vous aurez accès à des fonctions telles que :

  • WriteDisplay(value), une fonction qui affichera la valeur que vous envoyez sur l'objet d'affichage

  • WriteDigitDisplay(value, digit), une fonction qui permettra de gérer un chiffre d'affichage

Pour un commutateur, une fonction comme getSwitchState() renverra l'état du commutateur physique.

Raspberry PI, le cœur du système

Le Raspberry Pi est un petit ordinateur mono-carte développé au Royaume-Uni par la Raspberry Pi Foundation. https://en.wikipedia.org/wiki/Raspberry_Pi

Un ordinateur entièrement compatible Linux avec des capacités d'entrée/sortie. La version de première génération en 2013 était construite autour d'un processeur ARM V6 32 bits à 700 MHz et de 512 Mo de RAM (version B1+). J'ai pu créer de nombreux instruments et je n'ai jamais été bloqué par des ressources matérielles.

Aujourd'hui, la dernière génération (V5), avec un processeur ARM Cortex A76 quad core à 2.4 Ghz, avec 4 ports USB (dont 2 USB 3), jusqu'à 8 Go de RAM, un port RJ 45 Gigabit, 2 port Micro HDMI. De plus, le Raspberry Pi est pourvu d'un connecteur 40 broches, ouvrant au monde tous les bus d'entrée, de sortie et d'alimentation de l'ordinateur.

Disponible sur le connecteur GPIO, le Raspberry Pi dispose de deux bus I2C, sur lequel le hardware de l'interface est connecté.

Le Bus I2C

I²C (Inter-Integrated Circuit), prononcé "i deux c", est un bus informatique série multi-maître, multi-esclave, à commutation de paquets, à une extrémité, inventé par Philips Semiconductor (maintenant NXP Semiconductors).

Pourquoi ce bus ?

1°) Et bien, je n'ai pas commencé à coder l'interface avant d'avoir regardé quel matériel était disponible. Et le fait est que la plupart des pilotes matériels utilisent tous I²C. Ou plus simplement, tous les pilotes de périphériques nécessaires à la gestion d'un cockpit complet peuvent être trouvés avec un port I²C.

2°) Tous les périphériques matériels standards disposent de leur propre bibliothèque bas niveau, la plupart d'entre elles se trouvent par exemple sur Adafruit Industries.

Le bus I²C amène quand même quelques contraintes. La plus gênante réside dans la façon dont chaque interface matérielle est identifiée sur le bus (son adressage).

Python

Python est un langage de programmation de haut niveau largement utilisé pour la programmation à usage général, créé par Guido van Rossum et publié pour la première fois en 1991.

Langage interprété, Python a une philosophie de conception qui met l'accent sur la lisibilité du code, notamment en utilisant l'indentation des espaces blancs pour délimiter les blocs de code, plutôt que des accolades ou des mots-clés et une syntaxe qui permet aux programmeurs d'exprimer des concepts en moins de lignes de code que ce qui est possible dans des langages tels que C++ ou Java.

Le langage fournit des constructions destinées à permettre l’écriture de programmes clairs à petite et à grande échelle.

Le Langage Python

Pourquoi Python ?

1°) Eh bien, en regardant comment je pouvais communiquer avec la simulation, j'ai trouvé la classe python telnet dans les sources Flightgear.
2°) Python est le langage de programmation officiel sur Raspberry, et de nombreuses librairies de pilotes de périphériques sont disponibles dans ce langage.

 

Communication

Au début je jouais avec le client telnet et l'arborescence des propriétés via une connexion TCP/IP. Le Raspberry Pi dispose d'un port RJ 45. Il est apparus rapidement que le protocole telnet n'était pas assez rapide pour gérer une grande quantité de données.

En examinant plus en détail le code du simulateur, j'ai finalement trouvé comment mettre en place un système de communication approprié du côté du Flightgear basé sur un système de prototcole générique.

Ainsi, l'une des parties principales de l'interface FG est un système client/serveur TCP complet dédié à la communication avec le simulateur de vol. Cela signifie qu'il est possible d'avoir plusieurs interfaces connectées à la même instance du simulateur, donc si les E/S génériques sont limitées sur une interface, avec plus d'interfaces, vous aurez plus de capacités. Cela voulez aussi dire que quelque soit le simulateur, tant qu'il est capable de communication TCP/IP, il est potentiellement interfaçable.

Dans l'état actuel du projet, l'intercommunication entre les interfaces n'est pas disponible

Sim Open Interface

Courant 2020, la pandémie du Covid 2019 force la France a se confiner. Durant cette période j'ai moi même effectué une transition par un changement de simulateur. Je n'ai rien de particulier a reprocher à Flightgear, mais les développement du logiciel et des avions sont fait au bon grés de la communauté. Une des conséquence est que les fonctionnalité et les évolutions ne vont pas toujours toutes dans le même sens entrainant parfois des probleme de compatibilité avec les différents add-on. J'ai donc opéré une bascule vers un simulateur commerciale. Le nouveau simulateur devait avoir une API qui permettait d'interragir avec le simulateur et avoir des capacité réseau de communication. C'est naturellement que mon choix c'est porté sur X-Plane 12, version qui sortait avec un airbus A330 tous neuf.

Pour marquer le changement le projet a été renommé Sim Open Interface.