Le feu tricolore Arduino est un petit projet amusant que vous pouvez construire en moins d’une heure. Voici comment construire le vôtre à l’aide d’un Arduino et comment changer le circuit pour une variante avancée.
Si vous préférez regarder ce tutoriel sous forme de vidéo, nous avons ce qu’il vous faut :
Ce dont vous avez besoin pour construire un contrôleur de feux tricolores Arduino
Outre l’Arduino de base, vous aurez besoin de :
- 1 résistance de 10 kohms
- 1 x interrupteur à bouton-poussoir
- 6 résistances de 220 ohms
- Une planche à pain
- Fils de connexion
- LED rouges, jaunes et vertes
Presque tous les Arduino fonctionneront pour ce projet, à condition qu’ils aient suffisamment de broches. Assurez-vous de lire notre guide d’achat Arduino si vous n’êtes pas sûr du modèle dont vous avez besoin. Vous avez peut-être déjà ces pièces dans votre kit de démarrage Arduino.
Feu de circulation Arduino : les bases
Commençons petit. Un feu de circulation simple et basique est un bon point de départ. Voici le circuit :

Connectez l’anode (jambe longue) de chaque LED aux broches numériques huit, neuf et dix (via une résistance de 220 ohms). Connectez les cathodes (jambe courte) à la masse de l’Arduino.
Code pour le feu de circulation Arduino
Commencez par définir des variables afin de pouvoir adresser les lumières par leur nom plutôt que par un numéro. Démarrez un nouveau projet Arduino et commencez par ces lignes :
int red = 10;int yellow = 9;int green = 8;
Ensuite, ajoutons la fonction de configuration, où vous configurerez les LED rouges, jaunes et vertes comme sorties. Puisque vous avez créé des variables pour représenter les numéros de broches, vous pouvez désormais faire référence aux broches par leur nom à la place :
void setup(){ pinMode(red, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT);}
le PinMode configure l’Arduino pour utiliser une broche donnée comme sortie. Vous devez le faire pour que vos LED fonctionnent. Passons maintenant à la logique réelle du feu de circulation. Voici le code dont vous avez besoin. Ajoutez ceci sous vos définitions de variables et votre fonction de configuration :
void loop(){ changeLights(); delay(15000);}void changeLights(){ // green off, yellow on for 3 seconds digitalWrite(green, LOW); digitalWrite(yellow, HIGH); delay(3000); // turn off yellow, then turn red on for 5 seconds digitalWrite(yellow, LOW); digitalWrite(red, HIGH); delay(5000); // red and yellow on for 2 seconds (red is already on though) digitalWrite(yellow, HIGH); delay(2000); // turn off red and yellow, then turn on green digitalWrite(yellow, LOW); digitalWrite(red, LOW); digitalWrite(green, HIGH); delay(3000);}
Téléchargez ce code sur votre Arduino et exécutez (assurez-vous de sélectionner la bonne carte et le bon port dans le Outils > Conseil et Outils > Port menus). Vous devriez avoir un feu de circulation fonctionnel qui change toutes les 15 secondes, comme celui-ci (accéléré):

Décomposons ce code. le changerLumières fonction effectue tout le travail acharné. Cela fait tourner le feu de signalisation en passant par le jaune et le rouge, puis de nouveau au vert. Comme cela s’appelle à l’intérieur du boucler fonction, l’Arduino exécutera ce code pour toujours, avec une pause de 15 secondes à chaque fois.
le changerLumières fonction se compose de quatre étapes distinctes :
- Vert allumé, jaune éteint
- Jaune éteint, rouge allumé
- Jaune allumé, rouge allumé
- Vert allumé, rouge éteint, jaune éteint
Ces quatre étapes reproduisent le processus utilisé dans les vrais feux de circulation. Pour chaque étape, le code est très similaire. La LED appropriée s’allume ou s’éteint à l’aide de numériqueÉcrire. Il s’agit d’une fonction Arduino utilisée pour régler les broches de sortie sur HIGH (pour on) ou LOW (pour off).
Après avoir activé ou désactivé les LED requises, le retard fait attendre l’Arduino pendant un certain temps. Trois secondes dans ce cas.
Aller plus loin : passage piéton Arduino
Maintenant que vous connaissez les bases, améliorons-le. Ajoutez un bouton poussoir pour que les piétons changent de lumière quand ils le souhaitent :

Remarquez comment le feu de circulation est exactement le même que dans l’exemple précédent. Connectez le bouton à la broche numérique 12. Vous remarquerez que le commutateur est doté d’une résistance à haute impédance de 10 kohms, et vous vous demandez peut-être pourquoi. Il s’agit d’une résistance pull-down.
Un interrupteur laisse passer le courant ou non. Cela semble assez simple, mais dans un circuit logique, le courant doit toujours circuler dans un état haut ou bas (rappelez-vous, 1 ou 0, HIGH ou LOW). Vous pourriez supposer qu’un interrupteur à bouton-poussoir qui n’est pas réellement enfoncé serait dans un état BAS, mais en fait, on dit qu’il est “flottant”, car aucun courant n’est tiré du tout.
Dans cet état flottant, il est possible qu’une fausse lecture se produise car elle fluctue avec les interférences électriques. En d’autres termes, un interrupteur flottant ne donne ni une lecture HAUTE ni BASSE fiable. Une résistance pull-down maintient une petite quantité de courant circulant lorsque l’interrupteur est fermé, assurant ainsi une lecture précise de l’état bas.
Dans d’autres circuits logiques, vous pouvez trouver une résistance de rappel à la place, et cela fonctionne sur le même principe, mais en sens inverse, en s’assurant que la porte logique particulière est par défaut élevée.
Maintenant, dans la partie boucle du code, au lieu de changer les lumières toutes les 15 secondes, vous allez plutôt lire l’état du bouton-poussoir et ne changer les lumières que lorsqu’il est activé.
Code pour le passage piéton Arduino
Commencez par ajouter une nouvelle variable pour stocker votre épingle de bouton :
int button = 12; // switch is on pin 12
Maintenant, dans la fonction de configuration, ajoutez une nouvelle ligne pour déclarer le commutateur comme entrée. Ajoutez une ligne pour régler les feux de circulation sur la scène verte. Sans ce réglage initial, ils s’éteindraient jusqu’à la première fois changerLumières court.
pinMode(button, INPUT);digitalWrite(green, HIGH);
Remplacez la fonction de boucle entière par la suivante :
void loop() { if (digitalRead(button) == HIGH){ delay(15); // software debounce if (digitalRead(button) == HIGH) { // if the switch is HIGH, ie. pushed down - change the lights! changeLights(); delay(15000); // wait for 15 seconds } }}
Ça devrait le faire. Vous vous demandez peut-être pourquoi la vérification des boutons se produit deux fois (lecture numérique (bouton)), séparés par un petit retard. C’est anti-rebond. Tout comme la résistance pull-down pour le bouton, cette simple vérification empêche le code de détecter des interférences mineures en appuyant sur un bouton.
En attendant à l’intérieur du si déclaration pendant 15 secondes, les feux de circulation ne peuvent pas changer pendant au moins cette durée. Une fois les 15 secondes écoulées, la boucle redémarre. A chaque redémarrage de la boucle, il relit l’état du bouton, mais s’il n’est pas pressé, le si l’instruction ne s’active jamais, les lumières ne changent jamais et le programme redémarre à nouveau.
Voici à quoi cela ressemble (accéléré):

Feu de circulation Arduino avec jonction
Essayons un modèle plus avancé. Au lieu d’un passage pour piétons, changez votre circuit pour avoir deux feux tricolores :

Connectez le deuxième feu aux broches numériques 11, 12 et 13.
Code pour le feu de circulation Arduino avec jonction
Tout d’abord, affectez vos nouvelles broches de feux tricolores à des variables et configurez-les en tant que sorties, comme dans le premier exemple :
// light oneint red1 = 10;int yellow1 = 9;int green1 = 8;// light twoint red2 = 13;int yellow2 = 12;int green2 = 11;void setup(){ // light one pinMode(red1, OUTPUT); pinMode(yellow1, OUTPUT); pinMode(green1, OUTPUT); // light two pinMode(red2, OUTPUT); pinMode(yellow2, OUTPUT); pinMode(green2, OUTPUT);}
Maintenant, mettez à jour votre boucle pour utiliser le code du premier exemple (au lieu du passage pour piétons) :
void loop(){ changeLights(); delay(15000);}
Encore une fois, tous les travaux sont effectués dans le changerLumières une fonction. Plutôt que d’aller rouge > rouge & Jaune > vert, ce code alternera les feux de circulation. Quand l’un est au vert, l’autre est au rouge. Voici le code :
void changeLights(){ // turn both yellows on digitalWrite(green1, LOW); digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); delay(5000); // turn both yellows off, and opposite green and red digitalWrite(yellow1, LOW); digitalWrite(red1, HIGH); digitalWrite(yellow2, LOW); digitalWrite(red2, LOW); digitalWrite(green2, HIGH); delay(5000); // both yellows on again digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); digitalWrite(green2, LOW); delay(3000); // turn both yellows off, and opposite green and red digitalWrite(green1, HIGH); digitalWrite(yellow1, LOW); digitalWrite(red1, LOW); digitalWrite(yellow2, LOW); digitalWrite(red2, HIGH); delay(5000);}
Voici à quoi cela ressemble (accéléré):

Étapes suivantes du feu de signalisation Arduino
C’est tout pour aujourd’hui. Votre nouvelle compréhension des LED et des boutons Arduino s’applique à toutes sortes de projets différents. Si vous souhaitez étendre ces feux de circulation, pourquoi ne pas construire un carrefour à quatre voies (ou plus), avec de nombreux passages pour piétons et des feux de signalisation pour piétons ? Vous pouvez programmer facilement de nombreuses cartes Arduino différentes !
Ou pourquoi ne pas développer vos nouvelles compétences avec un projet plus important tel que ce contrôleur MIDI DIY ou ce robot Arduino avec Xod ? Vous pouvez également jeter un œil au codage Arduino avec VS Code et PlatformIO.
Crédit d’image : androsvector/Shutterstock