from machine import Pin, PWM
import time
# 1. Configuración de pines del Encoder
clk = Pin(14, Pin.IN, Pin.PULL_UP)
dt = Pin(15, Pin.IN, Pin.PULL_UP)
sw = Pin(13, Pin.IN, Pin.PULL_UP)
# 2. Configuración del LED y el Servomotor (PWM a 50Hz para el servo)
led = Pin(17, Pin.OUT)
servo = PWM(Pin(16))
servo.freq(50)
# Variable inicial en 90 grados como solicita la práctica
posicion = 90
# Función corregida para mapear los grados (0 a 180) al ancho de pulso correcto en MicroPython
def ajustar_servo(grados):
# En la Raspberry Pi Pico, un duty_u16 para 50Hz va típicamente de:
# ~1638 (aprox 0.5ms -> 0 grados) a ~8192 (aprox 2.5ms -> 180 grados)
# Haremos un cálculo lineal exacto para el rango del servo en Wokwi:
pulso_min = 1638 # 0.5 ms
pulso_max = 8192 # 2.5 ms
# Mapeamos los grados a un valor de duty_u16 proporcional
duty = int(pulso_min + (grados / 180.0) * (pulso_max - pulso_min))
servo.duty_u16(duty)
# Rutina de interrupción cuando gira el encoder
def leer_encoder(pin):
global posicion
if dt.value() == 0:
posicion += 5 # Giro horario
if posicion > 180:
posicion = 180
else:
posicion -= 5 # Giro antihorario
if posicion < 0:
posicion = 0
led.value(1) # Enciende brevemente el LED
time.sleep_ms(2)
led.value(0)
# Rutina de interrupción para el botón del encoder (resetea a 90 grados)
def reset_encoder(pin):
global posicion
posicion = 90
print("¡Botón presionado! Servo restablecido a 90 grados.")
# 3. Configurar las interrupciones en los pines
clk.irq(trigger=Pin.IRQ_FALLING, handler=leer_encoder)
sw.irq(trigger=Pin.IRQ_FALLING, handler=reset_encoder)
print("Sistema de Encoder e Interrupciones iniciado...")
# POSICIONAR EL SERVO A 90° DESDE EL INICIO (Antes del bucle)
ajustar_servo(posicion)
time.sleep(0.5)
# Ciclo principal
while True:
# Actualizamos el servo con la posición actual (calculada por el encoder o el botón)
ajustar_servo(posicion)
print(f"Posición actual del servo: {posicion}°")
time.sleep(0.2)