Compas magnétique

HB-EBC

PILOTE DE LIGNE
Messages
2 887
Réactions
1 196
Points
616
Bonjour à tous,

Aujourd'hui nouveau projet : la réalisation d'un compas magnétique à base d'un écran OLED pour environ 20€.

Le matériel nécessaire :

20200520_172354.jpg
20200520_175309.jpg


Le fonctionnement :
L'ESP8266 intègre une image de 720 pixel (360°*2) par 64 pixels, le nord correspondant au pixel 0 horizontal de l'image.
On récupère le cap magnétique via le serveur IOCP de SIOC et FSUIPC (offset 2BOO ou 0580 - 02A0) puis on le multiplie par 2 pour le faire correspondre au pixel de l'image et en fonction de ce pixel on prend pour l'image les 64 pixels précédents et les 63 pixels suivants pour remplir les 128 pixels de l'écran.

Premier essai en simulant l'information du cap :


Prochain post le programme.
 
Whaou :)
Le 2nd article dans la description c'est pour le faire fonctionner en Wi-Fi donc pas de câblage nécessaire hormis l'alim° ? Ou je n'ai pas compris :eek:
Le soft que tu veux publier va gérer l'affichage du compas donc des "barres" et du cap où bien c'est une fonction embarquée de l'afficheur ?
 
Les seuls câblages seront l'alimentation et la liaison (4fils) entre l'ESP8266 et l'afficheur.

L'afficheur n'a aucune fonction. Tout l'affichage (cap, Barres, ...) c'est l'ESP8266 qui le gère. Dans la mémoire de l'esprit j'ai mis une image de l'ensemble du compas sur 720pixels de large ce qui représente 2 pixels par degré. L'esp en fonction du cap qu'il reçois de Sioc par liaison wifi va afficher sur l'écran les pixels du cap au milieu de l'ecran puis les 63pixels de l'image qui précèdent et la 63 qui succedent ce qui donnera bien un affichage de 128pixels de large correspondant au nombre de pixels de l'écran en largeur
Pour que cela soit plus facile à comprendre je commenterai le code en détail.
Je pensais vous fournir le code cette semaine mais pour raison familiale, ce projet va hélas prendre beaucoup de retard.
 
Ca faisait un moment que je n'avais pas posté sur ce sujet, car je n'avais pas avancé dessus depuis le dernier post.
Mais ça y est, je m'y suis remis et il est enfin fonctionnel.

Petites vidéos de situation dans le simu :




Le schéma de câblage (hyper compliqué) :

Compas.jpg

Les codes sources :
c'est ici

Dans le fichier .ino il faut que vous renseigniez les lignes suivantes :

const char* ssid = "Votre_SSID";
const char* password = "Le_Mot_De_Passe_De_Votre_SSID";


// config static IP
IPAddress ip(192, 168, XXX, XXX); // Remplacer les XXX pour faire correspondre à l'adresse IP que vous voulez donner au compas
IPAddress gateway(192, 168, XXX, XXX); // Remplacer les XXX pour faire correspondre à l'adresse IP de la passerelle de votre réseau (généralement l'adresse IP de votre Box internet).
IPAddress subnet(255, 255, 255, 0); // le sous réseau (généralement pas besoin d'y toucher)
IPAddress serveriocp(192, 168, XXX, XXX); // Remplacer les XXX pour faire correspondre à l'adresse IP du PC sur lequel est exécuté SIOC


Dans votre script SIOC il faut ajouter la ligne :
Var 0200, name HDGFS, Link FSUIPC_IN, Offset $0580, Length 4

Si vous voulez que la variable envoyé par SIOC soit différente de 200 dans ce cas remplacer dans le fichier .ino à la ligne 54 le 200 par celui du numéro de la variable que vous souhaitez, mais attention cette variable doit impérativement avoir un numéro inferieur à 1500.

int VariablesIn[] = {200};
 
Nouvelle version 1.1.0 disponible.

Fonction à ajouter à la librairie Adafruit_GFX :
  • Dans le fichier Adafruit_GFX.cpp remplacez :
C++:
/**************************************************************************/
/*!
   @brief      Draw a PROGMEM-resident 1-bit image at the specified (x,y)
   position, using the specified foreground color (unset bits are transparent).
    @param    x   Top left corner x coordinate
    @param    y   Top left corner y coordinate
    @param    bitmap  byte array with monochrome bitmap
    @param    w   Width of bitmap in pixels
    @param    h   Height of bitmap in pixels
    @param    color 16-bit 5-6-5 Color to draw with
*/
/**************************************************************************/
void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
                              int16_t w, int16_t h, uint16_t color) {

  int16_t byteWidth = (w + 7) / 8; // Bitmap scanline pad = whole byte
  uint8_t byte = 0;

  startWrite();
  for (int16_t j = 0; j < h; j++, y++) {
    for (int16_t i = 0; i < w; i++) {
      if (i & 7)
        byte <<= 1;
      else
        byte = pgm_read_byte(&bitmap[j * byteWidth + i / 8]);
      if (byte & 0x80)
        writePixel(x + i, y, color);
    }
  }
  endWrite();
}

