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.
È sicuramente comodo acquistare un kit completo, ecco il link:
Nome |
ARTICOLI IN QUESTO KIT |
LINK |
|---|---|---|
Kit Raphael |
337 |
Puoi anche acquistarli separatamente dai link qui sotto.
INTRODUZIONE AI COMPONENTI |
LINK PER L’ACQUISTO |
|---|---|
Schema Elettrico
Procedure Sperimentali
Passo 1: Costruisci il circuito.
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: