Introducción al ESP32 con Micropython¶

Oscar Yáñez Suárez

Laboratorio de Neuroimagenología

oyanez@izt.uam.mx

ESP32

Preparativos (en Linux)¶

Entorno virtual para trabajo¶

>> python -m venv taller
>> source taller/bin/activate

Thonny (https://thonny.org/)¶

(taller) >> pip install thonny

dentro de Thonny:

  1. Tools > Manage plug-ins : instalar esptool
  2. Tools > Options > Interpreter : Install or update Micropython

Primer programa en Micropython¶

Haremos parpadear un led. Pon atención a las instrucciones de cableado.¶

LED Blink

# Biblioteca de acceso al hardware de la tarjeta
from machine import Pin
# Biblioteca de temporización
from time import sleep

# Declara el objeto 'led' como el pin cinco de salida
led = Pin(5, Pin.OUT)

# Lazo infinito
while True:
    # Enciende el led y espera un segundo
    led.on()
    sleep(1)
    # Apaga el led y espera un segundo
    led.off()
    sleep(1)
    

Segundo programa en Micropython¶

Ahora usaremos el botón BOOT (conectado al pin 0) para encender o apagar el led¶

# Biblioteca de acceso al hardware de la tarjeta
from machine import Pin
# Biblioteca de temporización
from time import sleep

# Declara el objeto 'led' como el pin cinco de salida
led = Pin(5, Pin.OUT)

# Declara el objeto 'boton' como el pin cero de entrada
boton = Pin(0, Pin.IN)

# Lazo infinito
while True:    
    # Verifica si el botón está oprimido
    if boton.value() == 0:
        # Cambia el estado del led y espera
        led.toggle()
        sleep(1)

Tercer programa en Micropython¶

Usaremos el sensor ultrasónico HC-SR04 para medir distancias. Pon atención a las instrucciones de cableado.¶

Sensor ultrasonico

# Biblioteca de acceso al hardware de la tarjeta
from machine import Pin, time_pulse_us
# Biblioteca de temporización
from time import sleep, sleep_us

# Velocidad del sonido en cm/us
VEL_SONIDO_cmus = 0.0343

# Tiempo máximo de lectura (tiempo para 4m de distancia)
TIEMPO_MAX = int(800/VEL_SONIDO_cmus)

# Declara el objeto 'boton' como el pin cero de entrada
boton = Pin(0, Pin.IN)

# Declara el objeto 'disparo' como el pin cinco de salida
disparo = Pin(5, Pin.OUT)

# Declara el objeto 'eco' como el pin dieciocho de entrada
eco = Pin(18, Pin.IN)

def mide():
    global disparo, eco
    
    # Inicia medición
    disparo.value(0)
    sleep_us(2)
    # Activa US por 10 microsegundos
    disparo.value(1)
    sleep_us(10)
    disparo.value(0)
    # Espera el pulso de regreso y mide el tiempo de espera
    tiempo = time_pulse_us(eco, 1, TIEMPO_MAX)
    # Calcula distancia
    distancia = tiempo*VEL_SONIDO_cmus/2
    # Regresa el valor de distancia
    return distancia
    

# Lazo infinito
while True:
    # Verifica si el botón está oprimido
    if boton.value() == 0:
        # Lanza una medición
        distancia = mide()
        sleep(1)
        # Muestra la medición
        print(f'Distancia = {distancia:5.3f} cm')

Cuarto programa en Micropython¶

Modificaremos el código anterior para conseguir un archivo con datos de calibración del sensor¶

# Biblioteca de acceso al hardware de la tarjeta
from machine import Pin, time_pulse_us
# Biblioteca de temporización
from time import sleep, sleep_us

# Velocidad del sonido en cm/us
VEL_SONIDO_cmus = 0.0343

# Tiempo máximo de lectura (tiempo para 4m de distancia)
TIEMPO_MAX = int(800/VEL_SONIDO_cmus)

# Declara el objeto 'boton' como el pin cero de entrada
boton = Pin(0, Pin.IN)

# Declara el objeto 'disparo' como el pin cinco de salida
disparo = Pin(5, Pin.OUT)

# Declara el objeto 'eco' como el pin dieciocho de entrada
eco = Pin(18, Pin.IN)

def mide():
    global disparo, eco
    
    # Inicia medición
    disparo.value(0)
    sleep_us(2)
    # Activa US por 10 microsegundos
    disparo.value(1)
    sleep_us(10)
    disparo.value(0)
    # Espera el pulso de regreso y mide el tiempo de espera
    tiempo = time_pulse_us(eco, 1, TIEMPO_MAX)
    # Calcula distancia
    distancia = tiempo*VEL_SONIDO_cmus/2
    # Regresa el valor de distancia
    return distancia
    
# Abre el archivo para el registro de datos
registro = open('calibracion.txt', 'wt')

# Lazo para veinte mediciones
for distancia_real in range(2, 24, 2):
    # Avisa de la siguiente medida
    print(f'Pon el obstáculo a {distancia_real} cm y oprime BOOT')
    # Espera a oprimir el botón
    while boton.value() == 1:
        pass
    # Lanza la medición
    distancia = mide()
    sleep(1)
    # Muestra la medición
    print(f'Distancia ({distancia_real:5.3f} cm) = {distancia:5.3f} cm')
    # Guarda los datos
    registro.write(f'{distancia_real}, {distancia}\n')

# No olvidar cerrar el archivo
registro.close()