samedi 26 janvier 2019

Écran OLED SH1106 I2C et Arduino

Je me suis récemment procuré un petit écran OLED de 128 X 64 pixels et. bien entendu, je me suis empressé de le faire fonctionner  en le branchant à un Arduino.



OLED vs LCD

OLED est l'acronyme de organic light-emitting diode (diode électroluminescente organique, donc).  Contrairement aux cristaux liquides des écrans LCD, les OLED produisent de la lumière et les écrans basés sur cette technologie ne nécessitent donc pas de rétroéclairage, même lorsque vous les utilisez dans l'obscurité. Les images sont plus contrastées et le temps de réponse est plus court. Par contre, on dit que la durée de vie des écrans OLED est plus courte que celle des LCDs (l'image se dégrade avec le temps).

L'écran

Mon écran a une taille de 1,3 pouce (environ 3,5 cm X 1,8 cm) et une résolution de 128 X 64 pixels. Il est basé sur le contrôleur SH1106 et utilise le protocole I2C. L'image produite est blanche sur fond noir.



Branchements

Puisqu'il s'agit d'I2C, les connexions sont assez prévisibles: sans surprise, l'écran comporte deux broches pour l'alimentation (GND et VCC), et deux broches pour le transfert d'information (SCL et SDA).

Le vendeur a spécifié dans sa description que l'écran peut aussi bien supporter une tension de 5 V qu'une tension de 3,3 V, mais j'ignore à quel point c'est vrai. Le SH1106 n'est pas conçu pour des tension de 5 V, mais le fabricant de l'écran a peut-être ajouté un régulateur de tension quelque part. Pour plus de prudence, j'ai utilisé un module abaisseur de tension bidirectionnel spécifiquement conçu pour la communication I2C dans le genre de celui qui est vendu par Adafruit.  Il s'agit peut-être d'une précaution inutile, mais ça ne peut pas faire de mal.

Tout ça pour dire que que les 4 broches de l'écran OLED sont branchés à l'Arduino Uno de la façon suivante:
  • Broche GND de l'écran à une broche GND de l'Arduino
  • Broche VCC de l'écran à la sortie 3.3 V de l'Arduino
  • Broche SCL de l'écran à la broche A5 de l'Arduino (adaptateur de niveau logique entre les deux)
  • Broche SDA de l'écran à la broche A4 de l'Arduino (adaptateur de niveau logique entre les deux)
(Si vous utilisez un modèle d'Arduino autre que l'Uno,  les broches dédiées à la communication I2C ne sont pas nécessairement A4 et A5.)



Recherche et installation d'une bibliothèque

La bibliothèque U8glib a très bonne réputation parmi les utilisateurs d'écrans OLED.  Cependant, j'ai préféré continuer d'utiliser la bibliothèque GFX d'Adafruit, pour que mes programmes déjà réalisés avec un écran LCD de style Nokia soient plus facilement transposables à mon nouvel écran.  Petit inconvénient: puisqu'Adafruit ne fabrique aucun produit contenant le contrôleur SH1106 (car ils préfèrent le SSD1306), ils n'ont pas créé de bibliothèque spécifique au SH1106.

J'ai donc installé la bibliothèque Adafruit_SH1106 de wonho-maker qui, contrairement à ce que son nom pourrait faire croire, n'est pas une bibliothèque officielle réalisée par Adafruit. Il s'agit plutôt d'une modification, réalisée par un particulier, de la bibliothèque qu'Adafruit a produite pour le SSD1306.  Cette bibliothèque nécessite à son tour la présence de la bibliothèque GFX d'Adafruit (version officielle, cette fois), ce qui représente à mes yeux un énorme avantage: toutes les routines que j'ai utilisées sur mon écran LCD Nokia continueront de fonctionner sur mon écran OLED.

Sketch 1: dessiner des formes, afficher une image bitmap

Commençons par un sketch dont la seule fonction vise à illustrer diverses possibilités de la bibliothèque GFX d'Adafruit: écrire du texte à l'écran...



...dessiner des contours de formes géométriques vides...


...dessiner des formes géométriques pleines...


... contrôler des pixels individuels...


...afficher une image bitmap.


Pour plus de détails, je vous invite à lire l'article qui concerne la première version de ce sketch (réalisé pour un écran LCD Nokia), puisque la majeure partie du programme concerne la bibliothèque GFX plutôt que la bibliothèque SH1106.

L'essentiel de mes modifications (par rapport à ma version initiale conçue pour un écran LCD) a consisté à tenir compte de la nouvelle résolution de l'écran (128 X 64 plutôt que 84 X 48) et de l'inversion des couleurs: par défaut, sur un écran OLED, on dessine en blanc sur fond noir alors que c'était l'inverse sur le LCD.  Il est bien sûr possible de mettre le fond de l'écran blanc pour y dessiner en noir, mais les résultats sont beaucoup moins réussis (présence de traînées grisâtres sur le fond blanc).


Sketch 2: mesure analogique présentée sous forme de jauge rectangulaire

Ce sketch présente à l'écran la tension à l'entrée A0­. La version initiale de ce sketch est décrite de façon plus détaillée ici. Pour en faire l'essai, vous pouvez brancher le curseur d'un potentiomètre à l'entrée A0.




Sketch 3: mesure analogique présentée sous forme de graphique cartésien

Cet autre sketch présente également la tension à l'entrée A0, mais sous forme de graphique cartésien, cette fois.  Voir cet article pour la première version de ce sketch.




Sketch 4: menus de navigation contrôlés par 4 boutons

Finalement, j'ai également adapté le sketch que j'avais écrit pour établir un système de menus contrôlé par 4 boutons poussoir.



L'écran est toujours branché à l'Arduino de la même façon que pour les circuits précédents, mais on ajoute un bouton poussoir à chacune des broches 6, 7, 8 et 9:

À lire aussi

J'ai également utilisé cet écran OLED avec un Raspberry Pi, avec une carte STM32 (Nucleo ou Blue Pill), avec un ESP8266 et avec un ESP32.


Yves Pelletier   (TwitterFacebook)

7 commentaires:

  1. Bonjour, j’ai galéré un bon moment avec le modèle SSD1306 qui grâce à votre tuto s’est avéré être un modèle SSH1106. Un grand merci pour cet excellent tuto qui me permet de bien contrôler mon afficheur. Dan

    RépondreSupprimer
  2. Enfin un tuto en Français pour le SSH1106 ! Et très complet en prime ! Merci !

    RépondreSupprimer
  3. oui bon tuto pour démarrer avec un SH1106 1.3", les 2 premiers sketchs OK du premier coup !
    maintenant je passe à mon appli (mesure ultrason)

    RépondreSupprimer
  4. Est ce Oled n'est pas influencé par les charges inductive comme les afficheur LCD et tft

    RépondreSupprimer
  5. Merci Yves pour ce très bon tuto
    ça fonctionne bien du 1er coup !

    RépondreSupprimer
  6. Oh oui merci pour ce tuto Yves. Avec loupe 8x, au dos de l'écran, il y a bien un régulateur 3.3 V, un 662K en cms. Donc je pense que c'est ok sur mon modèle 3.3 ou 5 V comme précisé.

    RépondreSupprimer
  7. Bonjour, super tuto! L'adresse I2C est elle programmable sur cet ecran?

    RépondreSupprimer