Par :
C++:
/**************************************************************************/
/*!
   @brief      Draw a PROGMEM-resident 1-bit image at the specified (x,y)
   position, using the specified foreground color (unset bits are transparent).
    @param    x   Top left corner x coordinate
    @param    y   Top left corner y coordinate
    @param    bitmap  byte array with monochrome bitmap
    @param    w   Width of bitmap in pixels
    @param    h   Height of bitmap in pixels
    @param    color 16-bit 5-6-5 Color to draw with
*/
/**************************************************************************/
void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
                              int16_t w, int16_t h, uint16_t color) {

  int16_t byteWidth = (w + 7) / 8; // Bitmap scanline pad = whole byte
  uint8_t byte = 0;

  startWrite();
  for (int16_t j = 0; j < h; j++, y++) {
    for (int16_t i = 0; i < w; i++) {
      if (i & 7)
        byte <<= 1;
      else
        byte = pgm_read_byte(&bitmap[j * byteWidth + i / 8]);
      if (byte & 0x80)
        writePixel(x + i, y, color);
    }
  }
  endWrite();
}

/**************************************************************************/
/*!
   @brief      Draw a PROGMEM-resident 1-bit image at the specified (x,y)
   position, using the specified foreground color (unset bits are transparent).
    @param    x   Top left corner x coordinate
    @param    y   Top left corner y coordinate
    @param    bitmap  byte array with monochrome bitmap
    @param    w   Width of bitmap in pixels
    @param    h   Height of bitmap in pixels
    @param    color 16-bit 5-6-5 Color to draw with
*/
/**************************************************************************/
void Adafruit_GFX::drawBitmapRow(int16_t x, int16_t y, const uint8_t bitmap[],
                              int16_t w, int16_t h, uint16_t color) {

  int16_t byteHeight = (h + 7) / 8; // Bitmap scanline pad = whole byte
  uint8_t byte = 0;

  startWrite();
  for (int16_t j = 0; j < w; j++, x++) {
    for (int16_t i = 0; i < h; i++) {
      if (i & 7)
        byte <<= 1;
      else
        byte = pgm_read_byte(&bitmap[j * byteHeight + i / 8]);
      if (byte & 0x80)
        writePixel(x , y + i, color);
    }
  }
  endWrite();
}

  • Dans le fichier Adafruit_GFX.h remplacez
C++:
  void drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w,
                  int16_t h, uint16_t color);
  void drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w,
                  int16_t h, uint16_t color, uint16_t bg);

Par :
C++:
  void drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w,
                  int16_t h, uint16_t color);
  void drawBitmapRow(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w,
                  int16_t h, uint16_t color);
  void drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w,
                  int16_t h, uint16_t color, uint16_t bg);
 
  • Love
Les réactions: Avro
Hello,

je suis très intéressé par ton approche.

Ta carte ESP8266 ESP-12 NodeMcu Lua WeMos D1 Mini a un module WIFI. Pourquoi ? T'en sers-tu ?
Tu penses réaliser d'autres jauges : rondes, en couleur ?
 
Le module wifi me permet de faire la connexion avec SIOC plus précisément le serveur IOCP de SIOC.
Cela me permet aussi de faire la mise à jour logiciel en OTA.

Le compas et toutes mes autres cartes fonctionnent ainsi :
Prosim (ou autre) dialogue avec le serveur IOCP de SIOC, ce serveur gère 9999 variables de 64 bits.
Mes cartes dialoguent aussi avec le serveur IOCP.
Voici un schéma simplifié des communications entre logiciels :
IOCP.jpg


Actuellement, je finalise une gestion d'ASP+météo et une IRS de B737 à base d'ESP32.
En exclu le PCB de l'IRS :
Capture2.JPG


Pour le moment pas d'autre jauges en cours de réalisation.

Mais on doit pouvoir faire de jauges en couleurs oui.
J'ai un écran de 1.8" et un de 2.4" en SPI ça devrait le faire.
Une idée de jauges peut être ?
 
  • Like
Les réactions: Avro
L'idéal serait d'avoir le fond de la jauges en .jpeg ou .bmp, après il n'y aurait qu'a simuler l'aiguille
 
oui, j'ai pensé la même chose (peut-être à base de SVG). Je vais acheter le même set que toi pour faire le compas. J'utilise LUA pour animer mes panels. On va voir si je peux adapter.
 
Dernière édition:
Jamais trop compris comment fonctionnait LUA et FSUIPC, faut que j'essaye.

Pour la jauges APU ça donnerait cela comme image de fond.
C'est petit car l'écran de 1.8" ne fait que 128pixels de haut.
APU jauge1.jpg
 
  • Love
Les réactions: Avro
Ah yes, trop bien. Merci.
Beau projet pour la trêve des confiseurs.
 
