logo du siteLe Site du Gnu-Bricoleur

/!\ Un blog plébiscité par Chuck Norris O_o

Ecran LCD OpenSmart et couleurs 16 bits 565

Rédigé par SuperGNU Aucun commentaire

Adafruit propose de beaux shields écran pour Arduino mais il sont un peu chers. OpenSmart vend des clones compatibles (dans une certaine mesure) avec les bibliothèques d'Adafruit. Néanmoins, sur mon écran, les couleurs ne s'affichaient pas correctement et de plus, je trouvais le choix de couleur proposé dans les exemples Adafruit un peu maigre. Voici comment corriger le problème des couleurs inversées sur certains écrans LCD et étoffer la gamme de couleurs disponibles.

Situation initiale

Les couleurs par défaut proposées par Adafruit sont les suivantes :

// Assign human-readable names to some common 16-bit color values:
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

Le choix est un peu faible et à première vue, la définition des couleurs n'est pas standard ce qui ne rend pas facile la créations de couleurs personnalisées. Il s'agit en fait de couleurs définies sur 16bits (4 caractères hexa), mais ce n'est pas RGBalpha car le dernier bit varie de O à F. C'est en fait un codage appelé 565 car les 5 premiers bits sont assignés à la définition de la teinte de bleu, les 6 bits suivants sont assignés à la teinte de vert et les 5 derniers bits sont assignées à la teinte de bleu. Bien que moins confortable pour l'informaticien, ce codage des couleurs permet de générer une palette des couleurs plus large et agréable pour l'utilisateur. En effet, l’œil humain est plus sensible aux nuances de vert et cette méthode permet de maximiser le nombre de nuances de vert exprimables. Cette convention n'est pas nouvelle et ressemble un peu aux modes VESA des cartes graphiques des premiers ordinateurs.

De plus, sur mon écran, les quelques couleurs proposées par Adafruit sont inversées. Le blanc appairait noir, le rouge -> cyan, le vert -> majenta et le bleu -> jaune. Si ce problème est très facile à résoudre (r = 255 - r; g = 255 - g; b = 255 - b) si les couleurs sont codées en RGB, c'est autrement difficile en 16bit 565 ! Ce problème est peut-être lié à la puce qui contrôle l'écran , dans mon cas un ILI9327

Lien ou j'ai trouvé une partie des explications : McHobby Adafruit GFX

Solution

Comme je souhaitais conserver la façon d’appeler les couleurs avec un nom user friendly, j'ai cherché sur internet une liste de couleurs avec les noms. J'en ai trouvée une sur Wikipédia : Couleurs du Web. Voir fin d'article. Cette liste contient 138 couleurs avec un nom associé. J'ai écrit un script python pour parser le markdown Wikipédia et récupérer le nom des couleurs ainsi que les composantes RGB. Ensuite, pour convertir les couleurs il suffit de faire une simple règle de proportionnalité. Les 3 canaux sont codées de 0 à 255. Pour les couleurs qui seront codées sur 5 bits, il faut donc les exprimer sur la plage 0 -> 32 (2^5 = 32). Pour les couleurs sur 6 bit, c'est sur la plage 0 -> 64 qu'il faut les exprimer. Il faut ensuite convertir en binaire, mettre bout à bout et convertir 4 bits par 4 bits en hexadécimal.

#r = 255 - int(r)
    #b = 255 - int(b)
    #g = 255 - int(g)

    #r = bin(r%32)[2:].zfill(5)
    #g = bin(g%64)[2:].zfill(6)
    #b = bin(b%32)[2:].zfill(5)

    r = int((r/255.0)*31)
    g = int((g/255.0)*63)
    b = int((b/255.0)*31)

    r = bin(r)[2:].zfill(5)
    g = bin(g)[2:].zfill(6)
    b = bin(b)[2:].zfill(5)

    binaire = r + g + b
    hexa = hex(int(binaire, 2))[2:].zfill(4)
    hexa = "0x" + hexa.upper()
    listehexa.append(hexa)

Voir le wiki pour le code complet : http://gnu-bricoleur.net/wiki/doku.php?id=couleur16bits565

Vous trouverez aussi sur le wiki les fichiers .h a télécharger pour avoir les définitions de couleurs.

Ou sur Github : https://github.com/Gnu-Bricoleur/Couleurs16bits565

Voici le tableau d'origine pour référence: href="data/medias/articles/Couleurs/wiki">Extrait du Wiki. href="data/medias/articles/Couleurs/couleurs.h">couleurs.h. href="data/medias/articles/Couleurs/couleurs_inverse.h">couleurs_inverse.h.

EDIT : En poursuivant mes recherches, j'ai trouvé qu'il existe une fonction pour régler simplement le problème d'inversion des couleurs, il suffit de faire : tft.invertDisplay(boolean);

Cet article reste néanmoins intéressant car il propose une méthode pour générer une liste de couleurs.

Classé dans : Projets Mots clés : aucun

Écrire un commentaire

Quelle est la troisième lettre du mot rebx ?

Fil RSS des commentaires de cet article