[ Arduino 203] [TP] Feux de signalisation routière

Vous voilà arrivé pour votre premier TP, que vous ferez seul ! 😈 Je vous aiderai quand même un peu. Le but de ce TP va être de réaliser un feu de signalisation routière. Je vous donne en détail tout ce qu’il vous faut pour mener à bien cet objectif.

Préparation

Ce dont nous avons besoin pour réaliser ces feux.

Le matériel

Le matériel est la base de notre besoin. On a déjà utilisé 6 LED et résistances, mais elles étaient pour moi en l’occurrence toutes rouges. Pour faire un feu routier, il va nous falloir 6 LED, mais dont les couleurs ne sont plus les mêmes.

  • LED : un nombre de 6, dont 2 rouges, 2 jaune/orange et 2 vertes
  • Résistors : 6 également, de la même valeur que ceux que vous avez utilisés.
  • Arduino : une carte Arduino évidemment !

Le schéma

C’est le même que pour le montage précédent, seul la couleur des LED change, comme ceci :

Shéma TP feux de signalisation

Vous n’avez donc plus qu’à reprendre le dernier montage et changer la couleur de 4 LED, pour obtenir ceci :

Montage TP feux de signalisation
N’oubliez pas de tester votre matériel en chargeant un programme qui fonctionne ! Cela évite de s’acharner à faire un nouveau programme qui ne fonctionne pas à cause d’un matériel défectueux. On est jamais sur de rien, croyez-moi ! 😉

Énoncé de l’exercice

Le but

Je l’ai dit, c’est de réaliser des feux de signalisation. Alors, vu le nombre de LED, vous vous doutez bien qu’il faut réaliser 2 feux. Ces feux devront être synchronisés. Là encore, je vous ai préparé une belle image animée :

Le temps de la séquence

Vous allez mettre un délai de 3 secondes entre le feu vert et le feu orange. Un délai de 1 seconde entre le feu orange et le feu rouge. Et un délai de 3 secondes entre le feu rouge et le feu vert.

Par où commencer ?

D’abord, vous devez faire l’organigramme. Oui je ne vous le donne pas ! Ensuite, vous commencez un nouveau programme. Dans ce programme, vous devez définir quelles sont les broches du micro-contrôleur que vous utilisez. Puis définir si ce sont des entrées, des sorties, ou s’il y a des deux. Pour terminer, vous allez faire le programme complet dans la fonction qui réalise une boucle.

C’est parti !

Allez, c’est parti ! A vous de m’épater. 😛 Vous avez théoriquement toutes les bases nécessaires pour réaliser ce TP. En plus on a presque déjà tout fait. Mince ,j’en ai trop dit… Pendant ce temps, moi je vais me faire une raclette. 🙄 Et voici un résultat possible :

Correction !

Fini !

Vous avez fini ? Votre code ne fonctionne pas, mais vous avez eu beau cherché pourquoi, vous n’avez pas trouvé ? Très bien. Dans ce cas, vous pouvez lire la correction. Ceux qui n’ont pas cherché ne sont pas les bienvenus ici ! 😡

L’organigramme

Cette fois, l’organigramme a changé de forme, c’est une liste. Comment le lire ? De haut en bas ! Le premier élément du programme commence après le début, le deuxième élément, après le premier, etc.

  • DEBUT
  • //première partie du programme, on s’occupe principalement du deuxième feu
  • Allumer led_rouge_feux_1
  • Allumer led_verte_feux_2
  • Attendre 3 secondes
  • Éteindre led_verte_feux_2
  • Allumer led_jaune_feux_2
  • Attendre 1 seconde
  • Éteindre led_jaune_feux_2
  • Allumer led_rouge_feux_2
  • /*deuxième partie du programme, pour l’instant : led_rouge_feux_1 et led_rouge_feux_2 sont allumées; on éteint donc la led_rouge_feux_1 pour allumer la led_verte_feux_1*/
  • Attendre 3 secondes
  • Éteindre led_rouge_feux_1
  • Allumer led_verte_feux_1
  • Attendre 3 secondes
  • Éteindre led_verte_feux_1
  • Allumer led_jaune_feux_1
  • Attendre 1 seconde
  • Éteindre led_jaune_feux_1
  • Allumer led_rouge_feux_1
  • FIN

