Programmation Arduino pour les débutants: le contrôleur de feux de circulation

La semaine dernière, nous avons découvert la structure de base d'un programme Arduino et nous avons examiné de plus près l'exemple de «clignotement». J'espère que vous avez saisi l'occasion d'expérimenter avec le code, en ajustant les horaires.

La semaine dernière, nous avons découvert la structure de base d'un programme Arduino et nous avons examiné de plus près l'exemple de «clignotement».  J'espère que vous avez saisi l'occasion d'expérimenter avec le code, en ajustant les horaires.
Publicité

Le feu de circulation est un petit projet amusant, qui peut être complété en moins d'une heure. Apprenez à construire votre propre - en utilisant un Arduino - et comment modifier le circuit pour un modèle avancé.

Ne vous inquiétez pas si vous n'avez jamais utilisé d'Arduino auparavant, nous avons un guide pour débutants Initiation à Arduino: Guide du débutant Initiation à Arduino: un guide pour débutants Arduino est une plate-forme de prototypage électronique open source basée sur un utiliser du matériel et des logiciels. Il est destiné aux artistes, designers, amateurs et toute personne intéressée par la création d'objets ou d'environnements interactifs. Lire la suite .

Note : Ceci est le dernier d'une série de tutoriels de niveau débutant pour Arduino, la plate-forme de prototypage électronique open source. Voici une liste des articles précédents de la série:

  • Qu'est-ce que Arduino et que pouvez-vous faire avec Qu'est-ce que Arduino et que pouvez-vous faire avec? Qu'est-ce que Arduino et que pouvez-vous faire avec? L'Arduino est un petit appareil électronique remarquable, mais si vous n'en avez jamais utilisé auparavant, que sont-ils exactement, et que pouvez-vous faire avec un? Lire la suite
  • Qu'est-ce qu'un kit de démarrage Arduino et que contient-il? Qu'est-ce qui est inclus dans un kit de démarrage Arduino? [MakeUseOf explique] Qu'est-ce qui est inclus dans un kit de démarrage Arduino? [MakeUseOf Explains] J'ai déjà présenté le matériel open-source Arduino ici sur MakeUseOf, mais vous aurez besoin de plus que de l'Arduino pour en faire quelque chose et commencer réellement. Arduino "kits de démarrage" sont ... En savoir plus
  • Plus de composants agréables à acheter avec votre kit de démarrage 8 composants plus cool pour vos projets Arduino 8 composants plus cool pour vos projets Arduino Donc, vous envisagez d'obtenir un kit de démarrage Arduino, mais vous vous demandez si quelques LED et résistances de base vont être assez pour vous tenir occupé pour le week-end? Probablement pas. Voici un autre 8 ... Lire la suite
  • Premiers pas avec votre kit de démarrage Arduino - Installation des pilotes et configuration de la carte et du port Premiers pas avec votre kit de démarrage Arduino - Installation des pilotes et configuration de la carte et du port Mise en route de votre kit de démarrage Arduino - Installation des pilotes et configuration Port Donc, vous avez acheté vous-même un kit de démarrage Arduino, et éventuellement d'autres composants cool aléatoire - et maintenant? Comment avez-vous réellement commencé à programmer cette chose Arduino? Comment le configurer ... Lire la suite
  • Un regard plus attentif sur la structure d'une application Arduino et le programme Exemple Blink

De quoi as-tu besoin

En dehors de l'Arduino de base, vous aurez besoin de:

  • LED rouges, jaunes et vertes.
  • Une planche à pain
  • 6 x 220? résistances.
  • Câbles de connexion.
  • 1 x interrupteur à bouton-poussoir.
  • 1 x 10k? résistance

Presque n'importe quel Arduino sera approprié, pourvu qu'il ait assez de broches. Assurez-vous de lire notre guide d'achat Arduino Guide d'achat: Quel conseil devriez-vous obtenir? Guide d'achat Arduino: Quel conseil devriez-vous obtenir? Il y a tellement de différents types de cartes Arduino là-bas, vous seriez pardonné d'être confus. Lequel devriez-vous acheter pour votre projet? Laissez-nous vous aider, avec ce guide d'achat Arduino! Lire la suite si vous n'êtes pas sûr du modèle dont vous avez besoin. Vous avez probablement ces pièces dans votre kit de démarrage. Que contient votre kit de démarrage Arduino? [Arduino Débutants] Qu'y a-t-il dans votre kit de démarrage Arduino? [Arduino Débutants] Face à une boîte pleine de composants électroniques, il est facile d'être débordé. Voici un guide pour exactement ce que vous trouverez dans votre kit. Lire plus déjà.

Un exemple simple

Commençons petit. Un feu de circulation simple et basique est un bon point de départ. Voici le circuit:

arduino_traffic_light

Connectez l'anode (jambe longue) de chaque LED aux broches numériques huit, neuf et dix (via une résistance de 220?). Connectez les cathodes (jambe courte) à la terre Arduino.

J'ai utilisé Fritzing pour dessiner ces diagrammes. Non seulement c'est facile à utiliser, c'est gratuit!

Le code

Commencez par définir les variables afin que nous puissions traiter 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 setup, où allons-nous configurer les LEDs rouges, jaunes et vertes pour qu'elles soient sorties. Puisque vous avez créé des variables pour représenter les numéros de broche, vous pouvez maintenant vous référer aux broches par leur nom à la place.

 void setup(){ pinMode(red, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT); } 

