Zootrope

Apprendre à créer des animations à partir d'images fixes mues en rotation dans les deux sens grâce à une carte Arduino et un moteur électrique interfacés avec un pont en H

Nicolas PONCET

Avant Internet, la télévision, et même avant les films, quelques-unes des premières images animées étaient créées à l'aide d'un outil appelé un zootrope. Les zootropes créent l'illusion du mouvement à partir d'un ensemble d'images fixes ayant quelques petites différences entre elles. Les zootropes sont typiquement des cylindres possédant de fines fentes sur leur pourtour. Lorsque le cylindre tourne et que vous regardez à travers les fentes, vos yeux perçoivent les images fixes disposées sur la face opposée du cylindre comme une animation. Les fentes permettent d'empêcher les images d'être perçues comme une grosse tâche floue, et la vitesse à laquelle les images défilent permet de créer l'illusion du mouvement. À l'origine, ces instruments étaient mis en rotation à la main, ou grâce à un mécanisme à remontoir.

Dans ce projet, vous allez fabriquer votre propre zootrope permettant d'animer une plante carnivore. Le mouvement de rotation sera produit par un moteur électrique. Afin de rendre ce système encore plus avancé, vous ajouterez deux interrupteurs qui permettront pour l'un, d'allumer ou d'éteindre le dispositif, pour l'autre de contrôler le sens de rotation, et aussi un potentiomètre qui contrôlera la vitesse.

Commentez

- Titre : Zootrope

- Auteur : Nicolas PONCET

- Parution : 6 mars 2018

- Public visé :

- Licence : Le contenu de cet article est rédigé par Nicolas PONCET et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé. Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright ® 2013 Developpez.com.

Voir également :

- Apprendre à faire tourner une roue multicolore grâce à un moteur piloté par Arduino

Sommaire

- I. Introduction

- II. Matériels

- III. Construire le circuit

- IV. Le programme

- V. Utiliser le montage

- VI. Note de la rédaction

I - Introduction

Dans le projet avec la roue multicolore motorisée, vous aviez un moteur ne tournant que dans un seul sens. Si vous aviez interverti les fils d'alimentation et de masse aux bornes du moteur, le moteur aurait alors tourné dans le sens opposé. Il n'est vraiment pas pratique de devoir effectuer cette modification à chaque fois que vous voulez faire tourner quelque chose dans un sens différent. C'est pourquoi nous allons utiliser un composant appelé « Pont en H » qui inversera pour nous la polarité aux bornes du moteur.

II - Matériels

RÉSISTANCE
10 kΩ

POTENTIOMÈTRE

PONT
en H

BOUTON
POUSSOIR

MOTEUR CC

BORNIER PILE

PILE

x2

x1

x1

x2

x1

x1

x1

Les structures électroniques avec ponts en H existent sous forme de circuits intégrés (Integrated Circuits : IC). Ce genre de puces peuvent contenir des circuits complexes avec des composants électroniques de base dans un volume minuscule. Ils peuvent aider à simplifier l'utilisation de circuits plus complexes en les intégrant dans des composants aisément remplaçables. Par exemple, le pont en H que vous allez utiliser dans ce projet contient de nombreux transistors. Pour construire le circuit contenu dans le pont en H, vous auriez probablement eu besoin d'une autre platine d'expérimentation.

Avec une puce électronique, l'accès aux circuits qu'elle contient s'effectue grâce aux broches situées sur son pourtour. Chaque puce peut avoir un nombre de broches différent, et toutes les broches ne seront pas nécessairement utilisées dans tous les circuits. Il est quelquefois plus pratique de désigner une broche par son numéro plutôt que par sa fonction. Lorsque vous regardez le boîtier d'une puce, la partie possédant une encoche est considérée comme le haut. Vous pouvez alors identifier le numéro des broches en commençant à compter à partir du coin en haut à gauche puis en suivant le sens d'un « U » comme illustré sur la figure ci-contre.

III - Construire le circuit

Circuit

Schéma

1. Branchez l'alimentation et la masse à votre platine d'expérimentation à partir de l'Arduino.

2. Ajoutez deux boutons-poussoirs sur la platine, et connectez l'un des côtés de chaque bouton à l'alimentation. Ajouter une résistance « pull-down » de 10 kΩ en série avec la masse sur l'autre côté de chacun des boutons.
Le bouton relié à la broche 4 contrôlera la direction, tandis que celui relié à la broche 5 permettra d'allumer ou d'éteindre le moteur.

3. Connectez le potentiomètre à la platine. Câblez le 5 V d'un côté et la masse de l'autre. Reliez la broche centrale à l'entrée analogique 0 de l'Arduino. Ce potentiomètre sera utilisé pour contrôler la vitesse de rotation du moteur.