Voilà donc ce qu’il faut suivre pour faire le programme. Si vous avez trouvé comme ceci, c’est très bien, sinon il faut s’entraîner car c’est très important d’organiser son code et en plus cela permet d’éviter certaines erreurs !

La correction, enfin !

Voilà le moment que vous attendez tous : la correction ! Alors, je préviens tout de suite, le code que je vais vous montrer n’est pas absolu, on peut le faire de différentes manières

La fonction setup

Normalement ici aucune difficulté, on va nommer les broches, puis les placer en sortie et les mettre dans leur état de départ.

Secret: Réponse SelectionnerAfficher
Vous remarquerez l’utilité d’avoir des variables bien nommées.

Le code principal

Si vous êtes bien organisé, vous ne devriez pas avoir de problème ici non plus! Point trop de paroles, la solution arrive

Secret: Réponse SelectionnerAfficher
Si ça marche, tant mieux, sinon référez vous à la résolution des problèmes en annexe du cours. Ce TP est donc terminé, vous pouvez modifier le code pour par exemple changer les temps entre chaque séquence, ou bien même modifier les séquences elles-mêmes, …

Bon, c’était un TP gentillet. L’intérêt est seulement de vous faire pratiquer pour vous « enfoncer dans le crâne » ce que l’on a vu jusqu’à présent.

