respiration.py

LattePanda Alpha · 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 Alpha (x86 Intel m3-7Y30, Windows 10 ou Linux) avec son coprocesseur ATmega32U4 compatible Arduino Leonardo sur les 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. L'ATmega32U4 est un vrai Leonardo : brochez-le en « Arduino Leonardo » dans l'IDE via son port COM interne. Côté hôte, la bibliothèque DFRobot lattepanda (Python) dialogue avec lui par série.

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