Arduino : 1.8.13 (Windows 10), Carte : "Arduino Uno"
compass:5:10: fatal error: ESP8266WiFi.h: No such file or directory
#include <ESP8266WiFi.h>

Hello,

pas trouvé cette bibliothèque.

Edit : après chargement de plusieurs librairies, l'erreur a disparu.
 
Dernière édition:
Et second problème, il ne trouve pas le pilote de la carte. J'ai essayé sur 2 PC.

1609337009729.png

EDIT : j'ai trouvé une solution

EDIT 2 : La solution s'est avérée mauvaise. J'ai chargé le driver spécifique du constructeur, la carte est maintenant reconnue.
 
Dernière édition:
tu peux faire tes cadrans avec Photoshop
pour exemple, celles du A320...

A320 - IAS 5cm.jpg
simu phil_04.jpg
simu phil_03.jpg
A320 BRk 5 3 cm.jpg

si tu ne maitrises pas Photoshop, il me sera plus facile de la faire que de t'expliquer
Philippe
 
Joli. Je sais faire, même si ce n'est clairement pas ma spécialité Merci pour la proposition, c'est sympa.
 
Dernière édition:
J'ai réussi à afficher mon nom sur l'écran OLED (y). J'ai essayé de compiler ton programme mais :

c:/users/emmanuel/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: sketch\compass.ino.cpp.o: in function `TaskRead()':
E:\Users\Emmanuel\Documents\Arduino\compass/compass.ino:265: undefined reference to `Adafruit_GFX::drawBitmapRow(short, short, unsigned char const*, short, short, unsigned short)'
c:/users/emmanuel/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: sketch\compass.ino.cpp.o: in function `pgm_read_byte_inlined':
E:\Users\Emmanuel\Documents\Arduino\compass/compass.ino:277: undefined reference to `Adafruit_GFX::drawBitmapRow(short, short, unsigned char const*, short, short, unsigned short)'
collect2.exe: error: ld returned 1 exit status
exit status 1
Erreur de compilation pour la carte Generic ESP8266 Module
 
Dernière édition:
Bonjour,

Alors pour ton problème Wifi c'est que tu n'as pas sélectionné la bonne carte, il faut prendre l'ESP8266.
Pour sa bibliothèque il faut ajouter le lien https://arduino.esp8266.com/stable/package_esp8266com_index.json dans Arduino/fichier/préférences/Url de gestionnaire des cartes supplémentaires.
preferences.JPG

Puis dans outils/type de carte/gestionnaire de carte taper ESP8266 et choisir la bibliothèque ESP8266 community
carte.JPG


Ensuite si tu as pris la même carte que sur la photo du post 4 (Wemos D1 Mini) tu la choisis dans outils/type de carte/LOLIN(Wemos) D1 R2 & mini

Concernant la fonction drawBitmap après avoir télécharger la bibliothèque Adafruit GFX (dans Croquis/Inclure une bibliothèques/gestionnaire de bibliothèques taper adafruit GFX )
adafruit.JPG

Il faut modifier cette bibliothèque pour inclure une fonction que j'ai créée (drawBitmapRow) et donc non présente par défaut.
Voir le post 5

Tu trouveras les fichiers à modifier sur ton DD ici : C:\Users\emmanuel\Documents\Arduino\libraries\Adafruit_GFX_Library
 
  • Love
Les réactions: Avro
Merci pour le SAV, impec. Je n'avais pas le bon type de carte et pas la bonne version de adafruit GFX. ça marche avec SIOC sous P3D, c'est impec. Maintenant, il faut que j'essaye de le faire fonctionner avec mon xLUA.

Dis-moi, le wifi, c'est pour éviter de la laisser brancher en USB ?
 
J'ai mis à jour le fichier .zip avec les fichiers adafruit_GFX déjà modifiés, nous n'avez plus qu'à remplacer ceux existants sur votre ordi à cet emplacement : C:\Users\Nom_De_Votre Session\Documents\Arduino\libraries\Adafruit_GFX_Library
 
J'ai finalement réinstallé une version à jour de SIOC, la version 5 boguait trop. Le compas fonctionne parfaitement sur X-Plane avec XPUIPC. Je vais m'attaquer à l'écran couleur :)
 
J'ai fait un test avec un écran couleur SPI de 1.8" mais le résultat n'est pas probant trop de scintillements de l'image. Je vais tenter une autre approche et en cadencant le processeur plus rapidement
 
Dernière édition:
  • Like
Les réactions: Avro
Tu conseilles quelle carte de développement WiFi pour la gestion d'un écran couleur ?
 
Si ton écran est en SPI (comme cela a l'air d'être le cas) ou I2C, alors utilise les plus connues et utilisées celles à bases d'ESP32 et ESP8266 (un peu plus vieilles mais qui fait le boulot).
En plus elles ont une grande communauté d'utilisateurs, sont compatibles avec plusieurs IDE (Arduino, plateformIO, ...)
 
Retour
Haut