C'était facile. Maintenant, pour la partie difficile - la logique réelle d'un feu de circulation. Créez une fonction séparée pour changer les lumières (vous verrez pourquoi plus tard).

Lorsque vous commencez à programmer pour la première fois, le code lui-même est très rudimentaire - il s'agit de trouver les détails de la logique qui posent le plus gros problème. La clé pour être un bon programmeur est d'être capable de regarder n'importe quel processus, et de le décomposer en ses étapes fondamentales. Voici le reste du code:

 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); } 

Terminé! Maintenant, téléchargez et exécutez (assurez-vous de sélectionner la carte et le port corrects dans Outils > Port et Outils > Menus de la carte). Vous devriez avoir un feu de circulation qui change toutes les 15 secondes, comme ceci (accéléré):

Un passage pour piétons

Maintenant que vous connaissez les bases, améliorons-le. Ajoutez un bouton-poussoir pour que les piétons puissent changer la lumière quand ils le souhaitent:

arduino_traffic_light_with_button

Notez que le feu de circulation est exactement le même que l'exemple précédent. Connectez le bouton à la broche numérique 12. Vous remarquerez que le commutateur a une haute impédance 10k? résistance attachée à elle, et vous demandez peut-être pourquoi. C'est ce qu'on appelle une résistance pull-down. C'est un concept difficile à saisir au début, mais supporter avec moi.

Un commutateur laisse passer le courant ou ne le fait pas. Cela semble assez simple, mais dans un circuit logique, le courant devrait toujours circuler dans un état haut ou bas (rappelez-vous - 1 ou 0, haut ou bas). Vous pourriez supposer qu'un bouton poussoir qui n'est pas réellement poussé serait défini comme étant dans un état bas, mais en fait il est dit être 'flottant', car aucun courant n'est dessiné du tout.

Dans cet état flottant, il est possible qu'une lecture erronée se produise car elle fluctue avec des interférences électriques. En d'autres termes, un commutateur flottant n'offre ni une lecture fiable ni une lecture d'état bas. Une résistance de rappel permet de maintenir une petite quantité de courant 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 pull-up à la place - cela fonctionne sur le même principe, mais à l'inverse, en s'assurant que la porte logique particulière par défaut à haute.

Maintenant, dans la partie boucle du code, au lieu de changer les lumières toutes les 15 secondes, nous allons lire l'état du bouton poussoir à la place, et seulement changer les lumières quand il est activé.

Le code

Commencez par ajouter une nouvelle variable au début du programme:

 int button = 12; // switch is on pin 12 

Maintenant, dans la fonction d'installation, ajoutez une nouvelle ligne pour déclarer le commutateur comme une entrée. J'ai également ajouté une seule ligne pour démarrer les feux de circulation dans la scène verte. Sans ce paramètre initial, ils seraient désactivés, jusqu'à ce qu'un changement de taille () ait été initié en utilisant une fonction pour la première fois.

 pinMode(button, INPUT); digitalWrite(green, HIGH); 

Modifier la fonction de boucle entière à la place 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 le bouton est coché deux fois ( digitalRead (bouton) ), séparé par un petit délai. C'est ce qu'on appelle le debouncing. Tout comme la résistance de tirage était nécessaire pour le bouton, cette simple vérification arrête le code détectant les interférences mineures en appuyant sur un bouton. Vous n'avez pas à le faire (et cela fonctionnerait probablement très bien sans cela), mais c'est une bonne pratique.

En attendant dans l'instruction if pendant 15 secondes, les feux de circulation ne peuvent pas changer pendant au moins cette durée. Une fois 15 secondes écoulées, la boucle redémarre. A chaque redémarrage de la boucle, relisez l'état du bouton, mais si vous ne le pressez pas, l'instruction if ne s'active jamais, les lumières ne changent jamais et redémarre simplement.

Voici à quoi cela ressemble (accéléré):

Une jonction

Essayons un modèle plus avancé. Au lieu d'un passage pour piétons, modifiez votre circuit pour avoir deux feux de circulation:

arduino_dual_traffic_light

Connectez le deuxième feu aux broches numériques 11, 12 et 13.

Le code

Tout d'abord, attribuez vos nouvelles broches de feux de circulation aux variables, et configurez-les comme des sorties, tout comme dans le premier exemple:

 // light one int red1 = 10; int yellow1 = 9; int green1 = 8; // light two int 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, tout le travail est effectué dans la fonction changeLights () . Plutôt que d'aller en rouge > rouge et jaune > vert, ce code alternera les feux de circulation. Quand l'un est vert, l'autre sera 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é):

C'est tout pour cette fois, alors j'espère que vous avez appris beaucoup et que vous vous êtes amusé à écrire à partir de rien. Vous avez les mains sales avec quelques LED et résistances, ainsi que l'ajout d'un interrupteur avec une résistance de tirage vers le bas - j'espère que vous avez compris pourquoi nous en avons besoin. Jouez avec le code, ajustez-le, et surtout amusez-vous. Si vous faites des ajouts ou des modifications, pourquoi ne pas nous en informer dans les commentaires?

Crédit d'image: androsvector via Shutterstock.com

In this article