Ecran OLED SSD1306 128×64 SPI

Cet article fait suite à celui-ci.

En faisant le tour des différents périphériques i2c que je compte utiliser pour mon robot, j’ai eu la mauvaise surprise de voir que la boussole et l’écran OLED partageaient la même adresse sur le bus i2c (x3C). Aucun des 2 modules ne permet de modifier l’adresse comme c’est le cas pour certains périphériques.

J’ai donc commandé le même écran OLED, dont je suis très satisfait, mais dans sa déclinaison SPI afin d’éviter les conflits sur le bus i2c. Ca a été plus compliqué que prévu, d’où ce court article.

La première difficulté concerne le raccordement de l’écran à l’Arduino. Certains connecteurs sont nommés de manière peu éloquente : Gnd, Vcc (jusque là, ça va), D0, D1, RES, DC, CS.

Voici les bonnes correspondances, écran –> Arduino :

  • GND –> GND (masse)
  • VCC –> 3.3V à 5V (alimentation)
  • D0 –> SCK
  • D1 –> MOSI
  • RES –> un pin digital (c’est pour le reset)
  • DC –> un pin digital (data/command)
  • CS –> SS

Second problème, logiciel pour changer. J’utilise toujours la librairie U8glib dont je suis très content. Par contre, les constructeurs proposés dans les différents exemples de code ne fonctionnent pas : il faut passer au constructeur le numéro du pin RESET ! J’ai utilisé le constructeur suivant dans mes tests (avec un Arduino Nano) :

U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9, 4);

// SW SPI Com: SCK = 13 (D0 sur oled), MOSI = 11 (D1 sur oled), CS = 10 (CS sur oled), A0 = 9 (DC sur OLED), !!RESET = 4 (RES)!!

Utilisation d’un écran OLED avec un Arduino

Même si mon robot disposera de la parole pour communiquer avec un humain, il est toujours pratique d’avoir un écran pour afficher des informations utiles. De plus, l’électronique de bas niveau (Arduino) n’aura pas accès à la synthèse vocale directement, il sera dépendant du « cerveau ». Pour débugger et afficher des messages directement depuis l’Arduino, un écran sera donc bien utile.

J’avais d’abord regardé du côté des écrans LCD classiques, comme celui-ci :
01_ecran_lcd_classique

Finalement, ils sont lourds et plus grands que je ne l’imaginais. Je suis alors tombé sur des écrans OLEDs (SSD1306), et ils ont tout pour eux ! Ils sont compacts, légers, offrent une belle qualité d’affichage et ils ne coûtent rien 🙂 (environ 5€).

02_ecran_oled

J’avais commandé ce modèle, mais il n’est plus disponible, celui-ci semble identique. Il se décline en nombreuses versions (taille, connexion : SPI, I2C, Série). J’ai opté pour une version I2C. Il faut savoir qu’il s’agit d’un clone chinois-pas cher. « L’original » étant disponible chez Adafruit (pour plus cher bien sûr). Adafruit a mis à disposition une librairie pour piloter ces écrans avec un Ardino, elle est disponible ici.

Je me suis empressé de raccorder mon écran OLED à un Arduino pour faire tourner la démo :

Ca marche très bien ! 🙂 Attention, dans le cas des clones (en 128×64), l’adresse du module i2c est 0x3C (au lieu de 0x3D comme indiqué dans le code de démo de Adafruit).

Donc, ça marche bien oui, mais cet exemple, avec toute la librairie prend énormément de place sur un pauvre petit Arduino (63% de l’espace de stockage et 76% de la mémoire dynamique) ! Ce qui ne laisse plus beaucoup pour faire autre chose.

Sachant que je n’ai pas besoin de tout ce qui est graphique, j’ai trouvé une librairie basique qui ne gère que le texte. C’est evilOLED par evilNick et elle est disponible ici.

Et c’est tout de suite beaucoup mieux : la démo ci-dessous n’occupe de 12% de stockage sur l’Arduino et 3% de sa mémoire dynamique.

L’essentiel est démontré (l’écran répond à mes attentes). Il faudra cependant tuner un peu cette librairie (ce n’est pas trop compliqué) car elle a ses limites (seuls les chiffres, les lettres majuscules et quelques caractères sont gérés en l’état). Il doit être possible de réutiliser la table de caractères d’Adafruit pour disposer d’un maximum de caractères.

EDIT 06/11/2015 : je viens de m’apercevoir que cette librairie (evilOLED) est très particulière ! En fait, elle intègre sa propre implémentation du protocole i2c pour pouvoir utiliser l’écran sur n’importe quel pin digital du Arduino (ce qui peut être pratique). Donc si on l’utilise sur les pins dédiés à l’i2c, avec d’autres périphériques i2c pilotés par la librairie classique (Wire), il y aura des conflits sur le bus i2c et il deviendra inutilisable.

Je me suis donc rabattu sur la librairie u8glib, qui est très performante, facile à utiliser (sans les limitations de caractères vues précédemment), propose de jolies polices et a une emprunte mémoire acceptable (35% de stockage et 12% de mémoire). Sur un Arduino Mega ça le sera encore plus.

Voici une démo avec la librairie u8glib (j’affiche la plus haute température relevée par un TPA81, les ticks comptés par un encodeur placé sur un axe de moteur et les distances relevées par 2 sonars (HY-SRF05).

 

Enfin, il y a d’autres librairies qui semblent très intéressantes :