respiration.py

LattePanda 3 Delta (id : lattepanda-3) · Fichier : respiration.py · Langage : Python · Usage : Respiration LED en PWM piloté par Python

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")

← Retour à la fiche