dimanche 10 février 2019

Écran couleur KMR-1.8 SPI (ST7735) et Arduino

Après avoir récemment expérimenté le contrôle de deux petits écrans monochromes avec un Arduino Uno (Nokia 5110 et OLED SH1106), j'explore aujourd'hui un petit écran couleur TFT "KMR-1.8 SPI". Comme son nom l'indique, il s'agit d'un écran de 1,8" (définition 128*160) utilisant le protocole SPI.


Mon modèle est muni d'un pilote ST7735. Toutefois, d'autres écrans en apparence identiques utilisent plutôt le pilote S6D02A1 ou encore le ILI9163. Il existe une bibliothèque pour chacune de ces versions, et il faut parfois toutes les essayer lorsqu'on ignore le numéro du pilote se trouvant sur notre écran.

Au verso de l'écran, on trouve un lecteur de carte SD (que je n'ai pas utilisé pour l'instant). Le module comporte pas moins de 16 connecteurs (à souder soi-même, bien entendu), dont le marquage laisse parfois à désirer (il est bien difficile de deviner, sans documentation, quelles broches concernent le lecteur de carte SD plutôt que l'écran).


Connexions

Mon module comporte un régulateur de tension 65z5 (portant la désignation "U2" sur le circuit imprimé) qui permet d'alimenter le module avec une tension de 5 V (si vous préférez l'alimenter avec 3,3 V, il faut fermer le jumper "JP1"), mais les autres entrées ne bénéficient pas de cette protection et sont conçues pour fonctionner à un niveau logique de 3,3 V.

Ma première intention était d'utiliser un circuit intégré 4050 pour abaisser à 3,3 V les signaux logiques de l'Arduino Uno, mais pour une raison que j'ignore le résultat s'est révélé très instable: l'écran devenait soudainement totalement blanc, sans raison apparente, et le seul remède consistait à appuyer sur le bouton reset de l'Arduino pour redémarrer le programme. J'ai cru que le courant requis par l'écran était possiblement trop élevé pour le régulateur 3,3 V de l'Arduino, mais les résultats n'étaient pas meilleurs en utilisant une source de tension externe de 3,3 V.

Je vous présente donc les connexions conseillées par Bodmer, qui est également l'auteur de la bibliothèque que je vous recommande un peu plus loin dans ce même article: les signaux logiques sont abaissés au moyen d'un simple diviseur de tension constituée d'une résistance de 2,2 kΩ (située entre la masse GND et l'entrée de l'écran, et d'une résistance de 1,2 kΩ (située entre la même entrée de l'écran et la sortie de l'Arduino). 10 résistances sont donc requises, puisqu'il faut protéger de cette façon 5 entrées de l'écran.

En énumérant les broches dans le même ordre que sur le module TFT, ça donne ceci:
  • #1 GND du KMR-1.8: GND de l'Arduino
  • #2 VCC du KMR-1.8: 5V de l'Arduino
  • #3 NC du KMR-1.8: Pas branché
  • #4 NC du KMR-1.8: Pas branché
  • #5 NC du KMR-1.8: Pas branché
  • #6 RESET du KMR-1.8: sortie 7 de l'Arduino (via 2,2 kΩ) et GND (via 1,2 kΩ)
  • #7 AO du KMR-1.8: sortie 8  de l'Arduino (via 2,2 kΩ) et GND (via 1,2 kΩ)
  • #8 SDA du KMR-1.8: sortie 11 de l'Arduino (via 2,2 kΩ) et GND (via 1,2 kΩ)
  • #9 SCL du KMR-1.8: sortie 13 de l'Arduino (via 2,2 kΩ) et GND (via 1,2 kΩ)
  • #10 CS du KMR-1.8: sortie 9 de de l'Arduino (via 2,2 kΩ) et GND (via 1,2 kΩ)
  • #11 SCK du KMR-1.8: pas branché (lecteur de carte SD)
  • #12 MISO du KMR-1.8: pas branché (lecteur de carte SD)
  • #13 MOSI du KMR-1.8: pas branché (lecteur de carte SD)
  • #14 SD_CS du KMR-1.8: pas branché (lecteur de carte SD)
  • #15 LED+ du KMR-1.8: 5 V (via une résistance de  270 Ω)
  • #16 LED- du KMR-1.8: GND
Pour le rétroéclairage, j'ai utilisé une résistance de 270 Ω soit bien plus que la valeur minimale de 22 Ω conseillée par Bodmer. Je n'ai pas constaté de différence notable à l'écran.

