import random
from machine import Pin, ADC
from time import sleep, ticks_ms
# **Configurar el potenciómetro en GPIO 34**
potenciometro = ADC(Pin(34))
potenciometro.atten(ADC.ATTN_11DB) # Ajuste para leer voltajes entre 0V y 3.3V
# **Pines del sensor ultrasónico**
trig = Pin(5, Pin.OUT)
echo = Pin(35, Pin.IN)
boton = Pin(0, Pin.IN, Pin.PULL_UP)
# 🔹 Nuevo LED para indicar estado del robot
led = Pin(16, Pin.OUT)
# **Motores**
motores = [
[Pin(13, Pin.OUT), Pin(12, Pin.OUT), Pin(14, Pin.OUT), Pin(27, Pin.OUT)],
[Pin(26, Pin.OUT), Pin(25, Pin.OUT), Pin(33, Pin.OUT), Pin(32, Pin.OUT)],
[Pin(23, Pin.OUT), Pin(22, Pin.OUT), Pin(21, Pin.OUT), Pin(19, Pin.OUT)],
[Pin(18, Pin.OUT), Pin(4, Pin.OUT), Pin(2, Pin.OUT), Pin(15, Pin.OUT)]
]
direccion = 1
activo = False
last_measure_time = ticks_ms()
last_random_time = ticks_ms()
random_interval = random.randint(2000, 5000)
distancia = 200
# **Funcionamiento del LED**
def actualizar_led():
if activo:
led.value(0) # Parpadeo cuando el robot está activado
sleep(0.2)
led.value(1)
sleep(0.2)
else:
led.value(1) # LED encendido siempre cuando el robot está apagado
# **Función para medir distancia**
def medir_distancia_cm():
trig.off()
sleep(0.002)
trig.on()
sleep(0.00001)
trig.off()
from machine import time_pulse_us
duracion = time_pulse_us(echo, 1, 60000)
if duracion <= 0:
return 400
distancia = (duracion / 2) / 29.1
return distancia
# **Función para el botón con anti-rebote**
def cambiar_estado(pin):
global activo
sleep(0.1)
if boton.value() == 0:
sleep(0.1)
if boton.value() == 0:
activo = not activo
print("Robot activado" if activo else "Robot detenido")
boton.irq(trigger=Pin.IRQ_FALLING, handler=cambiar_estado)
# **Función para obtener velocidad del potenciómetro**
def obtener_velocidad():
valor_pot = potenciometro.read()
velocidad = 0.005 + (valor_pot / 4095) * 0.05 # Rango de 5ms a 50ms
return velocidad
# **Funciones de movimiento con velocidad ajustada**
def mover_alante():
velocidad = obtener_velocidad()
print("Dirección actual: Adelante")
for _ in range(5):
actualizar_led()
for motor in motores:
for pin in motor:
pin.value(1)
sleep(velocidad)
for motor in motores:
for pin in motor:
pin.value(0)
sleep(velocidad)
def mover_atras():
velocidad = obtener_velocidad()
print("Dirección actual: Atrás")
for _ in range(5):
actualizar_led()
for motor in motores:
for pin in reversed(motor):
pin.value(0)
sleep(velocidad)
for motor in motores:
for pin in reversed(motor):
pin.value(1)
sleep(velocidad)
def mover_izquierda():
velocidad = obtener_velocidad()
print("Dirección actual: Izquierda")
for _ in range(5):
actualizar_led()
for pin in motores[0]:
pin.value(1)
for pin in motores[3]:
pin.value(0)
sleep(velocidad)
for pin in motores[0]:
pin.value(0)
for pin in motores[3]:
pin.value(1)
sleep(velocidad)
def mover_derecha():
velocidad = obtener_velocidad()
print("Dirección actual: Derecha")
for _ in range(5):
actualizar_led()
for pin in motores[0]:
pin.value(1)
for pin in motores[3]:
pin.value(0)
sleep(velocidad)
for pin in motores[0]:
pin.value(0)
for pin in motores[3]:
pin.value(1)
sleep(velocidad)
# **Bucle principal**
while True:
actualizar_led() # 🔹 Se actualiza el estado del LED en cada iteración
if activo:
# **Medición de distancia y actualización cada segundo**
if ticks_ms() - last_measure_time >= 1000:
distancia = medir_distancia_cm()
last_measure_time = ticks_ms()
print("Distancia medida:", distancia, "cm")
# **Cambio de dirección del robot**
if distancia < 100:
direccion = 0
else:
if ticks_ms() - last_random_time >= random_interval:
direccion = random.choice([1, 2, 3])
last_random_time = ticks_ms()
random_interval = random.randint(2000, 5000)
# **Ejecutar movimiento con velocidad ajustada**
if direccion == 0:
mover_atras()
elif direccion == 1:
mover_alante()
elif direccion == 2:
mover_izquierda()
elif direccion == 3:
mover_derecha()
else:
sleep(0.01)