from machine import Pin, PWM, ADC, time_pulse_us
import network
import socket
import utime
import time
# Definición de switch selectores de casos
sel_uno = Pin(15, Pin.IN)
sel_dos = Pin(16, Pin.IN)
# Definición de indicadores LED
led_uno = Pin(14, Pin.OUT)
led_dos = Pin(17, Pin.OUT)
# Configuración de los pines del sensor ultrasónico
TRIG_PIN = 6 # GP6 para TRIG
ECHO_PIN = 7 # GP7 para ECHO
trig = Pin(TRIG_PIN, Pin.OUT)
echo = Pin(ECHO_PIN, Pin.IN)
# Configuración de los pines de los motores
mizq_uno = PWM(Pin(9))
mizq_uno.freq(5500)
mizq_dos = PWM(Pin(10))
mizq_dos.freq(5500)
mder_uno = PWM(Pin(22))
mder_dos = PWM(Pin(21))
mder_uno.freq(5500)
mder_dos.freq(5500)
# Sensores de luz
ldr_izq = ADC(Pin(26)) # Asume que el sensor de luz izquierdo está en el Pin 26
ldr_der = ADC(Pin(27)) # Asume que el sensor de luz derecho está en el Pin 27
# Sensores de obstáculos simulando seguidor de línea
obs_izq = Pin(2, Pin.IN)
obs_der = Pin(3, Pin.IN)
# Variables para almacenar el estado anterior de los selectores
estado_anterior = (None, None)
# Función para medir distancia usando el sensor ultrasónico
def medir_distancia():
trig.value(0)
time.sleep_us(5)
trig.value(1)
time.sleep_us(10)
trig.value(0)
duracion = time_pulse_us(echo, 1, 50000)
if duracion == -1:
print("Fuera de rango")
return None
distancia = (duracion * 0.0343) / 2
if distancia > 400:
print("Error de medición o fuera de rango")
return None
return distancia
# Configura Wi-Fi
ssid = 'Briseida'
password = 'PAGAPORTUPROPIOWIFI'
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
# Espera hasta que se conecte
while not wlan.isconnected():
pass
print("Conectado a Wi-Fi:", wlan.ifconfig())
# Función para la página web de control
def web_page():
html = """<!DOCTYPE html>
<html>
<body>
<h1>Control de motores</h1>
<button onclick="sendCommand('A')">Girar Derecho A</button>
<button onclick="sendCommand('B')">Girar Derecho B</button>
<button onclick="sendCommand('C')">Girar Izquierdo C</button>
<button onclick="sendCommand('D')">Girar Izquierdo D</button>
<button onclick="sendCommand('E')">Parar</button>
<script>
function sendCommand(cmd) {
fetch('/' + cmd);
}
</script>
</body>
</html>"""
return html
# Configura el socket del servidor
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 8080))
s.listen(5)
# Variable para almacenar el estado anterior de la combinación de selectores
last_combination = None
# Bucle principal
while True:
# Leer el estado de los selectores
seleccion_uno = sel_uno.value()
seleccion_dos = sel_dos.value()
current_combination = (seleccion_uno, seleccion_dos)
# Control de LEDs basado en los switches
led_uno.value(seleccion_uno)
led_dos.value(seleccion_dos)
# Verificar la combinación seleccionada
if current_combination == (0, 0): # Evasor de obstáculos
if current_combination != last_combination:
print("Opción 0-0: Evasor de obstáculos")
last_combination = current_combination
# Ejecución del evasor de obstáculos
distancia = medir_distancia()
if distancia is not None:
print("Distancia:", distancia, "cm")
if distancia < 25:
print("Acción: Evadiendo obstáculo (distancia < 25 cm)")
mizq_uno.duty_u16(40000)
mizq_dos.duty_u16(0)
mder_uno.duty_u16(0)
mder_dos.duty_u16(40000)
elif 25 <= distancia < 50:
print("Acción: Girando para evitar colisión (25 cm <= distancia < 50 cm)")
mizq_uno.duty_u16(0)
mizq_dos.duty_u16(0)
mder_uno.duty_u16(40000)
mder_dos.duty_u16(0)
elif distancia > 50:
print("Acción: Avanzando libremente (distancia > 50 cm)")
mizq_uno.duty_u16(0)
mizq_dos.duty_u16(40000)
mder_uno.duty_u16(40000)
mder_dos.duty_u16(0)
else:
print("Distancia: Fuera de rango o error de medición")
elif current_combination == (1, 0): # Seguidor de línea simulado
if current_combination != last_combination:
print("Combinación 1-0: Seguidor de línea simulado activado")
last_combination = current_combination
# Lectura de los sensores de obstáculos
obs_izq_val = obs_izq.value()
obs_der_val = obs_der.value()
# Lógica para el seguimiento de línea simulado
if obs_izq_val == 0 and obs_der_val == 0:
mizq_uno.duty_u16(0)
mizq_dos.duty_u16(0)
mder_uno.duty_u16(0)
mder_dos.duty_u16(0)
print("Detenido (ambos sensores detectan obstáculo cercano)")
elif obs_izq_val == 0 and obs_der_val == 1:
mizq_uno.duty_u16(40000)
mizq_dos.duty_u16(0)
mder_uno.duty_u16(0)
mder_dos.duty_u16(0)
print("Girando a la derecha (sensor izquierdo detecta obstáculo)")
elif obs_izq_val == 1 and obs_der_val == 0:
mizq_uno.duty_u16(0)
mizq_dos.duty_u16(0)
mder_uno.duty_u16(40000)
mder_dos.duty_u16(0)
print("Girando a la izquierda (sensor derecho detecta obstáculo)")
else:
mizq_uno.duty_u16(40000)
mizq_dos.duty_u16(0)
mder_uno.duty_u16(40000)
mder_dos.duty_u16(0)
print("Avanzando (ambos motores encendidos)")
utime.sleep(0.2)
elif current_combination == (0, 1): # Seguidor de luz
if current_combination != last_combination:
print("Combinación 0-1: Seguidor de luz activado")
last_combination = current_combination
luz_izq_val = ldr_izq.read_u16()
luz_der_val = 65535 - ldr_der.read_u16() # Inversión del valor del sensor derecho
print(f"Luz izquierda: {luz_izq_val}, Luz derecha: {luz_der_val}")
if luz_izq_val < 15000:
mizq_uno.duty_u16(0)
mizq_dos.duty_u16(50000)
print("Motor izquierdo encendido (siguiendo luz)")
else:
mizq_uno.duty_u16(0)
mizq_dos.duty_u16(0)
print("Motor izquierdo apagado (sin luz intensa)")
if luz_der_val < 15000:
mder_uno.duty_u16(50000)
mder_dos.duty_u16(0)
print("Motor derecho encendido (siguiendo luz)")
else:
mder_uno.duty_u16(0)
mder_dos.duty_u16(0)
print("Motor derecho apagado (sin luz intensa)")
utime.sleep(0.2)
elif current_combination == (1, 1): # Wi-Fi
if current_combination != last_combination:
print("Opción 1-1: WiFi")
last_combination = current_combination
conn, addr = s.accept()
print('Solicitud desde', addr)
request = conn.recv(1024)
request = str(request)
print('Contenido =', request)
if '/A' in request:
mder_uno.duty_u16(40000)
mder_dos.duty_u16(0)
elif '/B' in request:
mder_uno.duty_u16(0)
mder_dos.duty_u16(40000)
elif '/C' in request:
mizq_uno.duty_u16(0)
mizq_dos.duty_u16(40000)
elif '/D' in request:
mizq_uno.duty_u16(40000)
mizq_dos.duty_u16(0)
elif '/E' in request:
mizq_uno.duty_u16(0)
mizq_dos.duty_u16(0)
mder_uno.duty_u16(0)
mder_dos.duty_u16(0)
response = web_page()
conn.send('HTTP/1.1 200 OK\n')
conn.send('Content-Type: text/html\n')
conn.send('Connection: close\n\n')
conn.sendall(response)
conn.close()
utime.sleep(0.1)