A distanza di qualche mese sono riuscito a sistemare gli appunti che ho realizzato in bozza per i miei studenti per continuare il corso su Arduino ed in questa lezione vi propongo il canonico esercizio “blink”, che trovate anche su Arduino.cc.
Farò alcune variazioni ed integrazioni all’esempio in modo che possiate entrare nel dettaglio del linguaggio di programmazione.
Userò in questa lezione la scheda Arduino Duemilanove e la versione dell’IDE n. 21 in ambiente Mac, ovviamente la programmazione è identica per tutti i sistemi operativi.
Il programma, sketch in Arduino, che vi consente di far lampeggiare un led è secondo me il primo programma che dovete realizzare per familiarizzare con l’ambiente di sviluppo ma soprattutto per verificare il funzionamento della scheda.
In questa lezione viene dato per scontato che lo studente conosca i concetti di:
- corrente
- tensione
- resistenza
inoltre sappia cosa sono e come funzionano i componenti:
- diodi led
- resistori
Se non avete queste nozioni di base nessun problema! Scrivetemi sarò ben lieto di spiegarvi in modo pratico e sintetico i concetti di elettronica necessari che vi permetteranno di proseguire agevolmente nel corso.
Partiamo!
Come potete notare sulla scheda è presente un piccolo diodo led indicato da una “L” che potete utilizzare come trasduttore per la realizzazione del vostro primo programma.
Se però volete incominciare con la pratica potete sfruttare le uscite digitali per pilotare un led più grande. Come mostrato nell’immagine che segue inserite il CATODO del diodo nel foro indicato con GND e l’anodo nel foro indicato con 13.
Aprite il programma Arduino se è la prima volta che avviate il programma verrà immediatamente aperto uno sketch vuoto, altrimenti dal menù File > New aprite un nuovo sketch e salvatelo con il nome che desiderate nella cartella in cui volete collezionare i vostri programmi. In ambiente Mac in fase di installazione viene creata in modo automatico una cartella di nome Arduino nella cartella “Documents” in questo modo se salvate senza indicare la cartella di destinazione ritroverete lo sketch creato in Documents > Arduino
Il programma blink potete trovarlo sul sito Arduino.cc oppure direttamente dal vostro programma:
File > Examples > 1.Basics > Blink
di seguito vi riporto la mia versione che ho rinominato “lampeggiatore led v01” in cui ho inserito i commenti in italiano, se desiderate potete utilizzare la mia versione.
// Esempio 01: far lampeggiare un led #define LED 13 // LED collegato al pin digitale 13 void setup() { pinMode(LED, OUTPUT); // imposta il pin digitale come output } void loop() { digitalWrite(LED, HIGH); // accende il LED delay(1000); // aspetta un secondo digitalWrite(LED, LOW); // spegne il LED delay(1000); // aspetta un secondo }
Di seguito l’immagine della schermata del vostro primo sketch
Ora dovete verificare il vostro programma facendo click su “Verify” e se tutto è corretto in basso all’IDE compare il messaggio “Done compiling” ciò indica che l’IDE Arduino ha tradotto il vostro sketch in un programma eseguibile sulla scheda Arduino.
Ora dovete caricare sulla scheda il vostro programma facendo click su “Upload to I/O Board“, in questo modo la scheda interrompe l’esecuzione di ciò che stava eseguendo, carica il nuovo programma in memoria e lo esegue.
Durante la fase di trasferimento accadono due cose:
01. appare il messaggio: Uploading to I/O Board… e la dimensione in byte del vostro sketch e alla fine compare il messaggio: “Done uploading” che indica che il trasferimento del programma alla scheda ha avuto termine;
02. sulla scheda i led identificati con RX e TX lampeggiano, ogni volta che viene inviato un byte e durante la fase di uploading del programma lampeggiano continuamente.
Analizziamo passo passo il codice
Non abbiate paura l’analisi riga per riga vi porterà alla comprensione del linguaggio di programmazione anche se non siete programmatori.
// Esempio 01: far lampeggiare un led
Cone le due barre “//” indichiamo l’inizio di un commento e il testo che lo segue, in questo caso, identifica il titolo del nostro programma.
Molto spesso è importante indicare subito dopo il titolo, la data dell’ultima variazione e il nome dell’autore, in modo che a distanza di tempo possiamo identificare le versioni di sviluppo ed il nome dell’ultimo programmatore che ha eseguito modifiche:
Ad esempio:
// Esempio 01: far lampeggiare un led // Data ultima modifica: 16.11.2010 // Autore: Michele Maffucci
notate che ogni linea di commento deve essere preceduta da “//”
Se volete evitare di scrivere per ogni linea “//” potete far precedere il testo commento dai caratteri “/*” e farlo concludere con i caratteri “*/”
Ad esempio:
/* Esempio 01: far lampeggiare un led Data ultima modifica: 16.11.2010 Autore: Michele Maffucci */
#define LED 13 // LED collegato al pin digitale 13
#define consente di sostituire, in fase di compilazione, all’interno del vostro programma il valore 13 ogni volta che compare la parola LED.
Vi ricordo che la compilazione avviene quando fate click su “Verify” oppure quando effettuate l’upload sulla scheda.
void setup()
void indica ad Arduino che stiamo dichiarando una funzione di nome setup(), cioè un porzione di codice che esegue un’operazione specifica
{
La parentesi graffa aperta indica dove incomincia il codice.
pinMode(LED, OUTPUT); // imposta il pin digitale come output
pinMode è un’istruzione che dice ad Arduino come usare un determinato pin.
Tra parentesi tonde vengono specificati gli argomenti che possono essere numeri e lettere.
I pin digitali possono essere utilizzati sia come INPUT che come OUTPUT. Nel nostro caso poiché vogliamo far lampeggiare il diodo LED dobbiamo definire il pin di OUTPUT.
Le parole INPUT e OUTPUT sono costanti definite, che non variano mai nel linguaggio di Arduino.
}
La parentesi graffa chiusa indica la fine della funzione setup().
void loop()
Indica la sezione di codice principale, il nucleo del vostro programma, che verrà ripetuto all’infinito fino a quando non si spegne la scheda.
digitalWrite(LED, HIGH); // accende il LED
L’istruzione digitalWrite possiede due argomenti, il primo definisce il pin, il secondo indica lo stato.
digitalWrite è un’istruzione in grado di impostare un pin definito come OUTPUT ad un valore HIGH o ad un valore LOW, in modo più semplice permette di accendere o spegnere un led connesso al pin specificato nel primo argomento, nel nostro caso LED.
Tenete conto che dire che su un determinato pin vi è uno stato HIGHT, vuol dire che su di esso viene applicata una tensione di +5 V, mentre se lo stato e LOW vuol dire che sul pin è applicata una tensione di 0V.
delay(1000); // aspetta un secondo
delay() è un’istruzione molto semplice che non fa altro che interrompere per un determinato tempo l’esecuzione del programma.
L’istruzione ha un solo argomento numerico che indica il numero di millisecondi di attesa.
Nel nostro caso con “delay(1000)” diciamo che il programma deve bloccarsi per 1000 millisecondi ovvero 1 secondo.
Quindi guardando insieme le due istruzioni:
digitalWrite(LED, HIGH); // accende il LED delay(1000); // aspetta un secondo
Diciamo ad Arduino di accendere il diodo led sul pin 13 per 1 secondo.
digitalWrite(LED, LOW); // spegne il LED
Ordiniamo al led sul pin 13 di spegnersi
delay(1000); // aspetta un secondo
tiene spento il diodo connesso al pin 13 per 1 secondo.
Ora per concludere questa seconda lezione vi invito ad eseguire i seguenti esercizi:
- variate il tempo di accensione e spegnimento, con tempi uguali di accensione e spegnimento
- variate il tempo di accensione e spegnimento, con tempi diversi di accensione e spegnimento
- provate ad eseguire il programma con tempi inferiori ai 500 millisecondi, cosa succede?
Vai alle altre lezioni:
Pingback: Vocescuola » Blog Archive » Lezione n. 2 sull’uso di Arduino
Ciao Fabio.
Grazie per la tua richiesta.
Hai solo bisogno di una resistenza ed un diodo in più e variare il primo programma indicato nella lezione: Arduino – lezione 02: facciamo lampeggiare un led.
Questa tua richiesta mi da spunto per una breve lezione, la realizzo entro la prossima settimana.
Saluti.
e possibile darmi dei suggerimenti per realizzare il programma di arduino di un propeller clock …..? io sto realizzando un orologio con 14 led ma ho problemi nel programmare il mio arduino
Ciao Michele,
voglio personalmente ringraziarti per queste lezioni molto curate che gentilmente pubblichi e per la squisita competenza e disponibilità che mostri nelle risposte!
Stefano da Imola (BO)
Grazie Stefano 🙂
sei gentilissimo.
Un caro saluto.
ciao…senti frequantando un liceo classico purtroppo non ho basi di elettronica,però ho imparato a programmare da autodidatta(C,python,mySQL…).Mi potresti dare qualche nozione breve e sintetica di base??Grazie in anticipo.Puoi anche rispondermi su mail.
Ciao Carlo.
Purtroppo l’apprendimento dell’elettronica necessita, come avrai notato per lo studio dei linguaggi di programmazione, di tempo e sperimentazione, per ora posso consigliarti di consultare la sezione “Area Studenti” in cui trovi un po’ di materiale.
E’ da tempo che sto portando avanti la realizzazione di un libro che possa essere di aiuto a chi non ha mai affrontato lo studio dell’elettronica, ma ancora non è pronto.
In ogni caso studia i contenuti che trovi su:
All About Circuits
Wikibooks: sezione elettronica pratica
Vanno bene per chi incomincia.
Saluti.
Ma se io volessi far lampeggiare 2 led su due uscite (per esempio 13 e 12) mi basta copiare tutto il testo ma definendo il led 12??
..no perchè a fare così non riesco, nel compilare mi da “redefinition of’void setup()’ ”
che vuol dire???
..tenta e ritenta ho capito dove sbagliavo rileggendo la tua guida e provando..
ora però sono arrivato al punto che conta il tempo istruzione per istruzione; mi spiego meglio:
io PENSAVO che se dopo avergli detto di accendere il 13 x 1 sec e spento x i sec e stessa cosa col 12 si accendessero in contemporanea.. ..invece prima conta uno e poi l altro!!! (dev’ essere per come ho scritto il programma!!! )
in pratica io volevo fare una cosa alla modi “KIT di SUPERCAR” dei led che fanno l’onda per poi applicarli sotto ai bracci del mio modello RC multirotore..
un pezzo del codice da me scritto ora per fare le prove di come funziona arduino è così ma esteso dal led 13 al 2 (quindi ho 12 led attaccati ora)
______________________________________________________
/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
This example code is in the public domain.
*/
#define LED
void setup() {
// initialize the digital pin as an output.
// Pin 13 has an LED connected on most Arduino boards:
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH); // set the LED on
delay(10); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(10); // wait for a second
digitalWrite(12, HIGH); // set the LED on
delay(10); // wait for a second
digitalWrite(12, LOW); // set the LED off
delay(10); // wait for a second
}
..risposta alla risposta, scusa per lo spam (ti capisco se mi cancellerai! =D )
comunque (sempre provando e riprovando) ho trovato che dovevo scrivere le istruzioni tra un delay e l’altro!
-risolto-
Figurati non preoccuparti, non è mai spam se serve per imparare.
Colpa mia che non riesco a rispondere per tempo a tutti voi.
Se il tuo scopo è quello di realizzare qualcosa alla “KIT di SUPERCAR” dai uno sguardo nella sezione Arduino di questo sito, sezione Libri (free) e guarda il progetto Project 5 – LED Chase Effect del manuale The Complete Beginners Guide to the Arduino.
Saluti.
beh, fai già un buon lavoro, non puoi essere di aiuto tempestivo!! =)
..sto guardando ora, grassie del link! 😉
OT:
cacchio se costano ‘sti LED, io devo poi moltiplicare per i 4 bracci del mio quadricottero! T.T
Ri-buonasera,
sono qui stasera per porti un altro quesitino (sempre riferito al progetto quadricottero di cui ti parlavo la volta scorsa).
domanda semplice semplice: arduino può eseguire 2 o più loop in contemporanea?
in pratica per dirgli che D2 fa 1 secondo ON e 1 OFF e D3 ne fa 1 ON e 5 OFF ???
..perchè io ho provato e a fare 2 loop uno dopo l’altro li esegue in sequenza e quindi finche nn finisce il primo non parte con l’altro/altri, mentre a mettere tutto nello stesso loop mi sembra infattibile…
Salve.
Innanzitutto, complimenti davvero dal sito ai suoi tutorial.
Complimenti.
DOMANDA:
Come IDE ho sia arduino che processing, ma su windows 7 il tasto :
Uploading to I/O Board
non ce l’ho.
ho i vari Verifica, Carica, Nuovo, Apri, Salva. ma non uploading to i/o Board.
Ho solo collegato un piccolo led (come da sua immagine) al pin gnd e 12 direttamente, la luce L sulla scheda arduino lampeggia, ma non il led.
Se colleghi il LED esterno al pin GND e al pin 12, lasciando inalterato il codice della lezione, e’ normale che il LED esterno non lampeggi perche’ dovresti collegarlo al PIN 13! Se vuoi far lampeggiare il PIN 12, allora devi modificare il codice sostituendo il numero 12 al numero 13 ogni volta che lo incontri nel listato.
Spero di esserti stato d’aiuto.
Ciao!
Alfredo
buongiorno proff. Maffucci
la ringrazio per le sue lezioni su un mondo che avevo abbandonato da tempo.
La mia curiosità e la sua dedizione nel pubblicare lezioni su questo circuito hanno fatto modo di farmi abbandonare le ore passate su pc senza meta e rispolverare la passione per l’elettronica.
GRAZIE GRAZIE GRAZIE
ps: ho 50 anni suonati e lei ma fatto tornare il ragazzo di una volta.
Ancora MILLE VOLTE GRAZIE
Grazie 🙂