Buttons
In questo capitolo andremo a provare alcuni esperimenti in cui costruiremo progetti hardware basati sui pulsanti e i led, governati da un ESP32 e controllati tramite codice MicroPython.
I pulsanti hardware hanno due caratteristiche fisiche che vanno sempre considerate quando se ne inserisce uno in un circuito:
-
floating inputs: all'inizio l'ESP32 è confuso perché non sa se lo stato iniziale del pulsante è cliccato oppure no. Questo problema si può risolvere con una resistenza di
pull-up
o dipull-down
. -
chattering: se si clicca il pulsante molto rapidamente (ad esempio sparando in un gioco), l'ESP32 potrebbe pensare ad un'unica pressione prolungata. Questo problema si può risolvere con tecniche di
debouncing
.
Vediamo come è fatto internamente un pulsante:
E vediamo in quali modi è possibile collegarlo al nostro ESP32:
In qualunque dei 4 modi indicati sopra, tutto il circuito passerà sempre per il pulsante, che avrà la possibilità di aprirlo o chiuderlo.
Capito che servono due collegamenti, ci sono due modi il cui il pulsante può essere collegato al circuito:
- in modalità
pull-down
, con una estremità connessa alGPIO
, l'altra alla tensione di3.3V
: in questo caso, quando il pulsante è premuto il valore èHIGH
, altrimenti èLOW
. - in modalità
pull-up
, con una estremità connessa alGPIO
, l'altra alGND
: in questo caso, quando il pulsante è premuto il valore èLOW
, altrimenti èHIGH
.
Gestione debouncing
Quando si preme un pulsante fisico, il circuito si apre e si chiude decine o centinaia di volte. Questo fenomeno è chiamato bouncing. Ciò accade a causa della natura meccanica dei pulsanti: quando i contatti metallici si uniscono, c'è un breve periodo in cui il contatto non è perfetto, il che causa una serie di rapide transizioni di apertura/chiusura.
Il pulsante del simulatore
Ovviamente, il pulsante del simulatore non ha problemi di contatti fisici, ma è in grado di simularli impostando la variabile Bounce
del pulsante:
- Se la imposti a
True
, il simulatore creerà un centinaio di segnali aperto/chiuso ad ogni pressione del pulsante - Se la imposti a
False
, il simulatore creerà una singola coppia di segniali aperto/chiuso per ogni pressione.
Il seguente codice presenta una semplice tecnica di debouncing software. Permette di tenere traccia delle pressioni utente di un pulsante.
from machine import Pin
button = Pin(19, Pin.IN,Pin.PULL_UP)
print("valore iniziale del pulsante: ", button.value())
lastValue = True
while True:
actualValue = button.value()
if lastValue == actualValue:
continue
if actualValue == False:
print("hai cliccato il pusante...")
lastValue = actualValue
Esempi con i pulsanti
(da sistemare)
Nel secondo progetto abbiamo un pulsante collegato ad un LED nel nostro circuito. Incredibilmente... quando si clicca il pulsante dovrebbe accendersi la luce!!!
Vediamo lo schema elettrico del progetto:
Quello che manca è il codice di funzionamento. Eccolo:
from machine import Pin
# xx è il numero del GPIO a cui hai collegato il led
# yy è il numero del GPIO a cui hai collegato il pulsante
led = Pin(xx, Pin.OUT)
button = Pin(yy, Pin.IN,Pin.PULL_UP)
while True:
if not button.value():
led.off()
else:
led.on()
Esercizi
Button LED...Bar
Pulsante e barra dei led.
Quando si clicca il pulsante, parte il caricamento della barra, che poi si scaricherà quando è tutta piena.
Difficoltà ulteriore: quando si clicca di nuovo il pulsante il caricamento si interrompe.