Raffaele Ilardo


Semaforo bidirezionale con Arduino
modalità standard o con luci gialle lampeggianti


© La parziale riproduzione dei contenuti di questa pagina è consentita a patto di citare l'indirizzo del sito e l'autore.


Le simulazioni del funzionamento di un semaforo tramite la piattaforma Arduino sono sicuramente tante; il progetto descritto in questa pagina è forse un tantino diverso, sia come realizzazione hardware, sia perchè consente di scegliere tra due modalità di funzionamento: il funzionamento o "mode" standard ed il funzionamento con sole luci gialle lampeggianti.

schema di semaforo bidirezionale per piattaforma arduino
figura 1
Premetto che nella simulazione si è voluto riprodurre il semaforo di un incrocio: i led sono quindi divisi in due gruppi, il rosso, il giallo ed il verde di una direzione, indicati nello sketch come red1, yel1 e gre1, e, per l'altro senso di marcia, i led red2, yel2 e gre2. Come logico, quando ad esempio il led verde 1 è acceso, sarà acceso anche il led rosso 2 che controlla il flusso del traffico in senso trasversale al primo.
Naturalmente, chi volesse realizzare l'impianto completo, per esempio in ambito modellistico, dovrà semplicemente raddoppiare i due gruppi di led, collegando quelli aggiunti in parallelo ai primi.
Dal punto di vista hardware, siccome per ogni gruppo di led quello acceso è sempre uno solo, ho preferito usare, per ciascun gruppo, una sola resistenza comune.

Lo schema del progetto è riportato in figura 1. Come già accennato, per ciascun gruppo di led è stata usata una sola resistenza; il suo valore è di 220 ohm.
Notiamo la presenza dello switch "mode" (un comune interruttore), che permette appunto di passare dal funzionamento standard con l'abituale sequenza verde, giallo, rosso, al funzionamento con sole luci gialle lampeggianti.

Ed ecco il codice da caricare nella memoria di Arduino:

#define red1 13
#define yel1 12
#define gre1 11
#define red2 7
#define yel2 6
Breve commento al codice:

- inizialmente vengono attribuiti i nomi da red1 a gre2 ai sei pin che comandano i led

- vengono poi definite la costante booleana "mode" e la costante multip; tale costante agisce da moltiplicatore: aumentando il suo valore, la durata dei cicli del semaforo aumenta

- i sei pin interessati vengono poi definiti come OUTPUT

- con mode = digitalRead(2); viene letto il pin 2 per attribuire un valore alla costante "mode": se l'interruttore mode-switch è chiuso, la costante "mode" assume valore 1; in caso contrario, la costante "mode" vale zero

-se è mode=1, viene eseguita tutta la sequenza verde, rosso, giallo

- se è mode=0 vengono eseguite le sole istruzioni che fanno lampeggiare i led gialli

Attenzione: nel passare dalla modalità standard a quella con giallo lampeggiante, occorre attendere alcuni secondi prima che il ciclo si stabilisca in modo regolare
#define gre2 5
boolean mode=0;
int multip=3;

void setup() {
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
piccolo manuale di elettronica applicata
reading boy

void loop() {

mode = digitalRead(2);

if (mode==1){

digitalWrite(red2, HIGH);
digitalWrite(red1, LOW);
digitalWrite(gre1, HIGH);
delay(1000*multip);

digitalWrite(gre1, LOW);
digitalWrite(yel1, HIGH);
delay(200*multip);

digitalWrite(yel1, LOW);
digitalWrite(gre1, LOW);
digitalWrite(red1, HIGH);
digitalWrite(red2, LOW);
digitalWrite(gre2, HIGH);
delay(1000*multip);

digitalWrite(gre2, LOW);
digitalWrite(yel2, HIGH);
delay(200*multip);

digitalWrite(yel2, LOW);
}

if (mode==0){

digitalWrite(red1, LOW);
digitalWrite(red2, LOW);
digitalWrite(gre1, LOW);
digitalWrite(gre2, LOW);

digitalWrite(yel1, HIGH);
digitalWrite(yel2, HIGH);
delay(1000);
digitalWrite(yel1, LOW);
digitalWrite(yel2, LOW);
delay(1000);
}
}






 raffaele ilardo