Je rappelle que je n'ai pas utilisé le lecteur de carte SD pour l'instant, ce qui explique pourquoi les broches 11, 12, 13 et 14 n'ont pas été connectées.


Il est sans doute pertinent de mentionner que si ce montage fonctionne de façon irréprochable avec une de mes cartes Arduino Uno, il ne fonctionne pas du tout avec un autre Uno en apparence identique: l'écran demeure obstinément blanc (j'admets qu'il s'agit de deux clones chinois, mais quand même...).

Installation de la bibliothèque

Comme je le mentionnais un peu plus haut, j'ai utilisé la bibliothèque TFT_ST7735 mise au point par Bodmer. Il est possible, cependant, que votre module nécessite plutôt la bibliothèque TFT_S6D02A1 ou encore la bibliothèque TFT_ILI9163. Tout va bien si le vendeur de votre écran a indiqué dans sa description le bon modèle de pilote, sinon il faudra les essayer une par une jusqu'à ce que ça fonctionne!

La bibliothèque est accompagnée de plus d'une dizaine d'exemples qui permettent de vérifier rapidement le bon fonctionnement de l'écran.

Réglage de paramètres dans la bibliothèque

Lorsque j'ai testé mon écran, j'ai constaté que l'image apparaissant à l'écran était décalée de quelques pixels: on pouvait voir une mince bande de pixels multicolores dans le haut de l'écran, ainsi que sur le côté gauche.

Image décalée
Pas de panique: on peut rapidement régler le problème en modifiant les paramètres par défaut de la bibliothèque.

Après ajustement des paramètres de la bibliothèque
Il s'agit d'ouvrir le fichier "User_Setup.h" situé dans le répertoire de la bibliothèque TFT_ST7735.  Cinq options sont proposées pour la définition de la variable "TAB_COLOUR" (qui représente apparemment la couleur de l'onglet de la pellicule protectrice qui recouvrait l'écran lors de l'achat).  Par défaut, TAB_COLOUR est réglée à INITR_GREENTAB2.


Puisque j'avais jeté la pellicule protectrice sans porter attention à la couleur de son onglet, j'ai essayé toutes les options l'une après l'autre. La plupart d'entre elles empiraient la situation (l'écran n'affichait pas les bonnes couleurs!) mais l'option "INITR_BLACKTAB" convenait parfaitement à mon écran.


Ce même fichier (User_Setup.h) vous permet également de modifier le numéro des broches de l'Arduino que vous désirez utiliser, ou de ne pas charger certaines tailles de police afin d'économiser de la mémoire.

Un exemple de sketch

Pour finir, je vous présente un sketch qui affiche à l'écran la valeur numérique de tension mesurée à l'entrée A0 de l'Arduino, avec une jauge linéaire (vous pouvez tester ce sketch en branchant un potentiomètre à l'entrée A0). La bibliothèque de Bodmer propose une méthode "drawFloat" spécialement conçue pour l'affichage d'une valeur décimale, ce qui a beaucoup simplifié les choses, puisqu'elle s'occupe même de l'arrondissement à la précision requise:

drawFloat(valeur_numerique, nombre_de_décimales, position_x, position_y, taille_de_police);

Par défaut, l'écran est prévu pour une utilisation en mode portrait. Puisque je désirais l'utiliser en mode paysage, il a été nécessaire d'inclure l'instruction "setRotation(1)" au démarrage.

Lorsque j'avais expérimenté des écrans monochromes (Nokia et OLED), je construisais d'abord l'image dans un buffer, puis je l'affichais à l'écran lorsqu'elle était prête. Je pouvais ensuite effacer le buffer pour reconstruire une nouvelle image à partir de zéro. Pour cet écran couleur, toutefois, on dessine directement à l'écran (je suppose que la taille du buffer serait trop grande). Pour éviter autant que possible des clignotements très désagréables, il faut essayer de ne mettre à jour que les zones de l'écran qui doivent être changées, plutôt que redessiner la totalité de l'image. J'obtiens donc de bien meilleurs résultats en réécrivant l'ancienne valeur numérique en noir (sur fond noir) pour l'effacer, plutôt qu'en la recouvrant d'un rectangle noir.


Yves Pelletier   (TwitterFacebook)

Aucun commentaire:

Enregistrer un commentaire

Related Posts Plugin for WordPress, Blogger...