Pixel LED

Cet article est un brouillon, il n'est pas encore tout à fait complet


L'enseigne du Magic Dance en pixels LEDs.

Vous ne vous êtes jamais posé la question de savoir comment fonctionnent ces enseignes que l’on voit de plus en plus? Comment ça marche ? Comment contrôler toutes ces LEDs ?

C’est ce à quoi l’on va répondre ici en utilisant les LEDs qui servent à faire ces enseignes et c’est vous qui allez les contrôler !

Je ne vous cache pas que ça va être très technique, le but est de mettre les mains dans le cambouis pour comprendre comment ça marche, mais même s’y vous n’y connaissez pas grand-chose, vous pouvez toujours jeter un coup d’œil sur la suite.

Si vous avez un minimum de logique, vous devriez arriver à comprendre mais il vous faut quand-même un minimum de connaissances en Linux et programmation. Pour Linux, il s’agit de savoir se servir des commandes de base du shell (cd, mkdir, etc..) et en programmation, on n’utilisera que les boucles et conditions pour animer les LEDs, on n’a pas besoin d’autre chose.

Le matériel néscessaire

Raspberry PI

C’est un ordinateur de la taille d’une carte bleue, il n’est pas super puissant, un peu moins puissant qu’un Galaxy S mais il permet de faire tout un tas de choses. Il est doté d’un processeur ARM, comme ceux qu’on trouve dans les téléphones et tablettes alors que nos PC ont des processeurs X86.

Pour le faire fonctionner, il faudra un chargeur micro USB. SI un chargeur de téléphone peut faire l’affaire, en revanche, il ne faut pas l'alimenter avec un port USB de son PC, ça ne fournit pas assez de puissance.

Une carte SD à insérer dans le lecteur du Raspberry PI fait office de disque dur ; une carte de 4Go est suffisante pour ce qu'on va faire.

Juste le temps de l’installation, un clavier et un écran pourvu d’une entrée HDMI ou vidéo analogique sont nécessaires, le Raspberry étant destiné à être branché sur une TV.

Pour plus de sécurité, je préfère utiliser une connexion WIFI, comme ça en cas de mauvais branchement, ça évite de cramer son PC ou d'autre matériel fort coûteux. Il faut vérifier la compatibilité ici.

Une alimentation de PC

Elle va servir à alimenter les LEDs qui demandent un peu de puissance, un simple chargeur de téléphone ne suffira pas. Il faut utiliser la sortie 3.3V, en cas de doute, vérifier au voltmètre.

Quand vous allez brancher l'alimentation, elle ne va pas s'allumer et délivrer du courant, il faut la démarrer. Pour cela, sur le plus gros connecteur, celui qu'on branche à la carte mère, relier le fil vert (PS_ON) au fil noir (GROUND), le ventilateur de l'alimentation va se mettre en marche.

Les pixels LEDs

On en trouve sous plusieurs formes, seule la présentation diffère, le principe restant le même. Il faudra veille à ce que les pixels LEDs utilisent un circuit intégré WS2801 puisque c'est celui-là qu'on va utiliser ici.

La théorie

Les pixels LEDs consistent en un chaîne d’éléments constitués d’un circuit intégré et de trois LEDs (rouge, vert et bleu).

Le rôle du circuit intégré est de récupérer les données envoyées par le Raspberry et d’allumer les LEDs. Ce circuit est un ws2801 spécialement conçu pour ça. Le ws2801 possède une entrée et une sortie reliée au pixel suivant.

Quand le circuit reçoit des données, il récupère et bloque les 3 premiers octets correspondants au niveau de rouge, vert et bleu et envoie le reste des données au circuit suivant qui récupère les 3 premiers octets qu’il reçoit et envoie le reste au circuit suivant qui récupère les 3 premiers octets et ainsi de suite. S’il y a une pause de plus de 500µs dans le signal d’horloge, le circuit considère ce qu’il reçoit comme de nouvelles données et change l’état des LEDs.

