Arduino per tutti stagione 2 puntata 2: il semaforo no…

Benvenuti nella seconda stagione della nostra rubrica Arduino per tutti.
Questa volta proveremo a portare un po’ in là quanto è stato fatto la volta scorsa.
Ma cosa succederebbe se, invece di un led, occorresse controllarne 8?
Utilizzare otto grandi LED rossi con un solo Arduino UNO senza dover rinunciare a 8 perno di uscita!

Anche se si potrebbe cablare otto LED ciascuno con una resistenza a un pin UNO si sarebbe rapidamente iniziare a corto di pin sul vostro UNO. Se non si dispone di un sacco di cose collegato al UNO. Va bene a farlo – ma spesso noi vogliamo pulsanti, sensori, servi, ecc e prima di sapere che non hai perni a sinistra. Così, invece di fare questo, si intende utilizzare un chip chiamato 74HC595 convertitore seriale in parallelo. Questo chip è dotato di otto uscite (perfetti) e tre ingressi che si utilizza per alimentare i dati in esso un po ‘alla volta.
Questo chip lo rende un po’ più lento per guidare i LED (è possibile modificare solo i LED circa 500.000 volte al secondo invece di 8.000.000 di un secondo), ma è ancora molto veloce, modo più veloce di esseri umani in grado di rilevare, quindi ne vale la pena!

Componenti necessari

a) N. 1 Elegoo UNO R3
b) N. 1 Breadboard
c) N. 8 LED 5mm vari colori
d) N. 8 resistori da 220 ohm
e) N. 2 Interruttori a pulsante
f) N. 14 fili maschio-maschio
g) N. 1 74HC595 IC

Il 74HC595 è un registro a scorrimento, un tipo di chip che contiene otto allocazioni di memoria, ognuna delle quali ha solo due stati possibili (può essere cioè o 1 o 0). Per impostare ciascuno di questi valori come acceso o spento, si utilizza il data clock del chip. Il chip deve ricevere almeno 8 impulsi. Ad ogni impulso, se il perno è fissato su HIGH, allora viene attivato nel registro a scorrimento; in caso contrario, no. Quando sono stati ricevuti tutti gli otto impulsi, il sistema si resetta, riposizionandosi all’inizio, in modo da evitare lo sfarfallio.
Il chip ha anche un pin di uscita di abilitazione (OE), che viene utilizzato per attivare o disattivare le uscite tutto in una volta. Si potrebbe collegarvi anche un chip UNO PWM-grade, in modo da utilizzare ‘analogWrite’ per riuscire a controllare la luminosità dei LED. Normalmente, questo pin è LOW, quindi, come sopra, occorre legarlo all’uscita GND di Arduino.

Lo sketch

E veniamo al nostro programma.
La prima cosa da fare è definire i tre valori numerici che si stanno per usare. Queste sono le uscite digitali che saranno collegate ai pin del 74HC595.

int latchPin = 5;
int clockPin = 6;
int dataPin = 4;

Successivamente, si definisce una variabile chiamata “LED”. Questa sarà utilizzata per contenere lo schema acceso/spento dei LED. I dati di tipo ‘byte’ rappresenta i numeri con otto bit. Ogni bit può essere acceso (1) o spento (0), quindi è perfetto per tenere traccia di quale dei nostri otto LED siano accesi o spenti.

byte leds = 0;

La funzione ‘setup’ imposta i tre pin per essere uscite digitali.

void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}

La funzione loop si ferma per mezzo secondo, poi conta da 0 a 7 ogni volta che si utilizza la funzione bitset per impostare il bit che controlla che il LED nella variabile LED. Poi invoca anche updateShiftRegister in modo che l’aggiornamento di LED rifletta ciò che è nelle variabili.
Vi è poi un mezzo secondo di ritardo prima che venga incrementato il valore di i, quindi il LED successivo viene acceso e così via.

void loop()
{
leds = 0;
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++)
{
bitSet(leds, i);
updateShiftRegister();
delay(500);
}
}

La funzione updateShiftRegister(), prima di tutto, imposta il latchPin su LOW, poi chiama la funzione shiftOut() prima di mettere latchPin di nuovo su HIGH. Questa operazione richiede quattro parametri. I primi due sono i perni da utilizzare per data e clock. Il terzo parametro specifica quale estremità dei dati si desidera attivare. Stiamo per iniziare con il bit più a destra, che viene indicato come il ‘Least Significant Bit’ (LSB). L’ultimo parametro indica i dati da trasmettere al chip, in questo caso, la variabile LED.

void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}

La funzione ‘loop’ setta inizialmente tutti i LED a spento dando alla variabile LED il valore 0. Poi chiama ‘updateShiftRegister’ che invia lo schema LED al chip in modo che tutti i LED si spengano. La funzione loop si ferma per mezzo secondo e poi comincia a contare da 0 a 7 utilizzando la ‘per’ anello e la variabile ‘i’. Ogni volta che si utilizza la funzione Arduino ‘bitset’ per impostare il bit che controlla che il LED nel ‘LEDs’ variabili. E poi chiama anche ‘updateShiftRegister’ in modo che l’aggiornamento LEDs per riflettere ciò che è nel ‘LEDs’ variabili.
Vi è poi un secondo di ritardo mezzo prima di ‘i’ viene incrementato e il successivo LED è acceso:

void loop()
{
leds = 0;
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++)
{
bitSet(leds, i);
updateShiftRegister();
delay(500);
}
}

Questo è il nostro dispositivo nel suo stadio finale (un po’ caotico, certo, ma funziona):

View post on imgur.com

E anche per questa puntata è proprio tutto.
Alla prossima…

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *