Raspberry Pi Pico – controllare lo stato di un pin digitale

Propongo in questa breve lezione due esempi di base sull’uso del Raspberry Pi Pico: identificare lo stato di un pulsante e realizzazione di un interruttore mediante un pulsante.

Per questo esempio utilizzeremo il pin 14 a cui connetteremo un pin del pulsante, così come rappresentato nell’immagine che segue. Come sapete molti dei pulsanti disponibili nei kit elettronici sono costituiti da 4 pin, connessi frontalmente a due a due.
Proseguiamo connettendo il secondo pin del pulsante al positivo sulla breadboard (3,3V). Ricordiamoci inoltre la connessione del 3,3V del PiPico al positivo della breadboard.

E’ molto importante ricordare che una simile connessione del pulsante con il PiPico potrebbe causare problemi di cortocircuito alla pressione del pulsante, perché non presente una resistore di PULL-UP o di PULL-DOWN fisico. Per evitare di utilizzare un resistore, attiviamo la resistenza di PULL-DOWN sul pin 14, ATTENZIONE ricordate di fare questa operazione altrimenti rischiate di distruggere irrimediabilmente  il vostro microcontrollore.

Aprite l’editor Thonny e digitate il seguente programma:

1# Prof. Maffucci Michele
2# Controllo dello stato sul pin 14 (una sola volta)
3# 18.09.2021
4 
5# libreria che permette di utilizzare MicroPython con il RaspyMicro
6import machine
7 
8# creazione dell'oggetto pulsante che include il pin 14 impostato come input
9# su cui viene attivata il resistore di PULL-DOWN
10pulsante = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
11 
12# la lettura del pulante viene fatta usando l'API machine
13# usando la funzione value
14 
15print(button.value())

Salvate il programma sulla vostra scheda, assegnate ad esempio il nome pulsante1.py
Se mandate in esecuzione il programma lo stato del pin verrà mostrato immediatamente sulla Shell una sola volta.

Se non premete il pulsante verrà mostrato sulla Shell il valore logico 0 in quanto abbiamo utilizzato una resistenza di PULL-DOWN, nel momento in cui, all’avvio premete il pulsante lo stato logico visualizzato sulla Shell sarà 1.

Per leggere lo stato del pulsante in modo continuo bisognerà aggiungere un loop all’interno del programma che segue che chiameremo pulsante2.py

1# Prof. Maffucci Michele
2# Controllo dello stato sul pin 14 (in modo continuo)
3# 18.09.2021
4 
5# libreria che permette di utilizzare MicroPython con il RaspyMicro
6import machine
7 
8# per la gestione del tempo
9import utime
10 
11# creazione dell'oggetto pulsante che include il pin 14 impostato come input
12# su cui viene attivata il resistore di PULL-DOWN
13pulsante = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
14 
15# la lettura del pulante viene fatta usando l'API machine
16# usando la funzione value
17 
18# while True definisce un loop infinito al cui interno
19# troviamo il controllo dello stato del pulsante
20while True:
21    # se la condizione è vera viene stampato
22    # il messaggio mediante la print
23    # e fermato il programma per 1 secondi
24    if pulsante.value() == 1:
25        print("Hai premuto il pulsante")
26        utime.sleep(1)

Premete sul pulsante di Run nell’IDE, vedrete che fino a quando non premete il pulsante non accade nulla. Non appena il pulsante viene premuto viene stampata sulla Shell la strina “Hai premuto il pulsante”.

Attenzione che senza la brevissima pausa di 1 secondo verrebbe stampato continuamente il messaggio “Hai premuto il pulsante”.

Vedrete quindi la stampa del messaggio ogni secondo. Se mantenete premuto il pulsante per un tempo superiore a 1 secondi verrà stampato nuovamente il messaggio e ciò si ripeterà ogni secondo fino a quando non rilasciamo il pulsante.

Vediamo ora un programma che, oltre ad inviare un messaggio sulla Shell, accende un LED esterno connesso al pin 15 ogni volta che premiamo il pulsante, chiamiamo il programma pulsante3.py.

1# Prof. Maffucci Michele
2# Controllo dello stato sul pin 14 (in modo continuo)
3# eaccensione di un led alla pressione del pulsante
4# 18.09.2021
5 
6# libreria che permette di utilizzare MicroPython con il RaspyMicro
7import machine
8 
9# per la gestione del tempo
10import utime
11 
12# creazione dell'oggetto pulsante che include il pin 14 impostato come input
13# su cui viene attivata il resistore di PULL-DOWN
14pulsante = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
15 
16#pin 15 dichiarato come OUTPUT
17ledEsterno = machine.Pin(15, machine.Pin.OUT)
18 
19# while True definisce un loop infinito al cui interno
20# troviamo il controllo dello stato del pulsante
21while True:
22    # se la condizione è vera viene stampato
23    # il messaggio mediante la print
24    # e fermato il programma per 1 secondi
25    if pulsante.value() == 1:
26        ledEsterno.value(1)    # imposta il livello logico 1 sul pin 15
27        print("Hai premuto il pulsante")
28        utime.sleep(0.5)       # imposta una pausa di mezzo secondo
29        ledEsterno.value(0)    # imposta il livello logico 0 sul pin 15

