neopixel.py

LattePanda 3 Delta (id : lattepanda-3) · Fichier : neopixel.py · Langage : Python · Usage : Animer un ruban WS2812 depuis Python

La trame WS2812 à 800 kHz est générée par le MCU, l'animation vient de Python : le ruban d'adresseables se met au niveau des scripts du PC. Ambiance lumineuse pilotable par la caméra ou la musique.

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. 12 WS2812 + alimentation 5 V externe ≥ 1 A + résistance 330-470 Ω sur la data.

Branchement

Data du ruban via 470 Ω sur D5, VDD sur l'alimentation externe, GND commun avec le connecteur. Condensateur 1000 µF conseillé sur l'alimentation du ruban.

Fonctionnement

La bibliothèque envoie la liste des couleurs au firmware PinPong qui bit-bang la trame NRZ sur le timer. Le PC rythme l'animation, le MCU tient les 1,25 µs par bit. 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

Pilotage par analyse spectrale du micro (musique → lumière), ou météo en dégradé de couleurs.

neopixel.py

#!/usr/bin/env python3
# 12 WS2812 sur D5 — PinPong pilote la trame, le MCU la genere.
from pinpong.board import Board, Pin
from pinpong.libs.dfrobot_neopixel import Neopixel
import time

Board().begin()
ruban = Neopixel(Pin.D5, 12)

COULEURS = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0)]

print("Comete RGB (Ctrl-C pour sortir)")
try:
    tete = 0
    while True:
        ruban.rainbow(0)                  # fond discret
        for i in range(12):
            r, g, b = COULEURS[(tete + i) % 4]
            ruban.set_pixel(i, r // 4, g // 4, b // 4)
        ruban.set_pixel(tete, 255, 255, 255)   # tete blanche
        ruban.show()
        tete = (tete + 1) % 12
        time.sleep(0.08)
except KeyboardInterrupt:
    ruban.rainbow(0)
    print("\nRuban eteint")

← Retour à la fiche