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.

../_images/2.1.6_rotary_encoder_list.png

È decisamente conveniente acquistare un kit completo, ecco il link:

Nome

COMPONENTI NEL KIT

LINK

Raphael Kit

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE AI COMPONENTI

LINK D’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Modulo Encoder Rotativo

ACQUISTA

Schema Elettrico

../_images/2.1.6_rotary_encoder_schematic.png

Procedure Sperimentali

Passo 1: Costruisci il circuito.

../_images/2.1.6_rotary_encoder_circuit.png

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

  1. Importa le classi RotaryEncoder e Button dalla libreria gpiozero, e la funzione sleep per gestire i ritardi.

    #!/usr/bin/env python3
    from gpiozero import RotaryEncoder, Button
    from time import sleep
    
  2. 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
    
  3. Dichiara una variabile globale global_counter per tracciare la posizione dell’encoder rotativo.

    global_counter = 0  # Variabile globale per tracciare la posizione dell'encoder rotativo
    
  4. Definisce una funzione rotary_change per 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
    
  5. Definisce una funzione reset_counter per 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
    
  6. Assegna la funzione reset_counter da eseguire quando il pulsante viene premuto.

    # Assegna la funzione reset_counter all'evento di pressione del pulsante
    button.when_pressed = reset_counter
    
  7. In un ciclo continuo, lo script chiama rotary_change per 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