Nota
Ciao, benvenuto nella Community di SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Approfondisci il mondo di Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
Perché unirti a noi?
Supporto Tecnico Esperto: Risolvi i problemi post-vendita e le sfide tecniche con l’aiuto della nostra comunità e del nostro team.
Impara e Condividi: Scambia consigli e tutorial per migliorare le tue competenze.
Anteprime Esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime.
Sconti Speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
Promozioni Festive e Giveaway: Partecipa a giveaway e promozioni durante le festività.
👉 Sei pronto a esplorare e creare con noi? Clicca [Qui] e unisciti oggi stesso!
2.1.6 Modulo Encoder Rotativo
Introduzione
In questo progetto imparerai a conoscere l’encoder rotativo. Un encoder rotativo è un interruttore elettronico che emette una serie di impulsi regolari in una sequenza temporale rigorosa. Quando viene utilizzato con un circuito integrato (IC), può consentire operazioni come incremento, decremento, scorrimento di pagine e altre operazioni, come lo scrolling del mouse, la selezione dei menu, ecc.
Componenti Necessari
Per questo progetto, avremo bisogno dei seguenti componenti.
È decisamente conveniente acquistare un kit completo, ecco il link:
Nome |
COMPONENTI NEL KIT |
LINK |
|---|---|---|
Raphael Kit |
337 |
Puoi anche acquistarli separatamente dai link sottostanti.
INTRODUZIONE AI COMPONENTI |
LINK D’ACQUISTO |
|---|---|
Schema Elettrico
Procedure Sperimentali
Passo 1: Costruisci il circuito.
In questo esempio, possiamo collegare il pin dell’encoder rotativo direttamente al Raspberry Pi utilizzando una breadboard e un cavo a 40 pin. Collega il GND dell’encoder rotativo a GND, 「+」a 5V, SW a GPIO digitale 27, DT a GPIO digitale 18 e CLK a GPIO digitale 17.
Passo 2: Apri il file del codice.
cd ~/raphael-kit/python-pi5
Passo 3: Esegui.
sudo python3 2.1.6_RotaryEncoder_zero.py
Vedrai il conteggio sul terminale. Quando ruoti l’encoder rotativo in senso orario, il conteggio aumenta; quando lo ruoti in senso antiorario, il conteggio diminuisce. Se premi l’interruttore sull’encoder rotativo, il conteggio si azzererà.
Avvertimento
Se viene visualizzato l’errore RuntimeError: Cannot determine SOC peripheral base address, fare riferimento a If gpiozero doesn’t work..
Code
Nota
Puoi Modificare/Resettare/Copiare/Eseguire/Fermare il codice qui sotto. Ma prima, devi accedere alla directory del codice come raphael-kit/python-pi5. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l’effetto.
#!/usr/bin/env python3
from gpiozero import RotaryEncoder, Button
from time import sleep
# Initialize the rotary encoder and button
encoder = RotaryEncoder(a=17, b=18) # Rotary Encoder connected to GPIO pins 17 (CLK) and 18 (DT)
button = Button(27) # Button connected to GPIO pin 27
global_counter = 0 # Track the rotary encoder's position
def rotary_change():
""" Update the global counter based on the rotary encoder's rotation. """
global global_counter
global_counter += encoder.steps # Adjust counter based on encoder steps
encoder.steps = 0 # Reset encoder steps after updating counter
print('Global Counter =', global_counter) # Display current counter value
def reset_counter():
""" Reset the global counter to zero when the button is pressed. """
global global_counter
global_counter = 0 # Reset the counter
print('Counter reset') # Indicate counter reset
# Assign the reset_counter function to button press event
button.when_pressed = reset_counter
try:
# Monitora continuamente l'encoder rotativo e gestisci le variazioni
while True:
rotary_change() # Gestisci le variazioni dell'encoder rotativo
sleep(0.1) # Breve pausa per ridurre il carico della CPU
except KeyboardInterrupt:
# Gestisci in modo corretto un'interruzione da tastiera (Ctrl+C)
pass
Analisi del Codice
Importa le classi
RotaryEncodereButtondalla libreriagpiozero, e la funzionesleepper gestire i ritardi.#!/usr/bin/env python3 from gpiozero import RotaryEncoder, Button from time import sleep
Inizializza l’encoder rotativo con i pin GPIO 17 e 18, e un pulsante sul pin GPIO 27.
# Inizializza l'encoder rotativo e il pulsante encoder = RotaryEncoder(a=17, b=18) # Encoder rotativo collegato ai pin GPIO 17 (CLK) e 18 (DT) button = Button(27) # Pulsante collegato al pin GPIO 27
Dichiara una variabile globale
global_counterper tracciare la posizione dell’encoder rotativo.global_counter = 0 # Variabile globale per tracciare la posizione dell'encoder rotativo
Definisce una funzione
rotary_changeper aggiornare il contatore globale in base alla rotazione dell’encoder rotativo.def rotary_change(): """ Aggiorna il contatore globale in base alla rotazione dell'encoder rotativo. """ global global_counter global_counter += encoder.steps # Aggiorna il contatore in base agli step dell'encoder encoder.steps = 0 # Resetta gli step dell'encoder dopo aver aggiornato il contatore print('Global Counter =', global_counter) # Mostra il valore corrente del contatore
Definisce una funzione
reset_counterper resettare il contatore globale a zero quando viene premuto il pulsante.def reset_counter(): """ Resetta il contatore globale a zero quando viene premuto il pulsante. """ global global_counter global_counter = 0 # Resetta il contatore print('Contatore resettato') # Indica che il contatore è stato resettato
Assegna la funzione
reset_counterda eseguire quando il pulsante viene premuto.# Assegna la funzione reset_counter all'evento di pressione del pulsante button.when_pressed = reset_counter
In un ciclo continuo, lo script chiama
rotary_changeper gestire le variazioni dell’encoder rotativo e introduce una breve pausa per ridurre il carico della CPU. Utilizza un blocco try-except per gestire in modo corretto le interruzioni da tastiera.try: # Monitora continuamente l'encoder rotativo e gestisci le variazioni while True: rotary_change() # Gestisci le variazioni dell'encoder rotativo sleep(0.1) # Breve pausa per ridurre il carico della CPU except KeyboardInterrupt: # Gestisci in modo corretto un'interruzione da tastiera (Ctrl+C) pass