UN SIMULATEUR DE BEECHCRAFT B200

UN SIMULATEUR DE BEECHCRAFT B200

Réfection d'un bloc Collins CTL22 avec Arduino nano, écran Oled et script lua

J'avais depuis longtemps un vrai bloc com1 Collins CTL22 sur mes étagères mais je n'avais pas les connaissances pour l'interfacer au simulateur.

 

Ci dessous la photo du bloc de com Collins CTL 22

 

SDC10424.JPG

 

 

 

Et voilà la photo du bloc de com que j'avais sur le simu avec affichage par displays 7 segments Opencockpit, ce bloc fonctionnait bien mais présentait le désavantage de ne pouvoir afficher que les fréquences, hors il y a d'autres informations à afficher comme le canal de com, l'indicateur Tx et ACT

 

 

Et voici la photo du bloc Collins CTL 22 en place dans le simu, personnellement je trouve que çà a de la gueule et çà m'encourage à faire les autres

 

P1030949.JPG

 

Historique du projet

 

Parallèlement au  travail sur le simulateur, je m'intéresse aussi au monde Arduino et j'ai découvert récemment le monde des écrans Oled.

J'ai donc rassemblé toutes ces nouvelles connaissances pour ce projet d'interfaçage de cet instrument.

Il me restait à trouver un moyen de communiquer avec le simulateur car je n'ai pas les compétences pour écrire une dll d'interface Usb.

Pour ce faire j'ai donc développé un script Lua qui communique avec le sketch Arduino chargé dans la carte Nano et par port Usb.

 

Le petit cahier des charges du projet

 

- Partant du vrai bloc de com il me faut raccourcir l'instrument pour qu'il puisse être positionné devant un écran existant même si cet écran n'affiche rien du bloc com.

- Je veux passer de l'affichage par digits à l'affichage par un écran pour avoir d'autres indications et me rapprocher le plus possible de l'affichage original

- Je veux réutiliser les boutons et commutateurs de l'instrument et garder leurs fonctionnalités

- Et pour finir le faire communiquer avec P3D par un port Usb

 

 

La réalisation

 

Pour le point 1, pas de problème particulier, j'ai réussi un démontage propre et la seule difficulté à été de modifier le rétro éclairage  du petit panel gris car il était fait par 3 petites ampoules en 5 volts et je l'ai modifié avec 3 Leds en série 12 volts donc je suis passé par la case micro-chirurgie pour modifier les pistes du minuscule circuit imprimé logé dans la face avant et souder ces leds.

J'ai pu récupérer le commutateur original mais il a fallut que je mette un encodeur Elma 37 à la place de l'encodeur original qui était trop long pour loger dans l'instrument modifié.

 

