from machine import Pin, I2C
from time import sleep
from pico_i2c_lcd import I2cLcd
# --- Configuración de LCD ---
def inicializar_lcd():
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400_000)
dispositivos = i2c.scan()
if not dispositivos:
raise Exception("No se detectó LCD I2C.")
lcd = I2cLcd(i2c, dispositivos[0], 2, 16)
lcd.clear()
return lcd
# --- Pines del motor y botones ---
STEP = Pin(26, Pin.OUT)
DIR = Pin(22, Pin.OUT)
P_RIGT = Pin(18, Pin.IN, Pin.PULL_UP)
P_LEFT = Pin(19, Pin.IN, Pin.PULL_UP)
# --- Variables de control (flags) ---
flag_giro = {'sentido': None}
# --- Función de giro de motor (200 pasos = 1 vuelta) ---
def girar_motor(sentido=1, pasos=200):
DIR.value(sentido)
for _ in range(pasos):
STEP.on()
sleep(0.005)
STEP.off()
sleep(0.005)
# --- Funciones IRQ (interrupciones) ---
def handler_rigth(pin):
if pin.value() == 0: # Verifica que se mantenga presionado
flag_giro['sentido'] = 1 # Sentido horario
def handler_left(pin):
if pin.value() == 0:
flag_giro['sentido'] = 0 # Sentido antihorario
# --- Programa principal ---
def main():
lcd = inicializar_lcd()
lcd.putstr("Motor PAP listo\ncon A4988")
print("Sistema listo")
# Asociar interrupciones
P_RIGT.irq(trigger=Pin.IRQ_FALLING, handler=handler_rigth)
P_LEFT.irq(trigger=Pin.IRQ_FALLING, handler=handler_left)
try:
while True:
if flag_giro['sentido'] is not None:
sentido = flag_giro['sentido']
texto = "Horario" if sentido else "Antihorario"
lcd.clear()
lcd.putstr(f"Giro {texto} \n1 vuelta")
print(f"Girando 1 vuelta ({texto})")
girar_motor(sentido)
lcd.clear()
lcd.putstr("Esperando...")
flag_giro['sentido'] = None # Reiniciar flag
sleep(0.01)
except KeyboardInterrupt:
lcd.clear()
lcd.putstr("Motor detenido")
print("Interrumpido.")
except Exception as e:
lcd.clear()
lcd.putstr("Error:\n" + str(e))
print("Error:", e)
# --- Ejecutar ---
if __name__ == "__main__":
main()