Un petit afficheur très discret

Un petit afficheur très discret

Pour un projet interne, on avait besoin d'un petit compteur, lisible à quelques mètres y compris dans le noir, mais qui sache rester discret quand il n'est pas utilisé. On était du coup très tenté par ces afficheurs qui restent invisibles quand ils sont éteints, d'où l'idée d'utiliser une carte 15x7 CharliePlex LED Matrix Display FeatherWing d'Adafruit, pilotée par un Yocto-I2C-C, le tout enfermé dans un bloc de plastique imprimé.



Le hardware

L'électronique

Le CharliePlex FeatherWing est une petite carte d'environ 51x23mm avec 15x7 minuscules LEDs. Les nôtres sont vertes, mais il existe des variantes avec des couleurs différentes. La carte se pilote par I2C, d'où l'utilisation d'un Yocto-I2C.

La partie électronique: un Yocto-I2C-C et un CharliePlex FeatherWing
La partie électronique: un Yocto-I2C-C et un CharliePlex FeatherWing


La construction de la partie électronique est archi-simple: le Yocto-I2C-C est connecté par quatre fils au CharliePlex, le port I2C est configuré en Message-based , 400kbps, 3.3 volt.

Connexion entre le Yocto-I2C-C et le CharliePlex FeatherWing
Connexion entre le Yocto-I2C-C et le CharliePlex FeatherWing


Le boîtier

Le boîtier, qui est imprimé, est constitué de deux coques qui se vissent ensemble. Le Yocto-I2C-C est vissé dans le fond d'une des coques. Le fond de l'autre coque est percé de 15x7 trous borgnes faisant face à chaque LED, chaque trou est fermé par deux couches de 0.1mm d'épaisseur. On a en effet déterminé empiriquement qu'avec du filament PRUSA PLA JetBlack, une couche de 0.1mm est trop transparente et que quatre couches de 0.1mm rendent les trous complètement opaques.

La paroi imprimée faisant face aux LED est bien trop fine pour pouvoir utiliser des vis; le CharliePlex FeatherWing est donc calé grâce à quatre plots qui peuvent être ensuite fondus pour que plus rien ne bouge. Les vis qui maintiennent le Yocto-I2C-C en place et qui ferment le boîtier tiennent grâce à des douilles filetées.

Tous les morceaux
Tous les morceaux


Une fois assemblé, le tout ressemble à un mini-monolithe noir d'environ 27x27x65 mm dont la plupart des faces sont d'un noir uni. Le seul truc un peu suspect est le câble USB qui en sort.

L'afficheur une fois fini
L'afficheur une fois fini


Le logiciel

Le CharliePlex FeatherWing est basé sur un chip IS31FL3731 d'ISSI, qui est capable de contrôler 144 LEDs, avec un contrôle de luminosité indépendant pour chacune des LEDs et huit plans mémoire, appelés frames dans la documentation.

Pour initialiser le chip et être sûr qu'il soit dans un état connu, il faut envoyer les séquences suivantes sur le port I2C

  • {S}E8FD0B{P}{S}E80A00{P} Off
  • {S}E8FD0B{P}{S}E80A01{P} On
  • {S}E8FD0B{P}{S}E80000{P} Picture mode, frame 1
  • {S}E8FD0B{P}{S}E80100{P} select frame 1
  • {S}E8FD0B{P}{S}E80600{P} disable Audio synchronization
  • {S}E8FD00{P}{S}E824FF..FF{P} 144*FF : all LEDS power at 100%
  • {S}E8FD00{P}{S}E812000000000000000000000000000000000000{P} all LEDS off

Notez que ces séquences supposent que l'adresse I2C du CharliePlex FeatherWing est 0x74, d'où le premier byte à (0x74 <<1) | 0 = 0xE8.

Pour allumer les LEDS, il suffit d'envoyer un buffer de 16 octets, mais là où ça se complique un peu c'est qu' Adafruit fournit bien une librairie pour piloter le CharliePlex FeatherWing depuis leurs divers modules de leur gamme Feather, mais ne décrit pas comment les LEDs sont mappées sur la mémoire du IS31FL3731, et le moins que l'on puisse dire, c'est que ce n'est pas trivial.

Appliqué à python, ça ressemble à ça:

def showBitamp(i2cPort:YI2cPort frame:int, bitmap: bytearray ): lockup = [0,2,4,6,8,10,12,14,15,13,11,9,7,5,3] InvertLookUp = [0x00,0x80,0x40,0xc0,0x20.... data2Send = [0]*16 for i in range(15): if i > 7: data2Send[lockup[i]] = InvertLookUp[ bitmap[14-i]] >>1 else: data2Send[lockup[i]] = (bitmap[14-i] <<1) &0xff i2cdata:str = "{S}E8FF00{P}{S}E800" for i in range (16) : i2cdata=i2cdata+format(data2Send[i], '02x') i2cdata = i2cdata +"{P}" i2cPort.writeLine(i2cdata)


Dans ce code, InvertLookUp est une table de lookup qui contient tous les bytes de 0 à 255 avec les bits inversés selon un miroir gauche/droite. C'est une méthode un peu agricole, mais c'est bien plus rapide que d'essayer de le faire avec de la logique binaire.

On a fait une petite classe Python qui permet d'afficher un nombre entre 0 et 9999 sur notre afficheur, on a un peu enjolivé en permettant de pivoter l'affichage de 180°, d'afficher en négatif et de changer la luminosité.

Et ça marche?

Ça marche plutôt pas mal, on avait un peu peur qu'il faille utiliser les plans mémoire du IS31FL3731 et faire du double-buffering pour avoir un affichage fluide, mais on n'en a pas eu besoin.

C'est joli, non?
C'est joli, non?


Vous trouverez dans ce fichier zip le code de démonstration qu'on a écrit et qui égrène les secondes.

Pour finir, sachez qu'Adafruit commercialise une variante du CharliePlex FeatherWing avec 16x9 LEDs, on aurait bien aimé l'utiliser, mais on n'a pas réussi à en acheter un dans les temps impartis pour écrire cet article.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.