Vediamo ora come realizzare un programma che realizza la funzione di un interruttore, cioè il mantenimento dello stato al rilascio del pulsante. Chiamiamo il programma interruttore1.py. Il circuito è il medesimo dell’esempio al passo precedente.

1# Prof. Maffucci Michele
2# realizzazione di un interruttore
3# mediante pulsante connesso al Pin 14 con antirimbalzo software
4# con accensione di un LED connesso al pin 15
5# 18.09.2021
6 
7# libreria che permette di utilizzare MicroPython con il RaspyMicro
8import machine
9 
10# per la gestione del tempo
11import utime
12 
13# creazione dell'oggetto pulsante che include il pin 14 impostato come input
14# su cui viene attivata il resistore di PULL-DOWN
15pulsante = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
16 
17#pin 15 dichiarato come OUTPUT
18ledEsterno = machine.Pin(15, machine.Pin.OUT)
19 
20# val usato per conservare lo stato del pulsante
21val = 0
22 
23# vecchio_val per conservare lo stato del pulsante al passo precedente
24vecchio_val = 0
25 
26# ricorda lo stato in cui si trova il LED,
27# stato = 0 led spento, stato = 1 led acceso
28stato = 0
29 
30# while True definisce un loop infinito al cui interno
31# troviamo il controllo dello stato del pulsante
32while True:
33    val = pulsante.value()                   # legge il valore del pulsante e lo conserva
34    if (val == 1) and (vecchio_val == 0):    # controlla se è accaduto qualcosa
35        stato = 1 - stato
36        utime.sleep(0.15)                # attesa di 15 millisecondi
37    vecchio_val = val;
38    if (stato == 1):
39        ledEsterno.value(1)    # imposta il livello logico 1 sul pin 15
40    else:
41        ledEsterno.value(0)    # imposta il livello logico 0 sul pin 15

Modifichiamo ora il programma precedente inviando sulla Shell il messaggio che indica lo stato del LED, chiamiamo il programma interruttire2.py. Il circuito è il medesimo dell’esempio al passo precedente.

1# Prof. Maffucci Michele
2# realizzazione di un interruttore
3# mediante pulsante connesso al Pin 14 con antirimbalzo software
4# con accensione di un LED connesso al pin 15
5# e stampa dello stato del LED sulla Shell
6# 18.09.2021
7 
8# libreria che permette di utilizzare MicroPython con il RaspyMicro
9import machine
10 
11# per la gestione del tempo
12import utime
13 
14# creazione dell'oggetto pulsante che include il pin 14 impostato come input
15# su cui viene attivata il resistore di PULL-DOWN
16pulsante = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
17 
18#pin 15 dichiarato come OUTPUT
19ledEsterno = machine.Pin(15, machine.Pin.OUT)
20 
21# val usato per conservare lo stato del pulsante
22val = 0
23 
24# vecchio_val per conservare lo stato del pulsante al passo precedente
25vecchio_val = 0
26 
27# ricorda lo stato in cui si trova il LED,
28# stato = 0 led spento, stato = 1 led acceso
29stato = 0
30 
31# stampare una sola volta il messaggio 'LED acceso' o 'LED spento' sulla Shell
32abilitaMessaggio = 0
33 
34# while True definisce un loop infinito al cui interno
35# troviamo il controllo dello stato del pulsante
36while True:
37    val = pulsante.value()                    # legge il valore del pulsante e lo conserva
38    if (val == 1) and (vecchio_val == 0):     # controlla se è accaduto qualcosa
39        stato = 1 - stato
40        utime.sleep(0.15)             # attesa di 15 millisecondi
41    vecchio_val = val;
42    if (stato == 1) and (abilitaMessaggio == 0):
43        ledEsterno.value(1)                   # imposta il livello logico 1 sul pin 15
44        abilitaMessaggio = 1
45        print("LED acceso")                   # stampa il messaggio
46        utime.sleep(1)
47    elif (stato == 0) and (abilitaMessaggio == 1):
48        ledEsterno.value(0)                   # imposta il livello logico 0 sul pin 15
49        abilitaMessaggio = 0
50        print("LED spento")                   # stampa il messaggio
51        utime.sleep(1)

Buon Coding a tutti 🙂

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.