PWM

Chaque LED, rouge, vert et bleu possède 256 niveaux de luminosité, si l'on fait le calcul, ça nous donne 256x256x256 = 16 777 216 couleurs possibles, c'est déjà pas mal! Ces niveaux sont contrôlés en PWM.

Le PWM c’est en fait un simple variateur de puissance.

Pour faire varier la lpuissance, on peut soit utiliser une résistance variable, plus la résistance est grande, plus la luminosité est faible. C’est par exemple ce qu’on trouve sur les casques audio pour contrôler le volume.

On peut aussi utiliser la PWM, Pulse Width Modulation, modulation de largeur d’impulsion. C’est comme un interrupteur que l’on ouvre et ferme très rapidement. Le rôle d’interrupteur est joué par un transistor MOSFET. La PWM a l’avantage de faire fonctionner le transistor en tout ou rien, contrairement à une résistance il ne s’oppose pas au passage du courant et donc chauffe moins et le circuit est plus performant niveau consommation électrique. Par exemple, la PWM est utilisée dans les micro-ondes, écoutez le bruit du micro-ondes à pleine puissance, le bruit est continu alors qu'à plus faible puissance, on entends des variations dans le bruit. C'est le magnétron (générateur d'ondes) qui fonctionne par intermittence en tout ou rien, c'est à dire à 100 % de sa puissance ou à 0 % de sa puissance..

Préparation du Raspberry

Je ne vais pas expliquer en détails l’installation, il y a plein de tutoriels sur internet, cherchez « installer raspberry » sur Google, par exemple ici http://www.tomshardware.fr/faq/id-2929165/configurer-raspberry-installer-raspbian.html.

On va utiliser la distribution Raspbian disponible ici : http://www.raspberrypi.org/downloads

Pour cette étape, il faut relier le Raspberry à une TV et un clavier.

On va quand-même personnaliser un peu l’installation. On ne va pas activer le serveur X au démarrage, à part occuper inutilement de la mémoire, ça ne nous servira à rien puisqu’on n’a pas besoin de l’interface graphique. En quantité de mémoire vidéo, mettre le minimum, 16Mo pour en avoir le maximum pour les applications. Par contre on va activer le serveur SSH pour pouvoir se connecter à distance. Une fois la configuration terminée, redémarrer le Raspberry et le laisser faire jusqu’à avoir l’écran de login. Le login est pi et et mot de passe raspberry.

Maintenant, on peut créer un mot de passe pour le compte root :

$ sudo passwd –u root

Et se connecter en root pour les étapes suivantes.

Configurer ensuite le réseau et vérifier que ça fonctionne, y compris internet en faisant la commande

# ping google.fr

Une fois cette phase de l’installation terminée, on n’a plus besoin du clavier et de l’écran. À partir de maintenant, on va se connecter au Raspberry à distance en SSH. Pour Windows, il faut utiliser PUTTY.

On mets le Raspberry à jour, ça prends quelques dizaines de minutes :

# apt-get update # apt-get dist-upgrade

Installer et configurer un serveur SAMBA pour faire du partage de fichiers sur le Raspberry avec un PC Windows, vim ou emacs comme éditeur texte et PHP.

# apt-get install samba vim php5

Pour cofigurer le WIFI, votre clé USB doit être détectée. Pour vérifier, exécuter :

# ifconfig

Il doit y avoir un périphérique WLAN0.

Pour configurer l'accès, ouvrir le fichier wpa_supplicant.conf

# vim /etc/wpa_supplicant/wpa_supplicant.conf

Et y mettre ça 

network={
ssid="<NOM_DU_RÉSEAU>"
psk="<CLÉ_WIFI>"
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP
auth_alg=OPEN
}

 

Redémarrer le réseau.

# service networking restart

L'interface WLAN0 doit avoitr une Ip si ça fonctionne.

Maintenant, on va configurer un paramètre spécifique pour pouvoir contrôler les LEDs.

Il s'agit de l’interface SPI qu'il faut activer. C’est les pins GPIO où l’on va brancher les LEDs :

Ouvrir le fichier /etc/modprobe.d/raspi-blacklist.conf et dé-commenter (enlever le dièse) la ligne

blacklist spi-bcm2708

Redémarrer le Raspberry

# reboot

Quand le Raspberry est redémarré, vérifier la présence du périphérique SPI.

# ls -l /dev

Et vérifier la présence de :

/dev/spidev0.0
/dev/spidev0.1

Éteindre le Raspberry.

# poweroff

Si vous avez tout ça, votre Raspberry est maintenant prêt. On peut y brancher les LEDs comme sur le schéma. Pour que ce soit plus pratique, j'ai utilisé la nappe d'un lecteur disquette, ça marche aussi avec celle d'un lecteur CD IDE. On trouve ça dans d'anciens ordinateurs, il faudra veiller à bien repérer les fils à l'aide d'un testeur de continuité pour ne pas faire de mauvais branchement.

Brancher l’alimentation des LEDs puis celle du Raspberry. Durant le démarrage, il se peut que les premières LEDs s’allument et prennent des couleurs aléatoires, c'est plutôt bon signe.

Maintenant que tout est démarré, on est prêt pour faire notre premier test. Mais avant un petit rappel : sous Linux, tout est un fichier, y compris les périphériques matériels tels que le clavier et la souris. Ici, c’est le périphérique SPI qui nous intéresse. Pour envoyer des données dans le SPI, il suffit d’écrire dans le fichier /dev/spidev0.0 c’est aussi simple que ça.

Pour écrire dedans, on va faire une simple redirection à droite, dans le shell, taper cette commande :

# echo -ne "\x00\xFF\x00" > /dev/spidev0.0

Si la première LED s’allume en vert, c’est que ça marche ! Si ce n’est pas le cas, vérifiez que les contacts sont bons, mais attention, les données ne sont envoyées qu’une seule fois quand vous appuyez sur entrée et ça ne prends qu’une fraction de seconde, il faudra refaire la commande à chaque test.

Pour être sûr que ça marche bien, dans le cas où la première était déjà verte, on va l’allumer en bleu :

# echo -ne "\x00\x00\xFF " > /dev/spidev0.0

C’est bleu ? alors on continue !

En fait on envoie pour chaque LED, dans cet ordre le niveau de rouge, vert et bleu souhaité. Les valeurs sont en hexadécimal, le \x indique à l’ordinateur que l’on a un nombre en hexadécimal. Les valeurs vont de 00 (0%) à FF, (100%), ce qui fait 256 niveaux pour chaque couleur.

Pour allumer la LED en bleu, il faut 0% de rouge, 0% de vert et 100% de bleu, donc : \x00\x00\xFF

Pour avoir du jaune, qui est un mélange de rouge et vert, il faut 100% de rouge, 100% de vert et 0% de bleu, donc : \xFF\xFF\x00

Pour du blanc, on mets tout à 100% : \xFF\xFF\xFF

Et pour du noir, éteindre la LED, on mets tout à 0% : \x00\x00\x00

On peut bien sûr mettre des niveaux intermédiaires entre 0% et 100%, par exemple pour du jaune pas trop lumineux : \x25\x25\x00

Maintenant qu’on a vu comment faire avec une LED, on va allumer 3 leds en rouge, vert et bleu. Il suffit de mettre l’état des 3 LEDs à la suite :

# echo -ne "\xFF\x00\x00\x00\xFF\x00\x00\x00\xFF " > /dev/spidev0.0

LED 1 rouge => \xFF\x00\x00

LED 2 vert =>\x00\xFF\x00

LED 3 bleu =>\x00\x00\xFF

Et ainsi de suite pour chaque LED.