4. Placez le pont en H sur votre platine de façon à ce qu'il enjambe le centre de la plaque (voir circuit pour le détail sur sa position). Connectez la broche 1 du pont en H à la sortie numérique 9 de l'Arduino. C'est la broche d'activation du pont en H. Quand elle reçoit 5 V, le moteur s'allume, quand elle reçoit 0 V, le moteur s'éteint. Vous utiliserez cette broche pour commander le pont en H avec un signal modulé PWM, afin de régler la vitesse de rotation du moteur.

5. Connectez la broche 2 du pont en H à la sortie numérique 3 de l'Arduino. Connectez la broche 7 à la sortie numérique 2. Ce sont les broches que vous utiliserez pour communiquer avec le pont en H, et lui indiquer dans quelle direction faire tourner le moteur. Si la broche 3 est à l'état bas (LOW) et que la broche 2 est à l'état haut (HIGH), le moteur tournera dans un sens. Si la broche 2 est à l'état bas (LOW) et que la broche 3 est à l'état haut (HIGH), le moteur tournera dans l'autre sens. Si les deux broches sont à l'état haut (HIGH) ou bas (LOW) en même temps, le moteur s'arrêtera de tourner.

6. Le pont en H est alimenté via sa broche 16, branchez-la au 5 V. Les broches 4 et 5 sont toutes les deux connectées à la masse.

7. Reliez les bornes du moteur aux broches 3 et 6 du pont en H. Ces deux bornes seront alimentées en fonction des signaux que vous enverrez sur les broches 2 et 7 du pont en H.

8. Branchez le bornier de la pile (sans que la pile y soit connectée !) à l'autre ligne d'alimentation de votre platine d'expérimentation. Connectez la masse de l'Arduino à la masse de la pile. Connectez la broche 8 du pont en H à l'alimentation de la pile. C'est via cette broche que le pont en H capte l'alimentation qu'il transmet au moteur. Assurez-vous que vous n'avez pas, par erreur, relié les lignes des alimentations en 5 V et en 9 V. Ces lignes doivent absolument rester séparées. Seules les lignes de masse doivent être communes.

IV - Le programme

- Définir les constantes et les variables

Créez les constantes qui définissent les broches d'entrée/sortie :

1. const int controlPin1 = 2;

2. const int controlPin2 = 3;

3. const int enablePin = 9;

4. const int directionSwicthPin = 4;

5. const int onOffSwitchStateSwitchPin = 5;

6. const int potPin = A0;

- Créer les variables qui stockent les différents états du programme

Utilisez des variables pour conserver en mémoire les valeurs de vos entrées. Vous détecterez les changements de position des deux interrupteurs en comparant leurs états respectifs entre deux passages successifs dans la boucle principale. Aussi, en plus de stocker leur position courante dans les variables onOffSwitchState (EtatInterrupteurMarcheArrêt) et directionSwitchState (EtatInterrupteurDirection), vous aurez besoin de conserver en mémoire l'état précédent de chacun des interrupteurs dans les variables previousOnOffSwitchState (EtatPrécédentInterrupteurMarcheArrêt) et previousDirectionSwitchState (EtatPrécédentInterrupteurDirection).

1. int onOffSwitchState = 0;

2. int previousOnOffSwitchState = 0;

3. int directionSwitchState = 0;

4. int previousDirectionSwitchState = 0;

- Créer les variables de commande du moteur

motorDirection (moteurDirection) garde une trace du sens de rotation du moteur, tandis que motorSpeed (moteurVitesse) garde une trace de la vitesse de rotation et motorEnabled (moteurActivé) garde une trace de l'état d'alimentation du moteur (alimenté ou éteint).

1. int motorEnabled = 0;

2. int motorSpeed = 0;

3. int motorDirection = 0;

- Déclarer les broches numériques comme entrée ou sorties

Dans setup(), définissez les directions de chacune des broches d'entrée et de sortie.

1. void setup() {

2. pinMode(directionSwitchPin, INPUT);

3. pinMode(onOffSwitchStateSwitchPin, INPUT);

4. pinMode(controlPin1, OUTPUT);

5. pinMode(controlPin2, OUTPUT);

6. pinMode(enablePin, OUTPUT);

- Éteindre le moteur

Mettre la broche enablePin (activerBroche) à l'état bas (LOW) au démarrage de l'Arduino, afin que le moteur ne se mette pas à tourner.

1. digitalWrite(enablePin, LOW);

2. }

- Lire les informations des capteurs

