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
Gent. prof. Cercando in rete ho trovato il suo bellissimo articolo sul pulsante Arduino senza resistenza esterna, ed è proprio quello che mi serve in questo momento. Tuttavia credo di aver trovato un errore nel circuito, e nel dubbio non ho osato provare. Cioè credo che il GND dell’Arduino vada collegato al Negativo della Breadboard e non al Positivo. Forse la risposta è semplice per uno studente del ramo, ma io sono soltanto uno sperimentatore anzianino. Resto in attesa di una sua cortese risposta. Grazie
Gentilissimo, grazie per la segnalazione, mia svista nel disegnare il circuito ho provveduto a correggere lo schema elettrico.
Cordiali saluti.