LED WS2812-64 #
Modul obsahuje 64 farebných LED usporiadaných do matice v sériovom zapojení. Každá LED obsahuje obvod WS2812, pomocou komunikačného protokolu je možné riadiť farbu a intenzitu každej LED na module. Modul obsahuje dva konektory, jeden pre pripojenie napájania a vstupného dátového vodiča, druhý pre propojenie nasledujúceho modulu.
Obr. 39 LED modul WS2812-64.#
Obr. 40 Sériové zapojenie v LED module.#
Pripojenie modulu k mikrokontroléru je pomocou troch vodičov, napájanie +5V, zem a dátový vodič. Pre komunikáciu s modulom je použité rozhranie SPI. Pre prenos dát do modulu je použitý len signál MOSI, nie je použitý hodinový synchronizačný signál zbernice SCLK. Komunikácia preto vyžaduje pevné nastavenie časovania pri prenose dát.
Pripojenie modulu k Nucleo-64
Obr. 41 Pripojenie modulu k Nucleo-64 cez rozhranie SPI1.#
Komunikácia #
Komunikácia s obvodmi WS2812, ktoré riadia stav každej LED je sériová, po jednom dátovom vodiči, s pevným časovaním určujúcim logické stavy L a H.
Obr. 42 Časovanie logických stavov L,H a RESET.#
Interval |
Min |
Max |
|---|---|---|
\(T_{reset}\) |
\(300 \mu s\) |
\(\infty\) |
\(T_{0H}\) |
\(220 ns\) |
\(380 n s\) |
\(T_{0L}\) |
\(750 ns\) |
\(1.6 \mu s\) |
\(T_{1H}\) |
\(750 ns\) |
\(1.6 \mu s\) |
\(T_{1L}\) |
\(22 ns\) |
\(420 n s\) |
Každá farba LED je určená 8-bitovou hodnotou, pre 3 farby (RGB) potrebujeme preto vyslať pre každú LED postupnosť 24 bitov.
Obr. 43 Kódovanie farebnej informácie.#
LED sú zpojené v sérii, každý riadiaci obvod si z dátového reťazca ponechá 24 bite o stave LED a zbytok reťazca prepošle k nasledujúcej LED. Informácie o stave LED sú za sebou bez medzier, po ukončení vysielania je medzi jednotlivými reťazcami časový interval dlhší ako \(300 \mu s\), ktorý je interpretovaný ako reset komunikácie.
Obr. 44 Princíp komunikácie na sériovej zbernici.#
Programovanie #
Pre riadenie matice LED je určená knižnica lib_ws2812.py. Hodnoty farieb su kódované do bitovej postupnosti, ktorá je pomocou SPI rozhrania vyslaná do matice.
Kódovanie hodnôt v bitová postupnosti v registri SPI rozhrania pri bitovej rýchlosti 4Mbit/sec zabezpečuje správne časovanie prenosu:
hodnota 0 - postupnosť 1000, doba trvania stavu H - 250 usec
hodnota 1 - postupnosť 1110, doba trvania stavu H - 750 usec
Na vyslanie 8 bitov pre LED potom potrebujeme vyslať 4 Byte v SPI, celkový počet pre jednu LED v matici je 12 Byte.
b7b6 b5b4 b3b2 b1b0
Doba prenosu dát pre jednu LED a celú maticu je potom
Metódy knižnice
WS2812(spi_bus=1, led_count=1, intensity=1)
WS2812.show(data)
Príklady #
Príklad 1. Riadenie farieb LED matice
Inicializácia rozhrania a dáta pre rozsvietenie LED matice
from lib_ws2812 import *
matrix = WS2812(spi_bus=1, led_count=64)
data = [
(24, 0, 24), ( 0, 24, 0), ( 0, 0, 24), (12, 12, 0),
(0, 12, 12), (12, 0, 12), (24, 0, 0), (21, 3, 0),
(18, 6, 0), (15, 9, 0), (12, 12, 0), ( 9, 15, 0),
(6, 18, 0), ( 3, 21, 0), ( 0, 24, 0), ( 8, 8, 8)
]
matrix.show(data) # rozsvieti 16 LED
data=data*4
matrix.show(data) # rozsvieti 64 LED
Opakovaná inicializácia knižnice zhasne LED.
Príklad 2. Náhodné farby
import math
from lib_ws2812 import *
matrix = WS2812(spi_bus=1, led_count=64)
def data_generator(led_count):
data = [(0, 0, 0) for i in range(led_count)]
step = 0
while True:
red = int((1 + math.sin(step * 0.1324)) * 127)
green = int((1 + math.sin(step * 0.1654)) * 127)
blue = int((1 + math.sin(step * 0.1)) * 127)
data[step % led_count] = (red, green, blue)
yield data
step += 1
for data in data_generator(matrix.led_count):
matrix.show(data)
pyb.delay(10)
Príklad 3. Demonštračný program
Demonštrácia vlastností LED matice je v súbore demo_ws2812.py.
import math
from lib_ws2812 import *
from demo_ws2812 import *
matrix = WS2812(spi_bus=1, led_count=64, intensity=0.05)
while(True):
anim_1 = animation_1(matrix.led_count)
for i in range(240):
matrix.show(next(anim_1))
anim_2 = animation_2(matrix.led_count)
for i in range(240):
matrix.show(next(anim_2))
anim_3 = animation_3(matrix.led_count)
for i in range(240):
matrix.show(next(anim_3))