28 Février 2014
Arduino leçon 9 : feu tricolore
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.
tableau des phases
| phases | V1 | O1 | R1 | V2 | O2 | R2 | durée |
| 0 | 1 | 0 | 0 | 0 | 0 | 1 | 25 |
| 1 | 0 | 1 | 0 | 0 | 0 | 1 | 3 |
| 2 | 0 | 0 | 1 | 0 | 0 | 1 | 4 |
| 3 | 0 | 0 | 1 | 1 | 0 | 0 | 25 |
| 4 | 0 | 0 | 1 | 0 | 1 | 0 | 3 |
| 5 | 0 | 0 | 1 | 0 | 0 | 1 | 4 |
| 0 | 1 | 0 | 0 | 0 | 0 | 1 | 25 |
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)
tableau des phases
à vous de le compléter
| V1 | O1 | R1 | V2 | R2 | duré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