Dans votre loop(), lisez l'état de l'interrupteur Marche/Arrêt et stockez-le dans la variable onOffSwitchState (EtatInterrupteurMarcheArrêt). De même, lisez l'état de l'interrupteur de changement de direction et stockez-le dans la variable directionSwitchState (EtatInterrupteurDirection). Enfin, lisez la valeur aux bornes du potentiomètre afin d'en déduire une consigne de vitesse pour le moteur que vous stockerez dans la variable motorSpeed (moteurVitesse).

1. void loop() {

2. onOffSwitchState = digitalRead(onOffSwitchStateSwitchPin);

3. delay(1);

4. directionSwitchState = digitalRead(directionSwitchPin);

5. motorSpeed = analogRead(potPin)/4;

- Vérifier si l'état de l'interrupteur Marche/Arrêt a changé

Il y a seulement deux états dans lesquels un moteur peut être : Allumé ou Éteint. Ainsi, vous allez vouloir faire basculer la variable motorEnabled (moteurActivé) alternativement entre ces deux états. Dans un test SI (if), le 0 est interprété comme étant la valeur FAUX et le 1 comme étant la valeur VRAI. Nous voulons donc faire basculer alternativement la valeur de motorEnabled (moteurActivé) de 0 à 1 et vice-versa. Une manière de parvenir à ce résultat est d'utiliser l'opérateur d'inversion ! Ainsi : motorEnabled = !motorEnabled. Cet opérateur ! permet d'inverser la valeur d'une variable de VRAI à FAUX et vice-versa, un peu comme le signe - fait passer d'une valeur positive à une valeur négative.

S'il y a une différence entre l'état actuel de l'interrupteur et son état lu lors du passage précédent dans la boucle, et que l'état actuel est haut (HIGH), mettre la variable motorEnabled (moteurActivé) à 1 (VRAI, moteur Allumé). Si c'est bas (LOW), mettre la variable à 0 (FAUX, moteur Éteint).

1. if (onOffSwitchState != previousOnOffSwitchState) {

2. if (onOffSwitchState == HIGH) {

3. motorEnabled = !motorEnabled;

4. }

5. }

- Vérifier si l'état de l'interrupteur Direction a changé

Vérifiez si l'interrupteur Direction est dans une position différente de sa position lors du passage précédent dans la boucle. Si elle est différente, modifiez la valeur de la variable stockant la Direction. Comme pour Marche/Arrêt, il y a seulement deux sens dans lesquels un moteur peut tourner. Ainsi, vous allez vouloir faire basculer la variable alternativement dans deux états. Une manière de parvenir à ce résultat est d'utiliser l'opérateur d'inversion ! ainsi : motorDirection = !motorDirection.

1. if (directionSwitchState != previousDirectionSwitchState) {

2. if (directionSwitchState == HIGH) {

3. motorDirection = !motorDirection;

4. }

5. }

- Modifier la valeur de sortie de la broche pour faire tourner le moteur dans le bon sens

La variable motorDirection (moteurDirection) détermine dans quel sens le moteur tourne. Pour régler la direction, vous définissez l'état des broches de contrôle, l'une à l'état haut (HIGH) et l'autre à l'état bas (LOW). Lorsque motorDirection change, inversez l'état des broches de contrôle.

Lorsque le bouton-poussoir Direction est appuyé, vous voulez faire tourner le moteur dans l'autre sens, il faut donc inverser l'état des broches controlPin1 et controlPin2.

1. if (motorDirection == 1) {

2. digitalWrite(controlPin1, HIGH);

3. digitalWrite(controlPin2, LOW);

4. } else {

5. digitalWrite(controlPin1, LOW);

6. digitalWrite(controlPin2, HIGH);

7. }

- Moduler la vitesse de rotation du moteur s'il est activé

Si la variable motorEnabled (moteurActivé) est à VRAI (1), définissez la vitesse de rotation du moteur en utilisant analogWrite() pour envoyer un signal PWM à la broche d'Activation. Si motorEnabled (moteurActivé) est à FAUX (0), alors éteignez le moteur en positionnant avec analogWrite la valeur sur cette broche à 0.

1. if (motorEnabled == 1) {

2. analogWrite(enablePin, motorSpeed);

3. } else {

4. analogWrite(enablePin, 0);

5. }

- Enregistrer les états courants avant le prochain passage dans la boucle loop()

Avant de sortir de loop(), stockez les états actuels des interrupteurs dans les variables stockant les états précédents, pour préparer le prochain passage du programme dans la boucle loop().

1. previousDirectionSwitchState = directionSwitchState;

2. previousOnOffSwitchState = onOffSwitchState;

3. }

