Uno degli errori tipici che riscontro durante le correzioni degli esercizi dei miei studenti alle prime esperienze nell’uso dei microcontrollori, è quello di ritenere che su un pin non collegato a nulla vi sia la presenza di uno stato logico LOW, questo non è corretto. Viene definito floating (flottante) un pin di ingresso a cui non è collegato nulla, in questa condizione sul pin potrebbe essere presente qualsiasi stato.
L’uso di un resistore collegato in modalità pull-up o pull-down costringerà il pin a uno stato noto, ma questa non è l’unica modalità. E’ possibile fissare uno stato su un pin utilizzando un metodo, in parte già illustrato in un mio precedente post, che sfrutta l’utilizzo di un resistore di pull-up interno alla scheda. Per abilitare questa resistenza sarà sufficiente indicare all’interno del setup la funzione pinMode() con largomento “INPUT_PULLUP” oppure nella stessa maniera utilizzando le istruzioni:
pinMode(pin, INPUT); // imposta 'pin' come input digitalWrite(pin, HIGH); // attiva la resistenza di pull-up, //'pin' viene impostato HIGH
Per entrambe le modalità noterete che il LED è normalmente accesso, alla pressione del pulsante si spegnerà.
Circuito
Modalità 1
void setup() { pinMode(8, OUTPUT); // Utilizzo del LED sul pin 8 // Abilita la resistenza interna di Pull-Up pinMode(7, INPUT); // Collegamento del pulsante al pin 7 digitalWrite(7, HIGH); // attiva la resistenza di pull-up, sul pin 7 } void loop() { bool statoPulsante = digitalRead(7); // memorizza lo stato corrente sul pin 7 digitalWrite(8, statoPulsante); // accende il LED se statoPulsante e 1, lo spegne se 0 }
Modalità 2
void setup() { pinMode(8, OUTPUT); // INPUT_PULLUP abilita la resistenza interna di Pull-Up pinMode(7, INPUT_PULLUP); // Collegamento del pulsante al pin 7 } void loop() { bool statoPulsante = digitalRead(7); // memorizza lo stato corrente sul pin 7 digitalWrite(8, statoPulsante); // accende il LED se statoPulsante e 1, lo spegne se 0 }
Nel caso abbiate la necessità di invertire lo stato e fare in modo che il LED sia normalmente spento e si accenda alla pressione del pulsante sarà sufficiente applicare l’operatore NOT, indicato con il simbolo “!” alla funzione digitalRead(7):
bool statoPulsante = !digitalRead(7);
Lo sketch completo sarà:
void setup() { pinMode(8, OUTPUT); // INPUT_PULLUP abilita la resistenza interna di Pull-Up pinMode(7, INPUT_PULLUP); // Collegamento del pulsante al pin 7 } void loop() { bool statoPulsante = !digitalRead(7); // memorizza lo stato corrente sul pin 10 digitalWrite(8, statoPulsante); // accende il LED se statoPulsante e 1, lo spegne se 0 }
Potete trovare un ulteriore esempio di applicazione alla pagina 78 delle slide: Alfabeto di Arduino – lezione 2