Introducción al ESP32 con Micropython¶
Oscar Yáñez Suárez
Laboratorio de Neuroimagenología
oyanez@izt.uam.mx

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:
- Tools > Manage plug-ins : instalar esptool
- Tools > Options > Interpreter : Install or update Micropython
Primer programa en Micropython¶
Haremos parpadear un led. Pon atención a las instrucciones de cableado.¶

# 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.¶

# 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()