V - Utiliser le montage

Branchez l'Arduino à votre ordinateur. Branchez la pile sur son bornier. Lorsque vous presserez le bouton-poussoir Marche/Arrêt, le moteur devrait commencer à tourner. Si vous tournez la tige du potentiomètre, vous devriez constater que le moteur accélère ou ralentit en fonction de la valeur lue aux bornes du potentiomètre. En pressant le bouton Marche/Arrêt une seconde fois, le moteur s'arrêtera. Essayez alors l'interrupteur de Direction et vérifiez que le moteur peut tourner dans les deux sens.

Une fois que vous aurez vérifié que le circuit fonctionne correctement, déconnectez la pile et le connecteur USB du circuit.

Afin de construire votre zootrope, vous devez prendre la « roue multicolore » utilisée dans le projet précédent et découper les fentes verticales dans le bandeau fourni avec votre kit. Une fois que le CD est emboîté de manière sécurisée sur le support en forme de croix fixé sur l'arbre du moteur, branchez à nouveau la pile et le connecteur USB. Tenez votre projet en hauteur, afin que vous puissiez regarder à travers les fentes (mais assurez-vous bien que le CD est suffisamment fixé sur le support en bois du moteur et qu'il ne risque pas de se détacher. Aussi ne vous tenez pas trop près du zootrope pour ne pas vous blesser). En activant l'interrupteur Marche/Arrêt, vous devriez voir la séquence d'images fixes s'« animer » !

Si l'animation est trop rapide ou trop lente, tournez la tige du potentiomètre afin d'ajuster la vitesse de défilement des images.

Essayez d'appuyer sur le bouton poussoir de Direction afin de voir à quoi ressemble l'animation lorsqu'elle est passée à l'envers. Le zootrope et les images fournis avec le kit sont simplement un point de départ : essayez de produire vos propres animations, en utilisant le bandeau fourni comme modèle.

Pour cela, commencez par dessiner une image simple. Ensuite, effectuez de petites modifications entre chacune des images suivantes. Enfin, essayez de graduellement revenir au dessin de l'image originale afin que vous puissiez jouer l'animation en boucle, sans coupure, indéfiniment.

1. Fixez le CD sur le support en bois. Ajoutez une goutte de colle afin que le CD ne glisse pas au démarrage du moteur.

2. Utilisez les languettes pour fermer le bandeau,
et former un cercle.

3. Insérez les quatre languettes sur la base du zootrope.

4. Insérez la bande de papier avec les images à l'intérieur du zootrope.

Les zootropes fonctionnent grâce à un phénomène appelé « persistance rétinienne » (Persistence of Vision en anglais, quelquefois abrégé en POV). La POV explique l'illusion du mouvement créée lorsque nos yeux observent une succession rapide d'images fixes comportant d'infimes variations entre elles. Si vous entrez « POV display » sur un moteur de recherche, vous trouverez de très nombreux projets créés par des gens qui exploitent cet effet, et souvent à base de LED et d'un Arduino.

Construisez une base pour soutenir le moteur. Une boite de cartes à jouer avec une ouverture pratiquée sur le dessus pourra très bien servir de base, permettant de libérer vos mains pour utiliser les boutons poussoirs et le potentiomètre. Cela rendra aussi plus simple la démonstration du résultat de votre travail aux autres personnes.

Avec un peu de travail supplémentaire, vous pourrez permettre à votre zootrope de fonctionner même dans la pénombre. Branchez une LED et une résistance à l'une des broches de sortie numérique disponible sur l'Arduino. Ajoutez aussi un second potentiomètre, et connectez-le à une entrée analogique. Positionnez la LED de façon à ce qu'elle éclaire directement les images. En utilisant l'entrée analogique pour définir la fréquence du flash produit par la LED, vous réglerez le système afin que ce flash soit produit juste au moment où l'image arrive devant vos yeux. Il faudra un peu de temps pour que vous réussissiez à régler correctement les deux potentiomètres (fréquence du flash, vitesse du moteur), mais le résultat final sera vraiment spectaculaire !

VI - Note de la rédaction

Ce tutoriel est une traduction du livret d'accompagnement du kit de démarrage Arduino (document original disponible en licence Creative Commons BY-NC-SA) disponible sur le site http://astenor.free.fr/Arduino/. Le kit comprend une sélection de composants électroniques les plus courants et les plus utiles, accompagnée d'un livre de 15 projets. Depuis les bases de l'électronique, jusqu'à des projets plus complexes et intéressants, le kit vous aidera à contrôler notre monde physique avec des capteurs et des actionneurs.