28 Février 2014


Arduino leçon 9 : feu tricolore

Aujourd'hui pas de nouveau matériel mais une nouvelle notion très importante : la phase ou étape.
pas FB

1er programme

matériel :
        6 led (2 rouges, 2 vertes, 2 jaunes)
        6 résistances d'environ 300 ohms

Nous allons d'abord simuler un système de feu tricolore.
2 groupes de 3 led (vert, orange, rouge) représenteront les feux de 2 voies qui se coupent.
on choisira un cycle d'une minute :
    - 25 secondes au vert (5 pendant la mise au point)
    -   3 secondes à l'orange (1 pendant la mise au point)
    - 32 secondes au rouge (7 pendant la mise au point)

Il ne faudra pas utiliser la fonction delay();
On utilisera les sorties 2-3-4 et 7-8-9 d'Arduino pour Vert-Orange-Rouge de chaque feu.
Au départ, le feu de gauche sera au vert pendant 25 secondes.

feu rouge

tableau des phases

phasesV1O1R1V2 O2R2durée
010000125
10100013
20010014
300110025
40010103
50010014
010000125

Ce tableau nous permet de voir ca qui change entre chaque phase : c'est chaque fois une led qui s'éteint et une autre qui s'allume. Les 2 concernent le même feu. C'est ce changement que nous devrons programmer.
On fera les essais en remplaçant 25 secondes par 5 secondes et les autres valeurs par 1 seconde.
On mettra les vrais valeurs après la mise au point.

le programme

Nous utilisons une variable contenant l'heure prévue du prochain changement de phase.
Dans la boucle, on comparera cette valeur à l'heure actuelle pour savoir si on doit appeler le sous-programme de changement de phase et on ne fera rien d'autre.
Le sous-programme changePhase() fera varier l'état des leds selon le tableau ci-dessus.


                    /* feu_rouge.ino
                          gestion des feux d'un croisement */
         
          #define V1 2
          #define O1 3
          #define R1 4
          #define V2 7
          #define O2 8
          #define R2 9
         
          byte i;
          byte phase=0; // numéro de la phase en cours
          long finPhase; // heure de fin de la phase en cours
          void changePhase(void); // déclaration de fonction
         
          void setup() {
                    for ( i=2 ; i<10 ; i++){
                              pinMode( i, OUTPUT);
                              digitalWrite( i, LOW);
                    }
                    digitalWrite(V1, HIGH);
                    digitalWrite(R2, HIGH);
                    finPhase=millis() + 5000;       // 25000 après la mise au point
          }
         
          void loop () {
                    if ( millis()>= finPhase) {
                          phase=phase+1 % 6 ; // % est le signe de 'modulo'
                          changePhase();
                    }
                }
          }
         
          void changePhase(void) {
                switch (phase) {
                case 0 :
                    digitalWrite(R1, LOW);
                    digitalWrite(V1, HIGH);
                    finPhase=millis() + 5000;       // 25000 après la mise au point
                    break;
                case 1 :
                    digitalWrite(V1, LOW);
                    digitalWrite(O1, HIGH);
                    finPhase=millis() + 1000;       // 3000 après la mise au point
                    break;
                case 2 :
                    digitalWrite(O1, LOW);
                    digitalWrite(R1, HIGH);
                    finPhase=millis() + 1000;       // 4000 après la mise au point
                    break;
                case 3 :
                    digitalWrite(R2, LOW);
                    digitalWrite(V2, HIGH);
                    finPhase=millis() + 5000;       // 25000 après la mise au point
                    break;
                case 4 :
                    digitalWrite(V2, LOW);
                    digitalWrite(O2, HIGH);
                    finPhase=millis() + 1000;       // 3000 après la mise au point
                    break;
                case 5 :
                    digitalWrite(O2, LOW);
                    digitalWrite(R2, HIGH);
                    finPhase=millis() + 1000;       // 4000 après la mise au point
                    }
          }

2ème programme

matériel :
        5 led
        5 résistances 270 ohms
        1 résistance 10 kohms
        1 bouton poussoir

Encore un feu, mais différent. Sur une voie sans carrefour, un feu protège un passage piétons.
Le feu piéton n'a pas d'orange et est commandé par un bouton.
En temps normal le feu pour les voitures est au vert et le feu piétons au rouge.
Lors de l'appui sur le bouton :
- le feu voitures passe à l'orange
- après 3 secondes, il passe au rouge
- après 2 secondes, le feu piéton passe au vert
- après 25 secondes, il clignote
- après 3 secondes, il passe au rouge
- après 2 secondes, le feu voitures passe au vert
On pourra utiliser delay() pendant le clignotement du feu vert piéton. ( 3 cycles d'un seconde)

feu piéton

tableau des phases

à vous de le compléter

V1O1R1 V2R2durée
0.....oo
1.....3
2.....4
3.....25
4...cligno.3
5.....1
0.....oo

Le programme


                    /*             feu_pieton.ino
                          gestion d'un feu pour passage piéton */
         
          #define V1 2
          #define O1 3
          #define R1 4
          #define V2 7
          #define R2 8
          #define bouton 19
          // on choisit la broche 19 car elle a une particularité qui nous servira bientôt
         
          byte i;
          byte phase=0; // numéro de la phase en cours
          long finPhase; // heure de fin de la phase en cours
          void changePhase(void); // déclaration de fonction
          void cligno(void); // déclaration de fonction
         
          void setup() {
                    for ( i=2 ; i<10 ; i++){
                              pinMode( i, OUTPUT);
                              digitalWrite( i, LOW);
                    }
                    digitalWrite(V1, HIGH);
                    digitalWrite(R2, HIGH);
          }
         
          void loop () {
                    if ( phase==0 & digitalRead(bouton)==1 ) {
                    // quand le cycle est lancé, on ignore nouvel appui sur bouton
                              phase=1;
                              finPhase = millis() + 3000;
                              changePhase();
                    }
                    if ( phase > 0 ) {
                              if ( millis()>= finPhase) {
                                        phase=phase+1 % 6 ; // % est le signe de 'modulo'
                                        changephase();
                            }
                    }
          }
         
          void changePhase(void) {
                switch (phase) {
                case 0 :
                    digitalWrite(R1, LOW);
                    digitalWrite(V1, HIGH);
                    break;
                case 1 :
                    digitalWrite(V1, LOW);
                    digitalWrite(O1, HIGH);
                    finPhase=millis() + 1000;
                    break;
                case 2 :
                    digitalWrite(O1, LOW);
                    digitalWrite(R1, HIGH);
                    finPhase=millis() + 1000;
                    break;
                case 3 :
                    digitalWrite(R2, LOW);
                    digitalWrite(V2, HIGH);
                    finPhase=millis() + 5000;
                    break;
                case 4 :
                    cligno();
                    break;
                case 5 :
                    digitalWrite(R2, HIGH);
                    finPhase=millis() + 1000;
                    break;
                    }
          }
          void cligno(void) {
                    for ( i=0 ; i<3 ; i++){
                              digitalWrite(V2, LOW);
                              delay(500);
                              digitalWrite(V2, HIGH);
                              delay(500);
                    }
                    digitalWrite(V2, LOW);
          }
         

Comprenez bien ce programme : on en aura à nouveau besoin dans la prochaine leçon.
On utilisera le même montage.





haut de la page
flèche gauche Page Précédente : les fobctions           Page Suivante : les interruptions flèche droite

Valid XHTML 1.0 Transitional