from machine import Pin, ADC, PWM, I2C
import ssd1306
import time
# === Configuración del hardware ===
# Configuración de la pantalla OLED
i2c = I2C(0, scl=Pin(22), sda=Pin(21)) # Pines GPIO22 (SCL) y GPIO21 (SDA)
oled = ssd1306.SSD1306_I2C(128, 64, i2c) # Pantalla OLED 128x64
# Configuración del potenciómetro
potenciometro = ADC(Pin(34)) # Conectar el potenciómetro al pin GPIO34
potenciometro.atten(ADC.ATTN_11DB) # Configurar para leer 0-3.3V
potenciometro.width(ADC.WIDTH_12BIT) # Resolución de 12 bits (0-4095)
# Configuración del botón
boton = Pin(15, Pin.IN, Pin.PULL_UP) # Botón para cambiar el sentido de giro
# Configuración del módulo L298N
IN1 = Pin(26, Pin.OUT) # Entrada IN1 del L298N
IN2 = Pin(25, Pin.OUT) # Entrada IN2 del L298N
ENA = PWM(Pin(27), freq=1000) # Pin ENA para control de velocidad con PWM
# === Variables del sistema ===
direccion_horaria = True # Dirección inicial: horario
# === Funciones auxiliares ===
def mostrar_oled(direccion, velocidad):
"""
Muestra la dirección y velocidad en la pantalla OLED.
"""
oled.fill(0) # Limpiar la pantalla
oled.text("Motor DC Control", 0, 0)
oled.text(f"Direccion: {direccion}", 0, 16)
oled.text(f"Velocidad: {velocidad}%", 0, 32)
oled.show()
def cambiar_direccion():
"""
Cambia la dirección del motor.
"""
global direccion_horaria
direccion_horaria = not direccion_horaria
if direccion_horaria:
IN1.value(1)
IN2.value(0)
else:
IN1.value(0)
IN2.value(1)
def ajustar_velocidad(velocidad):
"""
Ajusta la velocidad del motor mediante PWM.
"""
duty = int((velocidad / 100) * 1023) # Convertir porcentaje a rango de 0-1023
ENA.duty(duty)
# === Configuración inicial ===
cambiar_direccion() # Configurar la dirección inicial
mostrar_oled("↻", 0) # Mostrar dirección inicial y velocidad 0%
# === Bucle principal ===
ultimo_estado_boton = boton.value() # Estado anterior del botón
while True:
# Leer el valor del potenciómetro y calcular la velocidad
valor_pot = potenciometro.read() # Valor entre 0 y 4095
velocidad = int((valor_pot / 4095) * 100) # Convertir a porcentaje (0-100)
ajustar_velocidad(velocidad)
# Leer el estado del botón para cambiar la dirección
estado_boton = boton.value()
if estado_boton == 0 and ultimo_estado_boton == 1: # Detectar flanco descendente
cambiar_direccion()
time.sleep(0.2) # Antirrebote del botón
# Actualizar la pantalla OLED
direccion = "↻" if direccion_horaria else "↺"
mostrar_oled(direccion, velocidad)
ultimo_estado_boton = estado_boton # Actualizar el estado del botón
time.sleep(0.1)