vendredi 18 juillet 2014

Arduino et persistance rétinienne (POV Display)


Voilà un projet que je voulais essayer depuis longtemps:  un afficheur rotatif à persistance rétinienne.

Ce dispositif permet de tracer des mots lumineux (qui semblent s'afficher dans le vide) au moyen de quelques LEDs en rotation rapide.

Matériel nécessaire:  8 LEDs, Arduino, ventilateur de PC, LED infrarouge et phototransistor.


Principe de fonctionnement

Vous disposez d'une barrette de 8 LEDs disposées le façon à former une droite verticale  (à gauche), et vous désirez former la lettre A (à droite).

Une solution possible:  déplacer la barrette de LEDs horizontalement vers la droite, tout en allumant à chaque position les LEDs qui sont utiles pour former la lettre désirée (et en éteignant celles qui ne le sont pas).

Au début, quand la barette de LED se trouve à la position A, on allume toutes les LEDs sauf celle du haut (numéro 1).  Une fraction de seconde plus tard, au moment où la barrette se trouve à  la position B, on allume uniquement les LEDs 1 et 5. Il en est de même quand la barrette de LEDs passe par les positions C et D, puis finalement on allume à nouveau toutes les LEDs sauf le numéro 1 lorsque la barrette passe par la position E.

Bref, la lettre a été tracée au moyen de 5 colonnes lumineuses qui ont été allumées l'une après l'autre, mais si le phénomène est suffisamment rapide, nous avons l'illusion que les 5 colonnes étaient allumées simultanément.

Pour que les lettres demeurent visibles de façon stable pendant une longue période de temps, la barette de LEDs doit repasser par les mêmes positions de façon périodique afin de retracer les lettres avant qu'elles ne disparaissent...  On y arrive en plaçant les LEDs à l'extrémité d'une tige rotative:  le mouvement devient périodique et le texte est réécrit à chaque tour de la tige.


Comme vous pouvez le constater sur la photo ci-dessus, la tige rotative supporte également l'Arduino (responsable d'allumer et éteindre les LEDs au bons moments) et une pile de 9 V qui alimente à la fois les LEDs et l'Arduino.  Puisqu'ils sont tous reliés ensemble, il faut qu'on les fasse tourner en même temps que les LEDs, sinon les fils vont s'emmêler!   (puisque l'Arduino et la pile sont relativement lourds, il faut les fixer solidement pas trop loin de l'axe de rotation de la tige, sinon ils risquent de se transformer en dangereux projectiles...).