Pour le point 2,  j'ai remplacé l'écran original ( dont je n'avais pas le plan de brochage ) par un écran Oled SSD1306 blanc de 1,3 pouce connecté en I2c sur l'Arduino Nano.

J'ai découvert les subtilités de ces petits écrans récemment et je les trouve très intéressants même s'il n'est pas évident de les programmer

 

En ce qui concerne le point 3 c'est là que les choses se sont corsées.

Je partais d'un programme sioc qui affichait correctement les fréquences active et standbye et les commutait par l'inter de droite sur le bloc.

Par ailleurs les appuis successifs  vers le bas de ce même interrupteur faisait défiler en boucle les fréquences mémorisées dans un fichier .txt comme sur le vrai.

 

1 ère étape

 

J'ai créé une maquette sur breadboard avec une arduino Nano et l'écran Oled pour m'occuper dans un premier temps de l'affichage par un sketch Arduino avec comme difficulté principale de pouvoir changer de police pour imiter les afficheurs 7 segments

 

ctl22.jpg

 

Le premier avantage de cet écran c'est la simplicité de câblage avec l'I2c, il y a seulement 5 fils au lieu des 17 fils pour l'affichage par displays Opencockpit.

Sur la photo ci dessus , je n'avais pas encore réussi à intégrer la police qui imite les afficheurs 7 segments.

Pour le point particulier d'intégration des polices, je vous rajouterai une section à la fin de cet article.

 

2 ème étape

 

J'ai développé un script Lua qui envoie sur le port Usb de l'Arduino ( le port 7 dans mon cas ) à la fois le numéro et la valeur de l'offset Fsuipc qui change.

C'est donc un event au sens Lua qui déclenche une écriture sur le port com.

Ce script lua fait donc 3 choses : il ouvre le port com à destination de l'arduino

                                                       il guette les changements des offsets Fsuipc par event

                                                       il lance des fonctions qui écrivent sur le port com la valeur qui a changée.

 

 

Ensuite j'ai modifié le sketch .ino pour qu'il récupère ( qu'il lise ...) le contenu du buffer de réception Arduino et qu'il le traite pour affichage à l'écran.

 

Voilà le synoptique de traitement d'une variable

 

synoptique ctl22.png

 

Si vous êtes abonné à mon blog et je n'en doute pas, vous pouvez télécharger les programmes .ino et .lua pour ce Collins CTL 22

Je suis sur plusieurs pistes pour améliorer leur vitesse d'éxécution bien qu'ils fonctionnent sans bug et notamment changer la vitesse du bus I2C mais il faut que j'adapte certaines choses dont les résistances Pullup sur le bus I2C et pour cela il me faut faire des mesures à l'oscilloscope et çà prend du temps

.

Je ne manquerai pas de vous faire part de mes avançées

 

 

Rajout de la fonctionnalité de contraste automatique

 

Vous avez peut être remarqué sur la photo du vrai bloc Collins qu'il y a une cellule photo électrique à gauche du bouton test.

Cette cellule permet de régler automatiquement la luminosité de l'écran selon la lumière ambiante.

Quand la lumière ambiante est forte dans le cockpit l'écran devient plus lumineux et vice versa.

Je me suis donc attelé à la tache pour rajouter cette fonctionnalité bien inutile dans mon cockpit mais j'adore relever ces petits défis techniques.

Comme vous l'avez sûrement lu plus haut, j'utilise des écrans Oled avec contrôleur SSD1306 en I2C pour l'affichage sur ces boitiers com, nav, adf et atc.

Cet afficheur est piloté par Arduino Nano et une bibliothèque Adafruit_SH1106.h qui a été un peu adaptée pour le SSD1306

 

Partie logicielle

 

La problématique c'est que cette bibliothèque ne contient pas la fonction ( méthode ) pour gérer le contraste de l'écran.

Dans le datasheet du SSD1306 il est indiqué que pour changer le contraste il faut d'abord envoyer une commande 0x81 pour passer le controleur en mode set pour le contraste puis envoyer la valeur de contraste entre 0 et 255.

Voici donc la méthode que j'ai rajouté dans Adafruit_SH1106.cpp

 


void Adafruit_SH1106::setContrast(char contrast) {
  SH1106_command(0x81);
  SH1106_command(contrast);
}

 

Après cela j'ai déclaré cette fonction dans le fichier Adafruit_SH1106.h par cette ligne

 

 void setContrast(char contrast); 

 

Dans le fichier .ino j'ai rajouté ceci :

 

#define CELLULE A0    // la ldr est sur la pin A0 de l'arduino nano

 

void lit_contrast()
{
  //  conversion de la mesure brute en plage de 0 à 255 pour être envoyée au controleur ssd1306, mais je ne veux pas dépasser 250
  //contraste = map(analogRead(CELLULE),250,860,0,250);  //  250 = mesure basse de la cellule 860 = mesure haute de la cellule 0 à 250 = plage de contraste
  display.setContrast(map(analogRead(CELLULE),250,860,0,250));  
}


Et pour finir j'ai rajouté cette fonction dans la loop

 

 

 Partie matérielle

 

Je voulais réutiliser la cellule présente sur le vrai bloc mais après mesure elle ne correspondait pas à ce que je voulais, donc je l'ai remplacé par une cellule photo standard de 5 mm.

Cette cellule se trouve donc sur la broche A0 de l'Arduino avec une résistance de 10 Ko qui fait un pont diviseur .

Voici le schéma de branchement:

 

 schema.png

 

Rien de bien compliqué à ce niveau, il faut juste se rappeler que plus la valeur de la résistance est élevée plus la sensibilité de la Ldr augmente, 10 Ko m'a semblé être un bon compromis.

 

 

Rajout de la fonctionnalité de mémorisation et de défilement des fréquences

 

Sur un vrai bloc de com Collins on peut mémoriser 5 fréquences en appuyant sur le bouton STO.

 

Jusqu'à présent j'utilisais un fichier texte contenant les 5 fréquences les plus utilisées et ce fichier était lu au démarrage du script Lua et mémorisé dans un tableau de variables.

Mais je me suis rendu compte qu'on pouvait utiliser l'EEPROM de la carte Arduino pour stocker ce genre de variables, ce qui va alléger le script lua et optimiser la programmation.

 

Je n'ai pas adopté la procédure du vrai bloc Collins car elle fait intervenir des timers précis pour la mémorisation.

Sur mon bloc pour mémoriser une fréquence, je fais défiler un canal de mémorisation par appui bas successif sur l'inter, le bon canal s'affiche, ensuite je tourne mon encodeur pour choisir la fréquence à mémoriser et ensuite j'appui sur le bouton STO

 

Pour faire défiler ces fréquences on fait un appui bas sur l'inter de droite situé à côté de l'afficheur, chaque fréquence est alors affichée avec le bon numéro de channel mem en bas de l'afficheur.

 

 

 

 

 



09/09/2019
21 Poster un commentaire

A découvrir aussi


Ces blogs de Loisirs créatifs pourraient vous intéresser

Inscrivez-vous au blog

Soyez prévenu par email des prochaines mises à jour

Rejoignez les 121 autres membres