Programmazione Arduino per principianti: il semaforo

La settimana scorsa abbiamo appreso la struttura di base di un programma Arduino e abbiamo esaminato più da vicino l'esempio di "lampeggio". Spero che tu abbia colto l'opportunità per sperimentare il codice, regolando i tempi.

La settimana scorsa abbiamo appreso la struttura di base di un programma Arduino e abbiamo esaminato più da vicino l'esempio di "lampeggio".  Spero che tu abbia colto l'opportunità per sperimentare il codice, regolando i tempi.
Annuncio pubblicitario

Il semaforo è un piccolo progetto divertente, che può essere completato in meno di un'ora. Scopri come costruire il tuo - usando un Arduino - e come modificare il circuito per un modello avanzato.

Non preoccuparti se non hai mai usato un Arduino in precedenza, abbiamo una guida per principianti. Guida introduttiva ad Arduino: Guida per principianti Guida introduttiva ad Arduino: Guida per principianti Arduino è una piattaforma di prototipazione elettronica open source basata su flessibile, facile- usare hardware e software. È pensato per artisti, designer, hobbisti e chiunque sia interessato a creare oggetti o ambienti interattivi. Leggi di più .

Nota : questa è l'ultima di una serie di tutorial per principianti per Arduino, la piattaforma di prototipazione elettronica open source. Ecco un elenco degli articoli precedenti della serie:

  • Cosa è Arduino e cosa puoi fare con esso Cosa è Arduino e cosa puoi fare con esso? Cosa è Arduino e cosa puoi fare con esso? L'Arduino è un eccezionale dispositivo elettronico, ma se non ne hai mai usato uno prima, cosa sono esattamente e cosa puoi fare con uno? Leggi di più
  • Che cos'è un kit di avvio Arduino e cosa contiene? Cosa è incluso in un kit di avvio Arduino? [MakeUseOf Explains] Cosa è incluso in un Arduino Starter Kit? [MakeUseOf Explains] Ho già introdotto l'hardware open source Arduino qui su MakeUseOf, ma non avrai bisogno di altro che l'effettivo Arduino per crearne qualcosa e iniziare davvero. I "kit di avvio" Arduino sono ... Leggi di più
  • Altri componenti fantastici da acquistare con il kit di avvio 8 Altri componenti fantastici per i tuoi progetti Arduino 8 Altri componenti interessanti per i tuoi progetti Arduino Quindi stai pensando di acquistare un kit di avvio Arduino, ma ti chiederai se alcuni LED e resistori di base saranno abbastanza per tenerti occupato per il weekend? Probabilmente no. Ecco altri 8 ... Leggi altro
  • Guida introduttiva al kit di avvio Arduino - Installazione dei driver e configurazione della scheda e della porta Guida introduttiva di Arduino Starter Kit - Installazione dei driver e configurazione della scheda e della porta Guida introduttiva di Arduino Starter Kit - Installazione dei driver e impostazione della scheda & Port Quindi, ti sei comprato un kit di avvio Arduino, e possibilmente qualche altro componente casuale - ora cosa? In che modo inizi a programmare questa cosa di Arduino? Come si imposta ... Per saperne di più
  • Uno sguardo ravvicinato alla struttura di un'app Arduino e del programma di esempio di lampeggio

Quello che ti serve

Oltre all'Arduino di base, avrai bisogno di:

  • LED rossi, gialli e verdi.
  • Una breadboard.
  • 6 x 220? resistori.
  • Cavi di collegamento.
  • 1 x interruttore a pulsante.
  • 1 x 10k? resistore

Quasi ogni Arduino sarà adatto, a patto che abbia abbastanza spilli. Assicurati di leggere la nostra guida all'acquisto Guida all'acquisto di Arduino: quale scheda dovresti acquistare? Guida all'acquisto di Arduino: quale scheda si dovrebbe ottenere? Ci sono così tanti diversi tipi di tavole Arduino là fuori, ti verrebbe perdonato per essere stato confuso. Quale dovresti comprare per il tuo progetto? Aiutaci, con questa guida all'acquisto di Arduino! Leggi di più se non sei sicuro di quale modello ti serve. Probabilmente hai queste parti nel tuo kit iniziale Cosa c'è nel tuo Starter Kit Arduino? [Arduino Beginners] Cosa c'è nel tuo Arduino Starter Kit? [Arduino Beginners] Di fronte a una scatola piena di componenti elettronici, è facile essere sopraffatti. Ecco una guida per esattamente quello che troverai nel tuo kit. Leggi di più già.