Et voici le résultat pendant que la tige est en rotation et que les LEDs s'allument et s'éteignent au bon moment (le cercle bleu est causé par une LED de l'Arduino qui est lui-même en rotation rapide)



Choix du moteur

Pour faire tourner la tige à haute vitesse, on peut utiliser n'importe quel moteur à courant continu.  J'ai opté pour un ventilateur de PC car son rotor présente une assez large surface plane sur laquelle il est facile de coller une mince lamelle de bois (qui provient d'un vieux store en bois de chez IKEA).   De plus, son stator comporte 4 trous de montage qui permettent de le visser solidement sur une lourde base en bois (cette base est essentielle pour éviter que votre montage se transforme en aéroglisseur!).

Léger inconvénient, toutefois, mon ventilateur n'accepte de tourner que dans le sens antihoraire, ce qui m'oblige à écrire les texte en commençant par la fin, de la droite vers la gauche (bien sûr que j'ai essayé d'inverser la polarité de son alimentation, mais ça n'a pas fonctionné).

La barrette de LEDs


Les LEDs sont disposées de façon rectiligne. Chacune est soudée à une résistance de protection de 220 Ω.  Toutes les cathodes sont reliées ensemble (et au GND de l'Arduino) alors que chaque anode est reliée à une sortie de l'Arduino.



Barrette de LEDs:  schéma du circuit


Phototransistor et LED infrarouge

Pour que le résultat soit stable, l'Arduino doit amorcer l'écriture des mots exactement au même endroit à chaque tour.  Pour ce faire, un phototransistor fixé sous la tige rotative envoie un signal à l'Arduino chaque fois qu'il passe au-dessus d'une LED infrarouge immobile, fixée sur la base du dispositif.

Sur réception de ce signal en provenance du phototransistor (une fois par tour, toujours exactement au même endroit), l'Arduino amorce l'écriture du mot.

Le phototransistor a été entouré de ruban gommé opaque afin de limiter l'influence de l'éclairage ambiant (seule son extrémité, qui fait face à la LED IR,  peut recevoir de la lumière).

Puisque la LED infrarouge est immobile, elle est alimentée par la même source de tension de 12 V qui alimente le moteur (il faut prévoir la valeur de la résistance protectrice en conséquence).


Le pĥototransistor est relié à l'Arduino de la façon suivante:



D'autres solutions sont possibles:  LED et photorésistance, aimant et capteur à effet Hall, etc.

Sketch

Je n'ai pas écrit le sketch moi-même: je l'ai trouvé telefab.fr.  Toutefois, j'ai dû faire quelques modifications:  d'une part, le sketch était conçu en fonction d'un moteur tournant dans le sens horaire alors que, comme je l'ai déjà mentionné, mon moteur ne tournait que dans le sens antihoraire. J'ai donc modifié quelques détails pour que les mots s'écrivent à partir de la fin.  De plus, le sketch d'origine faisait lentement défiler les mots de droite à gauche, ce qui est bien pratique quand on veut écrire une phrase trop longue pour être affichée au complet, mais qui est irritant quand on se contente d'afficher des mots individuels:  j'ai enlevé ce défilement.  De plus, j'ai soudé ma barrette de LEDs en cathode commune alors que le sketch supposait l'inverse.

Attention:  ce sketch nécessite l'utilisation des fichiers de définition des polices de caractères (patterns.c et patterns.h), disponibles ici.


Calibration

Les moteurs ne tournent pas tous à la même vitesse, et rien ne vous oblige à utiliser une tige rotative de même longueur que celle que j'ai utilisée (je ne vous ai d'ailleurs pas indiqué sa longueur).  Il est donc possible que les mots soient trop comprimés, ou trop dilatés.  L'ajustement de la variable 'largeur"  vous permettra d'obtenir un résultat correspondant à vos préférences:  plus la valeur de "largeur" est grande, plus les mots seront étalés.  Vous pourriez également vouloir modifier la valeur de la variable "dureeMot", qui détermine le temps pendant lequel un mot est affiché avant d'être remplacé par un autre.

Vidéo

Finalement, voici une petite vidéo qui montre le dispositif en fonctionnement (c'est plus joli dans la réalité: un effet stroboscopique dégrade un peu le résultat sur vidéo)).





Voir aussi:

Une autre expérience (plus simple) impliquant la persistance rétinienne (réflexion d'un laser sur plusieurs miroirs en rotation).

Yves Pelletier (Twitter: @ElectroAmateur)

13 commentaires:

  1. merci pour le projet
    comment je peux modifier le programme pour afficher d'autre mot??

    RépondreSupprimer
    Réponses
    1. À la ligne 26 du programme, vous remplacez les mots "PERSISTENCE", "RETINIENNE","ARDUINO" par les mots que vous voulez.

      Supprimer
  2. Super, c'est génial mais je n'arrive pas à avoir la bibliotheque "string.h" pour le programme Arduino.
    Où peux t-on le telecharger ?
    Merci

    RépondreSupprimer
    Réponses
    1. http://telefab.fr/wp-content/uploads/2013/02/Propeller_Display_commented.zip

      Supprimer
  3. Peux t-on le faire marcher sans le phototransistor, d'ailleurs le port 2 n'est pas déclaré en "input" dans le programme. J'ai testé et seule la led 13 s'allume en permanence. Je ne vois pas où ça coince. Merci

    RépondreSupprimer
    Réponses
    1. Le phototransistor est nécessaire. Une interruption est provoquée lorsque la pin 2 change d'état (voir l'instruction "attachInterrupt(0, onInt, FALLING); "). L'interrupt 0 est la pin 2 sur l'Arduino. Sans ce signal, la routine onTimer ne serait jamais exécutée.

      Supprimer
  4. Bonjour j'ai pas compris l'instruction (Byte & 2) vous pouvez m'expliquer le principe; Merci.

    RépondreSupprimer
  5. Bonjour, je vous remercie pour ce projet.
    je n'ai pas compris ce ligne 'digitalWrite(13, HIGH);' sert à quoi exactement, merci d'avance!

    RépondreSupprimer
    Réponses
    1. svp c'est quoi la diff entre LED IR récepteur et un phototransistor ; comment je peut tester le fonctionnement de la phototransistor avec photodiode merci

      Supprimer
  6. bjr, merci pour ce projet
    je veux connaitre est ce que les 8 LEDs s'allume en absence de la phototransistor ou non , autre chose j'utilise 2 LED IR un récepteur et l'autre émetteur à la place de phototransistor et la photodiode ; est que ça marche ou pas ;et comment je peut connait que les 2 LED IR fonctionne; et merci bq;

    RépondreSupprimer
  7. Bonjour et BRAVO pour cette réalisation... je voudrais savoir comment avez vous changer le code par rapport à la rotation du moteur ... le mien tourne dans l'autre sens et ducoup les lettre s'affichent en mode miroir Merci

    RépondreSupprimer
  8. Bonjour,
    Tout d'abord bravo pour ce projet je voulais savoir simplement si il était possible d’intégrer une horloge en temps réelle au programme à la place d'y afficher des mots ?
    Un grand merci !

    RépondreSupprimer
  9. Bonjour,
    j'ai un message d'erreur a la compilation .
    warning : ISO C++ forbids converting a string constant to 'char*'[Wwrite-strings].
    dans la ligne qui contient le texte a afficher.
    char * toDisplay[] = {"PERSISTENCE", "RETINIENNE","ARDUINO"};

    RépondreSupprimer