respiration.py
Le PWM du 32U4 suit une sinusoïde calculée sur le PC : la rampe est parfaitement lisse car le x86 a tout le temps de calculer 50 points par seconde. Le démon visuel du couple hote-MCU.
Matériel requis
Une LattePanda 3 Delta (x86 Intel N5105, Windows 10/11 ou Ubuntu) avec son coprocesseur Arduino compatible (ATmega32U4) relié aux deux connecteurs 50 broches. 1 LED + résistance 330 Ω sur D3.
Branchement
Anode sur D3 via 330 Ω, GND. D3 est une broche PWM de l'ATmega (marquée ~ sur les schémas).
Fonctionnement
write_analog écrit dans le registre OCR du timer ; la phase sinusoïdale est recalculée à chaque tour. La latence série (~1 ms) est masquée par les 20 ms de pas. Côté hôte : pip install pinpong puis python3. Côté MCU : l'ATmega32U4 apparaît comme un port COM — programmez-le avec l'Arduino IDE (carte « Arduino Leonardo »).
Pour aller plus loin
Dégradé d'adresse (couleur = heure du jour), ou respiration synchronisée avec un fichier audio.
respiration.py
#!/usr/bin/env python3
# Rampe de luminosite sur D3 (PWM du 32U4) — cycle complet 4 s.
from pinpong.board import Board, Pin
import time, math
Board().begin()
led = Pin(Pin.D3, Pin.PWM_OCR)
print("Respiration (Ctrl-C pour sortir)")
try:
t0 = time.time()
while True:
phase = (time.time() - t0) % 4.0 / 4.0 # 0..1
duty = int(512 + 511 * math.sin(2 * math.pi * phase))
led.write_analog(duty) # 0..1023
time.sleep(0.02)
except KeyboardInterrupt:
led.write_analog(0)
print("\nLED eteinte")