mercredi 28 septembre 2016

pixdel version 6

Le 6 juin 2012 je publiais sur ce blog un article concernant l'idée du pixdel. Le mot pixdel lui-même est une contraction des mots pixel qui représente un point lumineux sur un écran et DEL qui est l'acronyme de Diode Electro-Luminescente. L'idée originale utilisait un PIC10F202 et une DEL RGB (Red/Green/Blue). Il s'agissait de connecter ces dispositifs sur un bus commun afin de les contrôler individuellement. A l'époque je ne sais pas si les WS8212 existaient. Si c'est le cas j'en ignorais l'existence. Quoi qu'il en soit le pixdel est basé sur une topologie bus1 alors que les WS8212b sont basés sur une topologie chaîne2.

Pixdel version 6

Je viens de développer la verion 6 du pixdel suite à une réflexion sur l'inefficacité du protocole de communication utilisé par les WS8212. En étudiant le protocole de communication des WS8212 je me disais qu'il devait bien y avoir un protocole de communication plus efficace que celui-là. La version 6 du pixdel utilise donc comme les W8212 une topologie chaîne puisque l'idée était de tester cette topologie que j'ai imaginé. Je vais donc expliquer comment fonctionne le protocole utilisé avec les WS8212 et ensuite le protocole que j'ai imaginé.

protocole de communication WS8212

La durée d'un bit est de 1,25µSec. Les zéro sont différenciés des 1 par le rapport cyclique. Voici là table des durées selon le datasheet.
Data transfer time (TH+TL=1.25μs±600ns)

T0H 0 code ,high voltage time 0.4us ±150ns
T1H 1 code ,high voltage time 0.8us ±150ns
T0L 0 code ,low voltage time 0.85us ±150ns
T1L 1 code ,low voltage time 0.45us ±150ns
RES low voltage time Above 50μs

Cette table indique la durée de chaque bit. chaque couleur est contrôlée par un octet il faut donc envoyé 24 bits pour contrôler la couleur d'un WS8212. RES représente un silence obligatoire entre chaque liste de commande. En effet comment un WS8212 sait-il que la commande lui est adressée?

En chaque WS8212 garde le premier paquet de 24 bits qu'il reçoit après un RES et fait suivre tous les autres au suivant. Donc s'il y a 10 WS8212 dans la chaîne et qu'on veut changer la couleur du dixième on doit envoyer une liste de 10x24bits et il ne doit pas y avoir de RES entre chaque groupe 24 bits sinon les WS8212 vont réinitialiser et le premier va garder les 24 bits suivants parce que pour lui se sont les 24 premiers.

Ce protocole de communication est contraignant pour le contrôleur. Non seulement il doit garder en mémoire l'état de chaque WS8212 mais il doit envoyer la séquence au complet même si seul le dernier de la chaîne change de couleur.

protocole de communication pixdel version 6

J'ai donc réfléchi à ça en me disant qu'on pouvait surement faire mieux et une solution m'est apparue rapidement. Pourquoi ne pas envoyer un compteur dans l'entête de chaque commande! Voici comment ça fonctionne.

D'abord la résolution PWM des pixdels version 6 est de 16 bits/composante (8 bits/composante pour les WS8212) ce qui permet un contrôle très précis de la couleur. Le paquet de commande est donc de 7 octets au lieu de 3. Le compteur de 8 bits plus 3x16 bits pour les composantes rouge/verte/bleue. La communication est en RS-232 à niveau TTL à une vitesse de 115200 BAUD.

format du paquet: COMPTEUR|RH|RL|GH|GL|BH|BL

  1. COMPTEUR, compteur de 8 bits permettant de contrôler une chaîne d'une longueur maximale de 255 pixdels. La valeur 0 est réservée pour les messages de diffusion.
    Si un pixdel reçoit un compteur à 0 il accepte la commande et la retransmet au suivant tel quel. Donc tous les pixdels vont accpter cette commande. Si le compteur est à 1 le pixdel accepte la commande mais ne la retransmet pas. Finalement si le compteur a une valeur entre 2 et 255, le pixdel décrémente le compteur et fait suivre le paquet au suivant.
  2. RH, octet fort de la composante rouge.
  3. RL, octet faible de la composante rouge.
  4. GH, octet fort de la composante verte.
  5. GL, octet faible de la composante verte.
  6. BH, octet fort de la composante bleue.
  7. BL, octet faible de la composante bleue.

Avantages

  • Le contrôleur n'a pas besoin de mémoriser les valeurs de chaque pixdel de la chaîne.
  • N'importe quel pixdel de la chaîne peut-être contrôlé par l'envoie d'un seul paquet de 7 octets en initialisant le compteur avec la position du pixdel ciblé dans la chaîne. Par exemple si on veut changer la couleur du 50ième maillon de la chaîne on initialise le compteur à 50.
  • En initialisant le compteur à 0 on peut mettre tous les pixdel de la chaîne dans le même état en envoyant 1 seul paquet de 7 octets.
  • Ce protocole de communication est très souple et peut-être adapté à d'autres applications. Par exemple on pourrait utiliser un compteur de 16 bits pour contrôler une chaîne d'une longueur maximale de 65535 maillons. Dans une autre application la communication pourrait-être faite par SPI,I2C ou autre méthode sérielle.

Démonstration

Pour vérifier mon idée j'ai fait un montage sur carte sans soudure comprenant 3 pixdels v6 que j'ai contrôlé à partir mon ordinateur via un port série. Le schéma de chaque pixdel v6 est le suivant:

Le MCU PIC12F1572 est parfait pour cette application puisqu'il possède 3 périphérique PWM ayant une résolution de 16 bits ainsi qu'un périphérique EUSART pour la communication.

photo du montage

Le firware est disponible sur https://github.com/picatout/pixdel6.

Vidéo de démonstration


notes

  1. Dans la topologie BUS tous les dispositifs sont connectés sur le(s) même(s) fils. Afin d'adresser individuellement chacun d'eux il faut que chacun possède un identifiant unique et que celui-ci soit inclus dans le message. Exemple l'adresse MAC des cartes réseaux. L'adresse MAC est incluse dans l'entête du paquet Ethernet.
  2. Dans la topologie en chaîne le message est transmis à un seul dispositif qui à son tour le retransmet au suivant dans la chaîne si le message de lui est pas adressé. Les dispositifs de la chaîne peuvent avoir un identifiant unique ou non. Dans le cas des WS8212b les DEL RGB n'ont pas d'identifiant un autre mécanisme d'adressage est utilisé.