taches-cooperatives.py
Tres tareas periódicas (LED 2 Hz, pitido 1 Hz, medida cada 5 s) se ejecutan en un mini planificador cooperativo de 15 líneas. Este patrón sustituye a los delay() anidados en cuanto un proyecto anima más de un pin.
Hardware
Una Raspberry Pi Pico W (RP2040 + chip radio Wi-Fi de 2,4 GHz) con MicroPython instalado, alimentada por USB. 1 LED + 330 Ω en GP15, 1 zumbador pasivo en GP2 (opcional, quita la tarea si no).
Cableado
LED en GP15 con 330 Ω a GND; zumbador entre GP2 y GND. Adapta los pines a los libres según el proyecto.
Funcionamiento
Cada tarea guarda su vencimiento; el bucle compara con time.ticks_diff (robusto ante el desbordamiento de 32 bits) y reprograma el siguiente. sleep_ms(1) evita ocupar la CPU al 100%.
Ejecución
Instala la versión MicroPython « Pico W » (BOOTSEL + .uf2) y copia el script vía Thonny. Como el LED de usuario lo gestiona el chip de radio, los ejemplos de salida usan un LED externo.
Variantes
Añade tareas sobre la marcha con creer(), o pasa a uasyncio (asyncio de MicroPython) para tareas orientadas a eventos con esperas no bloqueantes.
taches-cooperatives.py
# Ordonnanceur cooperatif : plusieurs taches sans fil ni RTOS.
# Chaque tache est appelee a sa frequence ; aucune ne bloque les autres.
from machine import Pin, ADC
import time
led = Pin(15, Pin.OUT)
buzz = Pin(2, Pin.OUT)
adc = ADC(4)
taches = []
def creer(periodo_ms, fonction):
taches.append([time.ticks_ms() + periodo_ms, periodo_ms, fonction])
def clignoter():
led.value(not led.value())
def bip_court():
buzz.on()
time.sleep_ms(20)
buzz.off()
def mesurer():
v = adc.read_u16() * 3.3 / 65535.0
t = 27.0 - (v - 0.706) / 0.001721
print("T = %.1f C" % t)
creer(500, clignoter) # 2 Hz
creer(1000, bip_court) # 1 Hz
creer(5000, mesurer) # toutes les 5 s
print("Ordonnanceur demarre (%d taches)" % len(taches))
while True:
maintenant = time.ticks_ms()
for tache in taches:
if time.ticks_diff(maintenant, tache[0]) >= 0:
tache[0] = time.ticks_add(tache[0], tache[1])
tache[2]()
time.sleep_ms(1) # cede la main : evite la pleine charge CPU