20 commentaires

  1. /*
    Ma solution avec des timer
    */

    Secret SelectionnerAfficher
  2. J’ai bataillé un peu, ma diode du feu rouge avait un temps mort éteinte lorsque ça bouclait, mais c’est fonctionnel.

    Je n’ai pas défini les états des DEL dans le setup, je n’y ai pas pensé ^^`

    Je poste ma solution :

    Secret SelectionnerAfficher
  3. Salut , merci pour ton tuto 🙂
    Je me demandais si mon code était propre , pourrais tu le regarder ?

    Secret SelectionnerAfficher
    • Désoler je me suis tromper de code x)

      Secret SelectionnerAfficher

      PS: Ce code marche pour moi

  4. dans ta démonstration vidéo et dans ton code le feu rouge dure 7s et non 3s comme demandé dans l’énoncé. J’ai cherché longtemps une solution a un problème insoluble (au niveau du timing, il est impossible que le feu rouge dure 3s en respectant les autres temps), mais bon j’ai bien compris que le but de l’exercice portait plus sur la programmation des feux que sur le timing exact. Sinon merci pour ton tuto il est vraiment génial !

  5. Bonsoir tout le monde,

    Je suis etudiant en elechtronique en holland. Pour un project a l ecole je dois realiser un feu de signalisation.
    Pour la programmation j’utilise le Controllino Mega qui se programme tout comme le arduino.
    J ai un soucis avec mon programme, j aimerai introduire differents parametres a executer.
    Est ce possible de creer plusieurs paramatres dans le void loop?

    Ci-desous une partie de mon programme:

    void loop() {
    changement_de_feux1();
    changement_de_feux2();
    changement_de_feux3();
    changement_de_feux4();
    changement_de_feux_pieton();
    }

    void changement_de_feux1() {

    // conditions a executer
    }

    ainsi de suite pour les autres….

    Merci de bien vouloir m aider.

    Armicalement

  6. Bonjour Eskimon,
    je commence tout juste a suivre tes tutos,
    vraiment excellent !!!!
    mon cerveau a un peu bouillit pendant la phase d’assimilations des bases, mais ca va j’essai de m’en sortir 🙂
    j’ai commandé la liste de mes effets et ma carte arduino, du coup je m’exerce un peu sans mes effets (loool), avec la fonction « vérifier » pour voir s’il y a pas d’erreurs,

    je t’envoi mon TP 😀
    pour que tu vois s’il est bon :s

    encore merci à toi,
    tu es un excellent professeur,

    debut:

    const int led1 = 1; // led rouge feux 1
    const int led2 = 2; // led jaune feux 1
    const int led3 = 3; //led vert feux 1
    const int led4 = 4; // led rouge feux 2
    const int led5 = 5; // led jaune feux 2
    const int led6 = 6; // led vert feux 2

    void setup() {
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(led3, OUTPUT);
    pinMode(led4, OUTPUT);
    pinMode(led5, OUTPUT);
    pinMode(led6, OUTPUT);

    digitalWrite(led4, HIGH);

    }

    void loop() {

    if(digitalRead(led4)== HIGH);
    {
    digitalWrite(led3, HIGH);
    delay(3000);
    digitalWrite(led3, LOW);

    digitalWrite(led2, HIGH);
    delay(1000);
    digitalWrite(led2, LOW);

    digitalWrite(led1, HIGH);
    delay(1000);
    digitalWrite(led4, LOW);

    }

    if(digitalRead(led1)== HIGH);

    {
    digitalWrite(led6, HIGH);
    delay(3000);
    digitalWrite(led6, LOW);

    digitalWrite(led5, HIGH);
    delay(1000);
    digitalWrite(led5, LOW);

    digitalWrite(led4, HIGH);
    delay(1000);
    digitalWrite(led1, LOW);

    }
    }

  7. Bon à croire que je suis un gros feignant à crée des fonctions ^^

    Mon code:

    const char L_R1 = 2;
    const char L_O1 = 3;
    const char L_V1 = 4;
    const char L_R2 = 5;
    const char L_O2 = 6;
    const char L_V2 = 7;

    void setup() {

    pinMode(L_R1, OUTPUT);
    pinMode(L_O1, OUTPUT);
    pinMode(L_V1, OUTPUT);
    pinMode(L_R2, OUTPUT);
    pinMode(L_O2, OUTPUT);
    pinMode(L_V2, OUTPUT);

    digitalWrite(L_R1, LOW);
    digitalWrite(L_O1, HIGH);
    digitalWrite(L_V1, HIGH);
    digitalWrite(L_R2, HIGH);
    digitalWrite(L_O2, HIGH);
    digitalWrite(L_V2, LOW);
    }

    void loop() {

    Feu(L_R2, L_O2, L_V2);
    delay(3000);
    Feu(L_R1, L_O1, L_V1);
    delay(3000);

    }

    void Feu(char rouge, char orange, char vert){

    digitalWrite(rouge, HIGH);
    digitalWrite(vert, LOW);
    delay(3000);

    digitalWrite(orange, LOW);
    digitalWrite(vert, HIGH);
    delay(1000);

    digitalWrite(orange, HIGH);
    digitalWrite(rouge, LOW);

    }

  8. Bonjour,

    Vous avez inversé les lignes 4/5 , 10/11, 16/17 pour les déclarations des I/O dans votre solution.

    Mon code :

    const int led1Verte = 7;
    const int led1Orange = 6;
    const int led1Rouge = 5;
    const int led2Verte = 4;
    const int led2Orange = 3;
    const int led2Rouge = 2;

    void setup() {

    pinMode(led1Verte, OUTPUT);
    pinMode(led1Orange, OUTPUT);
    pinMode(led1Rouge, OUTPUT);
    pinMode(led2Verte, OUTPUT);
    pinMode(led2Orange, OUTPUT);
    pinMode(led2Rouge, OUTPUT);

    digitalWrite(led1Verte, LOW);
    digitalWrite(led1Orange, LOW);
    digitalWrite(led1Rouge, LOW);
    digitalWrite(led2Verte, LOW);
    digitalWrite(led2Orange, LOW);
    digitalWrite(led2Rouge, LOW);

    }

    void loop()

    {

    //feu 1
    digitalWrite(led1Verte, HIGH);
    digitalWrite(led1Rouge, LOW);
    delay(3000);
    digitalWrite(led1Orange, HIGH);
    digitalWrite(led1Verte, LOW);
    delay(1000);
    digitalWrite(led1Rouge, HIGH);
    digitalWrite(led1Orange, LOW);
    delay(1000);
    //Feu 2
    digitalWrite(led2Verte, HIGH);
    digitalWrite(led2Rouge, LOW);
    delay(3000);
    digitalWrite(led2Orange, HIGH);
    digitalWrite(led2Verte, LOW);
    delay(1000);
    digitalWrite(led2Rouge, HIGH);
    digitalWrite(led2Orange, LOW);
    delay(1000);
    }

    Cordialement

Laisser un commentaire