Usando um codificador rotativo com o Raspberry Pi

Using a Rotary Encoder with the Raspberry Pi

UM codificador rotativo é um sensor que converte o movimento rotacional em sinais digitais, permitindo controle preciso sobre a posição, velocidade e direção. É comumente usado em Controles de volume, robótica, máquinas CNC e navegação de menu. Este guia mostrará como configurar e usar um codificador rotativo com um Raspberry Pi usando o Python.


O que você precisará

  1. Raspberry Pi (Qualquer modelo com suporte GPIO, por exemplo, PI 3, PI 4)
  2. Codificador rotativo (por exemplo, KY-040)
  3. Fios de pão e jumper
  4. Python instalado No Raspberry Pi

Etapa 1: Entendendo como um codificador rotativo funciona

UM codificador rotativo tem duas saídas principais:

  • CLK (a) - sinal de pulso de relógio
  • Dt (b) - sinal de direção
  • SW (opcional) - Botão (usado para selecionar opções)

Quando girado, o Os pinos CLK e DT geram pulsos. A ordem desses pulsos determina o direção de rotação.


Etapa 2: Fiação do codificador rotativo para o Raspberry Pi

Pino do codificador rotativo Pino de framboesa pi Função
VCC 3.3V (pino 1) Fonte de energia
Gnd Terra (pino 6) Chão
CLK (a) Gpio17 (pino 11) Pulso do relógio
Dt (b) Gpio27 (pino 13) Sinal de direção
SW (botão) GPIO22 (pino 15) Pressione o botão

Etapa 3: Instale as bibliotecas necessárias

Atualize seu Raspberry Pi e instale o Rpi.gpio Biblioteca para lidar com interrupções do GPIO.

sudo apt update && sudo apt upgrade -y
sudo apt install python3-rpi.gpio

Etapa 4: Código Python para ler a entrada do codificador rotativo

Código Python básico para ler a rotação

import RPi.GPIO as GPIO
import time

# Define GPIO pins
CLK = 17
DT = 27
counter = 0
last_state = None

# Setup GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(CLK, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(DT, GPIO.IN, pull_up_down=GPIO.PUD_UP)

# Read initial state
last_state = GPIO.input(CLK)

try:
    while True:
        current_state = GPIO.input(CLK)
        if current_state != last_state:
            if GPIO.input(DT) != current_state:
                counter += 1
                direction = "Clockwise"
            else:
                counter -= 1
                direction = "Counterclockwise"
            print(f"Position: {counter}, Direction: {direction}")
        last_state = current_state
        time.sleep(0.01)  # Debounce delay
except KeyboardInterrupt:
    print("Exiting...")
finally:
    GPIO.cleanup()

Adicionando o botão Pressione Detecção

# Define button pin
SW = 22
GPIO.setup(SW, GPIO.IN, pull_up_down=GPIO.PUD_UP)

def button_pressed(channel):
    print("Button Pressed!")

# Add event detection for button press
GPIO.add_event_detect(SW, GPIO.FALLING, callback=button_pressed, bouncetime=300)

Etapa 5: Aplicações de um codificador rotativo com Raspberry Pi

  1. Navegação de menu - Role através de menus LCD ou OLED.
  2. Controle de volume - Ajuste o volume em aplicativos de mídia.
  3. Máquinas CNC - Controle preciso de movimento em aplicações de motor de passo.
  4. Robótica - Detecte a rotação da roda para o rastreamento de velocidade e posição.
  5. Automação residencial inteligente - Use como seletor para diferentes funções domésticas.

Solução de problemas

  1. Codificador rotativo não respondendo

    • Verifique o atribuições de fiação e pino GPIO.
    • Garantir Os resistores de pull-up estão ativados (PUD_UP).
  2. Passos de pular ou movimento irregular

    • Adicionar Atraso em debounce (time.sleep(0.01)).
    • Usar GPIO interrompe Em vez de pesquisar (GPIO.add_event_detect).
  3. Botão Pressione não detectado

    • Garantir O pino do botão está conectado corretamente para gnd.
    • Adicione a Tempo de debounce de 300ms em GPIO.add_event_detect.

Conclusão

UM codificador rotativo é um dispositivo de entrada versátil para Navegação de menu, controle do motor e rastreamento de posição. Seguindo este guia, você pode integrar facilmente um codificador rotativo com o seu Raspberry Pi para projetos interativos. 🚀

Deixe um comentário

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.