Afficheur OLED 128X64 pixels Crius CO-16 sur Texas Instrument CC3200 et Arduino

Pour un projet à base de carte CC3200 de Texas Instruments de mettre un petit LCD, j'ai repris un petit afficheur OLED 128X64 pixels que j'avais acheté une poignée d'euros. Pas moyen de le faire fonctionner... En faisant des tests sur Arduino, j'ai pu découvrir certaines particularités et problèmes dont je vais tenter ici de faire le descriptif.. et solutions.

D'un point de vue matériel

co16-front.jpg

L'afficheur est contrôlé par un driver SSD1306 (Datasheeet ici. Ce driver est très polyvalent, puisque qu'on peut choisir le type d'interface de pilotage parmi 3 (I2C / SPI / Parallèle).

Sur le Crius CO-16, comme sur de nombreux afficheurs vendus autour de 5/6 euros, c'est l'I2C qui est choisi. De ce fait, il ne dispose que de 4 fils pour son pilotage :

  • VCC (5V)
  • Masse
  • SDA (i2c data)
  • SCL (i2c clock)

Bien que le SSD1306 permette normalement de configurer l'adresse i2D en 0x3C ou 0x3D, sur le CO-16 elle n'est pas configurable, et est fixée 0x3C. Ceci est à mémoriser car certaines bibliothèques sont configurées en 3D par défaut : il faudra les modifier...

Le CO-16 souffre sur le plan matériel de plusieurs petits défauts :

  • Pas de circuiterie de reset, ce qui lors de l'allumage met parfois l'afficheur dans un état indéterminé qui rend son pilotage inopérant. Il faut donc que le VCC de l'afficheur soit très propre... ou implémenter une circuiterie de reset avec un réseau R/C. Quand l'afficheur est planté, il faut le déconnecter près d'une minute pour le déplanter, car sa faible consommation fait que les condensateurs intégrés fournissent une énergie pendant plusieurs dizaines de secondes après déconnexion...
  • Le signaux "SDA in" et "SDA out" sont séparées sur le SSD1306, et seul le signal "SDA in" est raccordé sur le SDA du connecteur. On n’obtient donc jamais d'acquittement de l'afficheur lorsque l'on envoie une commande sur le bus i2C, ce qui par exemple empêche de voir l'afficheur lors d'un scan i2C.
  • Aucun pullup intégré sur le bus I2C, ce qui lors de la mise en œuvre peut empêcher tout dialogue avec l'afficheur.

Solutions: En ce qui concerne les pullups, c'est assez facilement rajoutable. Cela peut se faire de façon classique à l'extérieur de l'afficheur, mais aussi directement sur celui-ci, car bien que non documentés, 2 emplacements sont prévus pour recevoir des résistances CMS.

Sur la séparation des signaux SDA in et SDA out, cela peut se régler par soft. Plusieurs blibliothèques ont été modifiées pour ne pas attendre l'ACK I2C, rendant l'afficheur utilisable. Mais une autre solution existe, c'est la modification de l'afficheur pour interconnecter les signaux SDAin et SDAOut afin de rendre le signal de sortie bidirectionnel.

Les 2 modifications sont documentées sur la photo ci dessous : Crius_CO16-modifie.jpg

D'un point de vue logiciel

Sur arduino :

Plusieurs bibliothèques sont utilisables pour piloter cet afficheur:

La librairie est modifiée pour permettre l'utilisation sans modification pour rendre le sda bidirectionnel. Dans ce cas il faut utiliser un constructeur spécifique dont le paramèter indique qu'il ne faut pas tester l'ACK:

 U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);	// Display which does not send ACK

Si l'afficheur est modifié, il est dans ce cas possible d'utiliser aussi l'autre constructeur, qui cette fois utilise l'ACK: /// U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI ///

Sur cette librairie il faut configurer Adafruit_SSD1306.h ( https://github.com/adafruit/Adafruit_SSD1306/blob/master/Adafruit_SSD1306.h ), afin d'indiquer que l'afficheur est à l'adresse 3C ( #define SSD1306_I2C_ADDRESS 0x3C ) et qu'il fait 128X64 pixels (#define SSD1306_128_64).

Un exemple circule sur le net concernant le pilotage de cet afficheur. Il semblerait être adapté du programme "Multiwii" qui sert à piloter des quadricopters. J'ai repris le code de Mutliwii, et l'ai adapté pour en faire un exemple autonome de pilotage. Code source ICI.

Sur Energia et CC3200

A écrire...

Conclusion :

Quitte à acheter un afficheur de ce type, il faut mieux éviter le CO16 de Crius. En effet, plusieurs autres afficheurs utilisant le même contrôleur sont disponibles dans les mêmes prix, et n'ont pas les mêmes défauts :

  • http://www.banggood.com/0_96-Inch-White-IIC-I2C-OLED-Display-Module-12864-LED-For-Arduino-p-932606.html

Celui-ci est bidirectionnel (on voit bien l'interconnexion SDA In et SDA Out coté composants), permet de régler l'adresse I2C, dispose de pullups de 1K intégrés, et est compatible 3.3V / 5V.

  • https://learn.adafruit.com/monochrome-oled-breakouts

Les afficheurs Adafruit sont très bien également, bien qu'assez chers.

  • Afficheurs avec interface complète de pilotage

Plusieurs afficheurs existent avec un connecteur à 16 broches, et 3 straps permettant de choisir le type d'interface de pilotage. Bien que je n'ai pas testé, cela m'a paru intéressant car on peut choisir librement entre I2C, SPI et parallèle. Dans ce cas les broches du connecteur changent de fonction.

Exemple : http://www.ebay.com/itm/New-3-3V-0-96-128x64-OLED-Display-Module-SSD1306-Arudino-AVR-Blue-6800-iic-/261068643292