Usare Arduino per accendere i led è una delle cose che più mi diverte, saranno le lucine o il loro colore
oggi voglio riprendere uno sketch presente tra gli esempi forniti con l’IDE di Arduino e ampliarlo un po’, lo sketch è Button.ino o Button.pde.
Ti mostro come ampliare il numero di led e di pulsanti associando ogni pulsante ad un led ed accendendo e spegnendo i led con la pressione del pulsante associato.
Per realizzare questo esperimento ti basta acquistare lo STARTER KIT CON ARDUINO UNO REV3, all’interno della confezione oltre all’arduino uno rev3 ci sono:
- 5 led rossi di cui ne userai solo 3
- 3 pulsanti da Circuito Stampato
- la breadboard
- i cavetti per le connessioni
- 4 resistenze da 330Ω
Lo schema dei collegamenti è il seguente:
per ogni pulsante devi collegare una resistenza da 330Ω tra il terminale a cui colleghi l’ingresso analogico di Arduino e il pin di massa ( Gnd ).
I 3 led avranno la massa in comune ( catodo ) e connessa alla massa del circuito e di arduino mediante una resistenza da 330Ω.
I terminali positivi dei 3 led sono collegati ciascuno ad un pin digitale di Arduino.
Ecco lo sketch:
#define analog0 A0
#define analog1 A1
#define analog2 A2
#define led0 2
#define led1 3
#define led2 4
int statoLed0 = 0;
int statoLed1 = 0;
int statoLed2 = 0;
void setup()
{
pinMode( analog0, INPUT );
pinMode( analog1, INPUT );
pinMode( analog2, INPUT );
pinMode( led0, OUTPUT );
pinMode( led1, OUTPUT );
pinMode( led2, OUTPUT );
digitalWrite( led0, statoLed0 );
digitalWrite( led1, statoLed1 );
digitalWrite( led2, statoLed2 );
}
void loop()
{
if ( analogRead(analog0) > 1000 )
{
if ( statoLed0 == LOW ) statoLed0 = HIGH;
else statoLed0 = LOW;
digitalWrite( led0, statoLed0 );
delay(200);
}
if ( analogRead(analog1) > 1000 )
{
if ( statoLed1 == LOW ) statoLed1 = HIGH;
else statoLed1 = LOW;
digitalWrite( led1, statoLed1 );
delay(200);
}
if ( analogRead(analog2) > 1000 )
{
if ( statoLed2 == LOW ) statoLed2 = HIGH;
else statoLed2 = LOW;
digitalWrite( led2, statoLed2 );
delay(200);
}
}
Lo sketch è ridondante, nel senso che le righe di codice per gestire un led sono state duplicate per gestire anche gli altri due. Entrando nel dettaglio:
linee 01-03: definisci i tre pin analogici a cui colleghi i tre pulsanti;
linee 05-07: definisci i tre pin digitali a cui colleghi i led;
se ti stai chiedendo come mai non ho collegato anche i pulsanti a 3 pin digitali, visto che utilizzo il loro segnale come digitale, il motivo è semplice i pin analogici sono sempre meno considerati e lasciati inutilizzati nella maggior parte dei progetti, di fatto in questo modo riduci il numero di input possibili e di conseguenza anche di output disponibili. Con questi esperimenti la mia idea è di sensibilizzare anche sull’utilizzo di questi pin in modo che tu possa avere a disposizione più ingressi/uscite digitali;
linee 09-11: definisci tre variabili di tipo integer in cui memorizzerai il valore di stato ( acceso/spento -> HIGH/LOW) di ciascun led;
linea 31: testa il valore letto sull’ingresso analogico 0 ( A0 ) e se questo vale più di 1000 entra nella condizione if ed esegui le linee che seguono. Il suo funzionamento si basa sul fatto che un contatto normalmente aperto come quello del pulsante non premuto invia un segnale nullo ( zero ) all’ingresso analogico corrispondente. La pressione del pulsante collega al positivo il pin analogico, generando sul convertitore ADC di arduino il valore 1023. Riassumendo la pressione del pulsante viene vista da arduino con un valore letto sull’ingresso analogico di 1023, quindi maggiore di 1000;
linea 33-34: verifica che lo stato corrente del led 0 sia LOW, se verificato lo porta a HIGH, ossia inverte lo stato del led, in caso sia già HIGH lo porta a LOW ( linea 34 );
linea 35: invia il valore di stato appena impostato al pin digitale a cui è collegato il led;
linea 36: attende un tempo di 200 millisecondi prima di proseguire rilevando la pressione di un altro pulsante o dello stesso, questo serve ad evitare di dover premere il pulsante alla velocità di 1 millesimo di secondo, di contro se non ci fosse sarebbe molto difficile riuscire a fissare lo stato acceso o spento alla pressione del pulsante. Puoi aumentare questo tempo se il modo in cui intendi far lavorare i pulsanti è più lento, diminuirlo se più veloce;
linee 39-45: eseguono le stesse cose delle linee 31-37 ma per il secondo led;
linee 47-53: eseguono le stesse cose delle linee 31-37 ma per il terzoo led;
Ho realizzato anche un piccolo filmato dimostrativo:
Buon divertimento.







2 comments
Andrea
8 giugno 2013 a 10:14 (UTC 2) Link to this comment
ciao mauro stò provando a utilizzare 2 pulsanti come interrutori come nel video che lei ha fatto, però con due pulsanti non ci riesco può darmi qualche consiglio ?? questo è il programma è esatto ??? il programma funzione però non mi riesce a accendere e spegmnere i due servo a rotazione continua , riesco a farlo funzione tutto solo con il pulsante premuto , premetto che ci sono 2 pulsanti uno quando è premuto fà funzione tutto ‘latro quando è premuto spegne tutto .
int servo1=9;
int servo2=10;
int w=0;
int y=0;
int p1=12;
int p2=13;
int a=6;
int b=7;
int zio=0;
void setup(){
pinMode (servo1,OUTPUT);
pinMode (servo2,OUTPUT);
pinMode (p1, INPUT);
pinMode (p2, INPUT);
pinMode (a, OUTPUT);
pinMode (b, OUTPUT);
}
void loop (){
w= digitalRead(p1);
y= digitalRead(p2);
if ((w==HIGH)&&(y==LOW)&&(zio==0))
{
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(servo2,HIGH);
digitalWrite(servo2,LOW);
digitalWrite(servo1,HIGH);
delay(1.5);
digitalWrite(servo1,LOW);
delay(10);
zio=1;
delay(1000);
}
if ((w==LOW)&&(y==HIGH)&&(zio==1)){
{
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(servo1,HIGH);
delay(2.5);
digitalWrite(servo1,LOW);
delay(10);
zio=0;
delay(1000);
}
}}
Mauro Alfieri
9 giugno 2013 a 07:33 (UTC 2) Link to this comment
Ciao Andrea,
lo sketch é completamente errato, ti invito a leggere dei tutorial sui servo e a comprenderei bene prima di provare, non guardare solo i video, trovi i miei tutorial spiegati riga per riga proprio per aiutarti.
Se avessi letto avresti capito molte cose sia degli errori che hai fatto sia di non inserire nei commenti gli sketch.
Mauro