.. note:: 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 [|link_sf_facebook|] e unisciti oggi stesso! .. _2.1.6_py_pi5: 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. .. image:: ../python_pi5/img/2.1.6_rotary_encoder_list.png È decisamente conveniente acquistare un kit completo, ecco il link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nome - COMPONENTI NEL KIT - LINK * - Raphael Kit - 337 - |link_Raphael_kit| Puoi anche acquistarli separatamente dai link sottostanti. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUZIONE AI COMPONENTI - LINK D'ACQUISTO * - :ref:`cpn_gpio_extension_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_rotary_encoder` - |link_rotary_encoder_buy| Schema Elettrico ------------------------ .. image:: ../python_pi5/img/2.1.6_rotary_encoder_schematic.png :align: center Procedure Sperimentali -------------------------- **Passo 1:** Costruisci il circuito. .. image:: ../python_pi5/img/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. .. raw:: html .. code-block:: cd ~/raphael-kit/python-pi5 **Passo 3:** Esegui. .. raw:: html .. code-block:: 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à. .. warning:: Se viene visualizzato l'errore ``RuntimeError: Cannot determine SOC peripheral base address``, fare riferimento a :ref:`faq_soc`. **Code** .. note:: 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. .. raw:: html .. code-block:: python #!/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 ``RotaryEncoder`` e ``Button`` dalla libreria ``gpiozero``, e la funzione ``sleep`` per gestire i ritardi. .. code-block:: python #!/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. .. code-block:: python # 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_counter`` per tracciare la posizione dell'encoder rotativo. .. code-block:: python global_counter = 0 # Variabile globale per tracciare la posizione dell'encoder rotativo #. Definisce una funzione ``rotary_change`` per aggiornare il contatore globale in base alla rotazione dell'encoder rotativo. .. code-block:: python 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_counter`` per resettare il contatore globale a zero quando viene premuto il pulsante. .. code-block:: python 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_counter`` da eseguire quando il pulsante viene premuto. .. code-block:: python # Assegna la funzione reset_counter all'evento di pressione del pulsante button.when_pressed = reset_counter #. 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. .. code-block:: python 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