Categorías
Microcontroladores Micropython

Escenarios de uso de `async` en MicroPython

Resumen de [[https://github.com/peterhinch/micropython-async/blob/master/v3/docs/TUTORIAL.md]]

1. Gestión de múltiples tareas de E/S

  • Escenario: Leer datos de un sensor mientras se actualiza una pantalla LED o se responde a pulsaciones de botones.
  • ¿Por qué async?: Los microcontroladores suelen necesitar ejecutar tareas como esperar datos de sensores, escribir en pantallas o gestionar interacciones. async permite que estas tareas se ejecuten de forma cooperativa (cediendo el control cuando están inactivas) en lugar de bloquearse entre sí.
  • Ejemplo:

    async def leer_sensor():
      while True:
          datos = sensor.read()
          # ... procesar datos ...
          await asyncio.sleep(0.1)  # Ceder control a otras tareas
    
    async def actualizar_pantalla():
      while True:
          pantalla.mostrar(estado)
          await asyncio.sleep(1)

2. Retrasos no bloqueantes

  • Escenario: Realizar acciones con intervalos distintos (ej.: parpadear un LED cada 500 ms mientras se registran datos cada 2 segundos).
  • ¿Por qué async?: time.sleep() bloquea todo el programa. async lo reemplaza con await asyncio.sleep(), liberando el microcontrolador para otras tareas durante las esperas.

3. Gestión de protocolos de comunicación

  • Escenario: Comunicación por UART, I2C o Wi-Fi mientras se ejecuta otro código.
  • ¿Por qué async?: Las comunicaciones suelen requerir que se espere por las respuestas. async permite iniciar una solicitud, luego cambiar a otras tareas y finalmente reanudar la tarea previa al recibir datos.
  • Ejemplo:
    async def obtener_clima():
      while True:
          respuesta = await wifi.get('http://api.weather.com')
          # ... procesar respuesta ...

4. Tareas en segundo plano con recursos compartidos

  • Escenario: Registrar datos en una tarjeta SD mientras se controla un motor.
  • ¿Por qué async?: Usar “primitivas de sincronización”, por ejemplo Lock (de micropython-async) para compartir recursos de forma segura entre tareas.
  • Ejemplo:

    lock = asyncio.Lock()
    
    async def registrar_datos():
      async with lock:
          with open('log.txt', 'a') as f:
              f.write(datos)
    
    async def controlar_motor():
      async with lock:
          motor.ejecutar(velocidad)

Notas clave para async en MicroPython

  • Multitarea cooperativa: Las tareas deben usar await explícitamente para ceder el control (no hay multitarea preemptiva, es decir, no hay control central de tareas).
  • Ligero: Usa mucha menos memoria que los hilos, lo cual es crítico para microcontroladores.
  • Bucle de eventos: La librería asyncio gestiona la planificación de tareas (similar al bucle de eventos de JavaScript).

Para más detalles, consulta el tutorial de micropython-async.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *