Leds et persistance rétinienne

Résumé

Dans un article de Make Magazine volume 1 intitulé Glowstick a Go-Go, il était question d'une série de leds affichant momentanément chaque ligne verticale d'une petite image. Lorsqu'on déplace rapidement cette série de leds dans l'espace (avec sa main), l'image est recréée et semble flotter dans le vide.

Moi et mes collègues (voir le blog d'Étienne à www.naid.net) avons trouvé cela très amusant et avons décidé d'expérimenter un peu suivant le même concept.



Version 1

Rhytme de balayage de l'image fixe, pas de synchronisation. Déplacement manuel.
circuit
J'ai récupéré le circuit imprimé d'un projet précédent qui possédait un MCU Atmega8, un uln2003 et 7 leds rouge haute intensité.

Le MCU utilise sont circuit d'horloge interne. Les 7 leds sont crontrolables via le port D du microcontroleur. Pour controler les leds, il suffit donc simplement d'ecrire dans le PORTD et ensuite d'attendre (ce que j'ai fait avec une simple boucle).

Voici le code (compilé avec avr-gcc):
main1.c

Problèmes, solutions et améliorations possibles:
  • Le texte commence à n'importe quel moment. Il faudrait qu'il débute lorsqu'il y a une accélération.
  • Lorsqu'on agite le circuit manuellement de gauche à droite, le texte apparait renversé une fois sur deux. Il faudrait détecter la direction du mouvement, et inverser le texte si nécéssaire.



Version 2

Rhytme de balayage de l'image fixe, pas de synchronisation. Déplacement par roue de bicyclette.

Suite a la premiere version de cette expérience, un ami m'a montré une page web ou quelqu'un dessine une image fixe sur une roue de bicyclette, et une autre page ou il y avait du texte autour de la roue. Nous avons donc eu l'idée de fixer notre circuit sur une roue de bicyclette. (Merci à Nic pour la bicyclette :))

Aucun changements au code n'était nécéssaires, mais j'ai changé le texte pour quelques petit pattern style jeux vidéo old school.
on bike on bike2

Problèmes, solutions et améliorations possibles:
  • Le pattern commence à n'importe quel moment, donc il n'apparait jamais au même endroit (sauf lorsque le temps requis pour un tour de roue est égal au temps de balayage du pattern). Il faudrait connaitre la position de la roue. Ceci est réglé dans la version 2.1.
  • Le pattern s'étire ou se contracte selon la vitesse de la roue. Il faudrait calculer la vitesse de la roue et ajuster le rhytme de balayage du pattern en conséquence.



Version 2.1

Rhytme de balayage fixe, avec synchronisation. Déplacement par roue de bicyclette.

sync Afin que le pattern s'affiche toujours au même endroit, j'ai ajouté un senseur générant une pulsation &agreave; chaque tour. Mon senseur est composé de la bobine d'un relais, d'un aimant et d'un circuit d'amplification.

L'aimant est fixé sur le cadre de la bicyclette, et la bobine dans la roue. A chaque fois que l'aimant passe devant la bobine, une petite pulsation d'une centaine de millivolts est créée par la bobine. Le circuit d'amplification convertit la pulsation en 0-5volts pour que le MCU puisse la recevoir.

Une petite modification au code a du étre effectuée. Maintenant, le MCU attends la pulsation, balaye l'image une fois et attends la suivante:
fixe
Problèmes, solutions et améliorations possibles:
  • Le circuit de synchronisation est gros et un peu complexe. Un senseur hall effect serait plus simple. Solution: Commande digikey...
  • Le pattern s'étire ou se contracte selon la vitesse de la roue. Il faudrait calculer la vitesse de la roue et ajuster le rhytme de balayage du pattern en conséquence.
  • Si on fait un trè long pattern, après un tour complet il se peut que la fin écrase le début. Il faudrait maintenant choisir combien on souhaite avoir de pixels dans un tour, ajuster la vitesse de balayage selon la vitesse de la roue, et améliorer le code.
  • La roue ne tourne pas assez vite pour que l'image soit parfaitement constante. Utiliser plusieurs séries de leds en opposition sur la roue pourrait grandement aider. (Aller à 100Km/h avec ca bicyclette n'est pas une solution réaliste...)



Version 2.2

Rhytme de balayage fixe, avec synchronisation. Déplacement par roue de bicyclette.

J'ai remplacé les leds rouges "on-board" par des leds verts très brillants montés sur un petit circuit perforée. Cela donne 2 avantages:
  • Ces leds éclairent plus fort, donc meilleure visibilité.
  • Il est maintenant possible d'installer le circuit du MCU plus près du centre de la roue et donc c'est mieux balancé.


J'ai aussi légèrement amélioré le code:
  • Le signal provenant du senseur de position génère maintenant une interruption.
  • Il y a un timer qui incrémente une variable a chaque milliseconde. La valeur de cette variable est sauvegardée et réinitialisée à chaque fois qu'une interruption est causée par le senseur de position. Cela permet de connaitre le temps qu'a duré le dernier tour.
  • Une police d'écriture a été ajoutée.

Grace au nouveau code il est possible de calculer la vitesse de rotation de la roue:

Le temps manquait pour cette fois, mais il sera facile d'afficher la vitesse du vélo dès que la circonférence de la roue sera mesurée...

Problèmes, solutions et améliorations possibles:
  • Les mêmes problèmes que la version 2.1
  • Connaissant la vitesse de la roue, il est maintenant facile d'ajuster le rhytme de balayage selon la vitesse de la roue.



Version X

Cette version n'existe pas encore, c'est seulement un groupe d'idées à explorer, ce qui va probablement engendrer d'autres versions.

Idées pour le code:
  • Utiliser un timer du MCU pour le balayage. Update des leds dans la routine d'interruption du timer (Output Compare). Les données des leds proviendront d'un buffer. Dans cette routine, si la fin du buffer est atteinte le balayage doit reprendre au début.
  • Brancher le senseur de position sur une pin d'interruption externe. Dans la routine d'interruption il faudra rapidement calculer le temps écoulé depuis la dernière interruption, et ajuster le rhytme du timer de balayage en conséquence. Aussi, il faudra forcer le balayage a retourner au début du buffer immédiatement.
  • Pour permettre l'évaluation du temps écoulé, il faudra utilser un autre timer du MCU pour incrementer régulièrement une variable, ou aller lire directement la valeur de comptage de ce timer.Fait dans version 2.2
  • Texte qui défile, affichage de la vitesse dans la roue, animation dynamique selon la vitesse, effets spéciaux...

Idée pour le circuit/installation:
  • Plusieurs séries de leds opposés sur la roue pour permettre un meilleure taux de rafraichissement (image plus fixe).
  • Mettre plus de leds pour une meilleure résolution. Si on veux plus que 8 leds, il faut utiliser plusieurs ports. Est-ce que le temps entre l'écriture dans le premier port et le deuxième va causer une distortion?
  • Essayer avec des leds de plusieurs couleurs contigüs, ajuster le timing pour qu'ils s'allument au méme moment et faire des couleurs.
  • Essayer de faire plusieurs niveaux d'intensités pour les leds.
  • Faire la même chose sur une roue de voiture.
  • Faire la même chose sur un ventilateur...
  • Avec bonne résolution, faire un jeu vidéo utilisant cela comme affichage



Avertissement

Je ne saurais être tenu responsable pour les dommages que l'utilisation des informations ou la mise en œuvre des instructions présentées sur cette page pourrait causer à votre équipement, à vous-même ou à autrui. Aussi, je ne donne aucune garantie quant à l'exactitude des informations et à leur fonctionnement.