Nota

Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirti a noi?

  • Supporto esperto: Risolvi i problemi post-vendita e le sfide tecniche con l’aiuto della nostra comunità e del nostro team.

  • Impara e condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime speciali.

  • Sconti esclusivi: Approfitta di sconti riservati sui nostri prodotti più recenti.

  • Promozioni festive e concorsi: Partecipa a concorsi e promozioni durante le festività.

👉 Sei pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi stesso!

2.1.6 Modulo Encoder Rotativo

Introduzione

In questo progetto, imparerai come funziona un Encoder Rotativo. Un encoder rotativo è un interruttore elettronico che genera una sequenza regolare di impulsi temporizzati. Quando viene utilizzato con un IC, può essere impiegato per operazioni come incremento, decremento, scorrimento di pagine e altre azioni come lo scorrimento del mouse o la selezione dei menu.

Componenti Necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

../_images/Part_two_25.png

È sicuramente comodo acquistare un kit completo, ecco il link:

Nome

ARTICOLI IN QUESTO KIT

LINK

Kit Raphael

337

Raphael Kit

Puoi anche acquistarli separatamente dai link qui sotto.

INTRODUZIONE AI COMPONENTI

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Modulo Encoder Rotativo

ACQUISTA

Schema Elettrico

../_images/image349.png

Procedure Sperimentali

Passo 1: Costruisci il circuito.

../_images/2.1.6_fritzing.png

In questo esempio, colleghiamo i pin dell’Encoder Rotativo direttamente al Raspberry Pi usando una breadboard e un cavo a 40 pin. Collega il GND dell’Encoder Rotativo a GND, 「+」a 5V, SW al GPIO27, DT al GPIO18 e CLK al GPIO17.

Passo 2: Apri il file del codice.

cd ~/raphael-kit/python/

Passo 3: Esegui.

sudo python3 2.1.6_RotaryEncoder.py

Vedrai il conteggio nella shell. Quando ruoti l’encoder in senso orario, il conteggio aumenta; quando lo ruoti in senso antiorario, il conteggio diminuisce. Se premi l’interruttore sull’encoder rotativo, le letture torneranno a zero.

Codice

Nota

Puoi Modificare/Reimpostare/Copiare/Eseguire/Interrompere il codice qui sotto. Ma prima devi accedere al percorso del codice come raphael-kit/python. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l’effetto.

#!/usr/bin/env python3
import RPi.GPIO as GPIO
import time

clkPin = 17    # Pin CLK
dtPin = 18    # Pin DT
swPin = 27    # Pin del pulsante

globalCounter = 0

flag = 0
Last_dt_Status = 0
Current_dt_Status = 0

def setup():
   GPIO.setmode(GPIO.BCM)       # Numerazione dei GPIO in base alla posizione fisica
   GPIO.setup(clkPin, GPIO.IN)    # Modalità input
   GPIO.setup(dtPin, GPIO.IN)
   GPIO.setup(swPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

def rotaryDeal():
   global flag
   global Last_dt_Status
   global Current_dt_Status
   global globalCounter
   Last_dt_Status = GPIO.input(dtPin)
   while(not GPIO.input(clkPin)):
      Current_dt_Status = GPIO.input(dtPin)
      flag = 1
   if flag == 1:
      flag = 0
      if (Last_dt_Status == 0) and (Current_dt_Status == 1):
         globalCounter = globalCounter - 1
      if (Last_dt_Status == 1) and (Current_dt_Status == 0):
         globalCounter = globalCounter + 1

def swISR(channel):
   global globalCounter
   globalCounter = 0

def loop():
   global globalCounter
   tmp = 0   # Temporaneo per l'encoder

   GPIO.add_event_detect(swPin, GPIO.FALLING, callback=swISR)
   while True:
      rotaryDeal()
      if tmp != globalCounter:
         print ('globalCounter = %d' % globalCounter)
         tmp = globalCounter

def destroy():
   GPIO.cleanup()             # Rilascia le risorse

if __name__ == '__main__':     # Il programma inizia qui
   setup()
   try:
      loop()
   except KeyboardInterrupt:  # Quando viene premuto 'Ctrl+C', il programma destroy() verrà eseguito.
      destroy()

Analisi del Codice

  • Legge il valore di dtPin quando clkPin è basso.

  • Quando clkPin è alto, se dtPin passa da basso ad alto, il conteggio diminuisce, altrimenti aumenta.

  • swPin emette un segnale basso quando viene premuto l’albero dell’encoder.

Da questo, il flusso del programma è illustrato di seguito:

../_images/2.1.6_flow.png

Immagine del Fenomeno

../_images/2.1.6rotary_ecoder.JPG