Un semplice esempio

Iniziamo in piccolo. Un semplice semaforo di base è un buon punto di partenza. Ecco il circuito:

arduino_traffic_light

Collegare l'anodo (gamba lunga) di ciascun LED ai pin digitali otto, nove e dieci (tramite un resistore da 220?). Collegare i catodi (gamba corta) alla terra di Arduino.

Ho usato Fritzing per disegnare questi diagrammi. Non solo è facile da usare, è gratis!

Il codice

Inizia definendo le variabili in modo che possiamo indirizzare le luci per nome anziché per numero. Avvia un nuovo progetto Arduino e inizia con queste linee:

int red = 10; int yellow = 9; int green = 8; 

Successivamente, aggiungiamo la funzione di configurazione, dove configureremo i LED rossi, gialli e verdi da emettere. Poiché hai creato delle variabili per rappresentare i numeri dei pin, ora puoi fare riferimento ai pin per nome.

 void setup(){ pinMode(red, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT); } 

È stato facile. Ora per la parte difficile - la logica attuale di un semaforo. Crea una funzione separata per cambiare le luci (vedrai perché dopo).

Quando si inizia a programmare per la prima volta, il codice stesso è molto rudimentale: sta individuando i dettagli logici minuti che presentano il problema più grande. La chiave per essere un buon programmatore è essere in grado di esaminare qualsiasi processo e scomporlo nei suoi passaggi fondamentali. Ecco il resto del codice:

 void loop(){ changeLights(); delay(15000); } void changeLights(){ // green off, yellow on for 3 seconds digitalWrite(green, LOW); digitalWrite(yellow, HIGH); delay(3000); // turn off yellow, then turn red on for 5 seconds digitalWrite(yellow, LOW); digitalWrite(red, HIGH); delay(5000); // red and yellow on for 2 seconds (red is already on though) digitalWrite(yellow, HIGH); delay(2000); // turn off red and yellow, then turn on green digitalWrite(yellow, LOW); digitalWrite(red, LOW); digitalWrite(green, HIGH); delay(3000); } 

Fatto! Ora, carica ed esegui (assicurati di selezionare la scheda e la porta corrette dal menu Strumenti > Porta e Strumenti > Schede). Dovresti avere un semaforo funzionante che cambia ogni 15 secondi, in questo modo (accelerato):

Un passaggio pedonale

Ora che conosci le basi, miglioriamolo. Aggiungi un pulsante per consentire ai pedoni di cambiare la luce quando vogliono:

arduino_traffic_light_with_button

Si noti come il semaforo è esattamente uguale all'esempio precedente. Collegare il pulsante al pin digitale 12. Noterai che l'interruttore ha un'alta impedenza 10k? resistenza collegata ad esso, e forse ti starai chiedendo perché. Questo è chiamato un resistore di pull-down. All'inizio è un concetto difficile da comprendere, ma portami con me.

Un interruttore o lascia il flusso corrente o no. Questo sembra abbastanza semplice, ma in un circuito logico, la corrente dovrebbe fluire sempre in uno stato alto o basso (ricorda - 1 o 0, alto o basso). Si potrebbe supporre che un interruttore a pulsante che non viene effettivamente spinto sia definito come in uno stato basso, ma in realtà si dice che sia "mobile", perché non viene disegnata alcuna corrente.

In questo stato flottante, è possibile che si verifichi una lettura errata in quanto fluttua con interferenze elettriche. In altre parole, un interruttore fluttuante non fornisce né una lettura affidabile, né una lettura di stato basso. Un resistore di pull down mantiene una piccola quantità di corrente che scorre quando l'interruttore è chiuso, garantendo così una lettura accurata dello stato basso. In altri circuiti logici, invece, è possibile trovare un resistore di pull-up, che funziona sullo stesso principio, ma al contrario, assicurandosi che la porta logica predefinita sia impostata su valore alto.

Ora, nella parte loop del codice, invece di cambiare le luci ogni 15 secondi, leggeremo invece lo stato dell'interruttore a pulsante, e cambiamo le luci solo quando è attivato.

Il codice

Inizia aggiungendo una nuova variabile all'inizio del programma:

 int button = 12; // switch is on pin 12 

Ora, nella funzione di configurazione, aggiungi una nuova riga per dichiarare lo switch come input. Ho anche aggiunto una riga singola per avviare i semafori sul palco verde. Senza questa impostazione iniziale, verrebbero disattivati, fino alla prima volta che changeLights () viene avviato utilizzando una funzione.

 pinMode(button, INPUT); digitalWrite(green, HIGH); 

Cambia invece l'intera funzione del ciclo su:

 void loop() { if (digitalRead(button) == HIGH){ delay(15); // software debounce if (digitalRead(button) == HIGH) { // if the switch is HIGH, ie. pushed down - change the lights! changeLights(); delay(15000); // wait for 15 seconds } } } 

Questo dovrebbe farlo. Forse ti starai chiedendo perché il pulsante viene controllato due volte ( DigitalRead (pulsante) ), separato da un piccolo ritardo. Questo è chiamato debouncing. Proprio come per il pulsante era necessario il resistore di pull down, questo semplice controllo blocca il codice che rileva le interferenze minori quando si preme un pulsante. Non devi farlo (e probabilmente funzionerebbe bene senza di esso), ma è una buona pratica.

Attendendo all'interno dell'istruzione if per 15 secondi, i semafori non possono cambiare per almeno quella durata. Dopo 15 secondi, il ciclo si riavvia. Ogni riavvio del loop, leggi di nuovo lo stato del pulsante, ma se non viene premuto, l'istruzione if non si attiva mai, le luci non cambiano mai, e si riavvia semplicemente di nuovo.

Ecco come appare (velocizzato):

Un incrocio

Proviamo un modello più avanzato. Invece di un passaggio pedonale, modifica il circuito per avere due semafori:

arduino_dual_traffic_light

Collegare il secondo semaforo ai pin digitali 11, 12 e 13.

Il codice

Innanzitutto, assegna i nuovi spilli semaforo alle variabili e configurale come uscite, proprio come nel primo esempio:

 // light one int red1 = 10; int yellow1 = 9; int green1 = 8; // light two int red2 = 13; int yellow2 = 12; int green2 = 11; void setup(){ // light one pinMode(red1, OUTPUT); pinMode(yellow1, OUTPUT); pinMode(green1, OUTPUT); // light two pinMode(red2, OUTPUT); pinMode(yellow2, OUTPUT); pinMode(green2, OUTPUT); } 

Ora aggiorna il tuo loop per utilizzare il codice del primo esempio (anziché il passaggio pedonale):

 void loop(){ changeLights(); delay(15000); } 

Ancora una volta, tutto il lavoro viene eseguito nella funzione changeLights () . Invece di andare in rosso > rosso e giallo > verde, questo codice alternerà i semafori. Quando uno è in verde, l'altro sarà in rosso. Ecco il codice:

 void changeLights(){ // turn both yellows on digitalWrite(green1, LOW); digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); delay(5000); // turn both yellows off, and opposite green and red digitalWrite(yellow1, LOW); digitalWrite(red1, HIGH); digitalWrite(yellow2, LOW); digitalWrite(red2, LOW); digitalWrite(green2, HIGH); delay(5000); // both yellows on again digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); digitalWrite(green2, LOW); delay(3000); // turn both yellows off, and opposite green and red digitalWrite(green1, HIGH); digitalWrite(yellow1, LOW); digitalWrite(red1, LOW); digitalWrite(yellow2, LOW); digitalWrite(red2, HIGH); delay(5000); } 

Ecco come appare (accelerato):

È tutto per questa volta, quindi spero che tu abbia imparato molto e ti sia divertito a scrivere da zero. Ti sei sporcato le mani con alcuni LED e resistori, oltre ad aggiungere un interruttore con una resistenza verso il basso - si spera che tu abbia capito perché ne abbiamo bisogno. Gioca con il codice, regolalo e, soprattutto, divertiti. Se si apportano aggiunte o modifiche, perché non farcelo sapere nei commenti?

Credito immagine: androsvector tramite Shutterstock.com

In this article