Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
2018:rgb-controller [2019/01/14 21:34] Lukáš Gerych [Generování signálu] |
2018:rgb-controller [2019/01/15 00:08] (aktuální) Lukáš Gerych |
||
---|---|---|---|
Řádek 1: | Řádek 1: | ||
======Řízení digitálních RGB diod====== | ======Řízení digitálních RGB diod====== | ||
- | + | ---- | |
- | =====Zadání projektu===== | + | =====Zadání===== |
- | Naprogramujte řízení digitálních RGB diod WS2812B zapojených za sebou na externí DPS s rozložením 8×4 s využitím desky STM32F4DISCOVERY. V programu nadefinujte vlastní funkce pro překlápění úrovní pro bity 1 a 0 dle standardu v datasheetu. Pro zobrazení určitých barev na jednotlivých diodách využijte dvourozměrné pole s odpovídajícími hodnotami. | + | Naprogramujte řízení digitálních RGB diod WS2812B(SK6812) zapojených za sebou na externí DPS s rozložením 8×4 s využitím desky STM32F4DISCOVERY. V programu nadefinujte vlastní funkce pro překlápění úrovní pro bity 1 a 0 dle standardu v datasheetu. Pro zobrazení určitých barev na jednotlivých diodách využijte dvourozměrné pole s odpovídajícími hodnotami. |
=====Úvod===== | =====Úvod===== | ||
- | RGB diody WS2812B jsou určeny pro inteligentní ovládání LED světelných zdrojů. Mají v sobě zabudovaný čip, který podle vstupního řídícího signálu ovládá barvy a blikání diod. | + | RGB diody WS2812B jsou určeny pro inteligentní ovládání LED světelných zdrojů. Mají v sobě zabudovaný čip, který podle vstupního řídícího signálu ovládá barvy a blikání diod. Jsou k dostání v typech pouzder 5050, 3535 nebo 4020 a to na pásku nebo samostatně. |
Hlavní výhodou těchto diod je, že více než jedna z nich může být řízena jedním signálem. Jsou tedy vyžadovány pouze tři vodiče - 5V, GND a řídící signál. Zapojení je řešeno kaskádním způsobem, jak je znázorněno na obrázku níže. | Hlavní výhodou těchto diod je, že více než jedna z nich může být řízena jedním signálem. Jsou tedy vyžadovány pouze tři vodiče - 5V, GND a řídící signál. Zapojení je řešeno kaskádním způsobem, jak je znázorněno na obrázku níže. | ||
- | {{ :2018:rgb-controller:cascade.png?200 }} | + | {{ :2018:rgb-controller:cascade.png?300 }} |
- | Jedna dioda vyžaduje příjem 24 bitů - každá ze tří základních barev má 8 bitovou úroveň se kterou dosahuje 256 úrovní jasu. Celkově je tedy možné využít 16,7 milionů barev. | + | Jedna dioda vyžaduje příjem 24 bitů - každá ze tří základních barev má 8 bitovou úroveň se kterou dosahuje 256 úrovní jasu. Celkově je tedy možné využít 16,7 milionů barev. |
Každá dioda provádí změnu a zesílení signálu. To umožňuje dosáhnout větších vzdáleností. | Každá dioda provádí změnu a zesílení signálu. To umožňuje dosáhnout větších vzdáleností. | ||
Řádek 19: | Řádek 19: | ||
{{ :2018:rgb-controller:data_transfer.jpg?500 }} | {{ :2018:rgb-controller:data_transfer.jpg?500 }} | ||
- | Čas přenosu jednoho bitu je 1,25 us, to odpovídá frekvenci 800 kHz, přenosová rychlost tím pádem je 800 kbit/s. Během jedné periody se nastaví nejdříve vysoká a pak nízká úroveň. Bit 1 nebo 0 se rozlišuje podle délky nastavení těchto úrovní (viz obrázek a tabulka). Reset je daný nízkou úrovní po dobu větší jak 280 us. | + | Jednotlivé bity se posílají v pořadí nejdříve pro zelenou pak červenou a nakonec modrou barvu od nejvyššího významného bitu po nejnižší. |
+ | |||
+ | {{ :2018:rgb-controller:bits_of_colors.jpg?800 }} | ||
+ | |||
+ | Čas přenosu jednoho bitu je 1,25 us, to odpovídá frekvenci 800 kHz, přenosová rychlost tím pádem je 800 kbit/s. Během jedné periody se nastaví nejdříve vysoká a pak nízká úroveň. Bit 1 nebo 0 se rozlišuje podle délky nastavení těchto úrovní (viz obrázek a tabulka). Reset je daný nízkou úrovní. | ||
{{:2018:rgb-controller:code_level.jpg?250 }} {{ :2018:rgb-controller:level_time_table.jpg?600}} | {{:2018:rgb-controller:code_level.jpg?250 }} {{ :2018:rgb-controller:level_time_table.jpg?600}} | ||
Řádek 28: | Řádek 32: | ||
*Ochrana proti přepólování napájení, nepoškozuje IC | *Ochrana proti přepólování napájení, nepoškozuje IC | ||
*Nízká cena | *Nízká cena | ||
+ | |||
+ | [[http://fabioangeletti.altervista.org/blog/stm32-interface-ws2812b/?doing_wp_cron=1528043483.7364630699157714843750|Zdroj textu]] | ||
+ | |||
+ | ---- | ||
=====Řešení===== | =====Řešení===== | ||
Řádek 35: | Řádek 43: | ||
====Problém se zapojením diod==== | ====Problém se zapojením diod==== | ||
- | Označení pinů pouzdra diody WS2812B bylo dle [[https://www.gme.cz/data/attachments/dsh.960-538.1.pdf|datasheetu]] a jednoho [[http://archive.fabacademy.org/2016/woma/students/209/final3.html|projektu]] odlišné. Proto se nejdříve vyrobila deska s oběmi verzemi zapojení (viz obrázek), aby se zjistilo, které je správné. | + | Označení pinů pouzdra diody WS2812B bylo dle jejich datasheetu [[https://www.gme.cz/data/attachments/dsh.960-538.1.pdf|1]] [[http://www.normandled.com/upload/201607/WS2812B%20Mini%203535%20LED%20Datasheet.pdf|2]] a jednoho [[http://archive.fabacademy.org/2016/woma/students/209/final3.html|projektu]] odlišné. Proto se nejdříve vyrobila deska s oběmi verzemi zapojení (viz obrázek), aby se zjistilo, které je správné. |
{{ :2018:rgb-controller:board.jpg?500 }} | {{ :2018:rgb-controller:board.jpg?500 }} | ||
Řádek 41: | Řádek 49: | ||
Po vyslání signálu pro rozsvícení diod se ale ani jedna nerozsvítila. Po dlouhém zkoumání se zjistilo, že jenom horní dioda má na výstupu signál. Proto byl předpoklad, že správné zapojení je podle datasheetu. Signál byl ale stejný jako na vstupu a prvních 24 bitů měly být oříznuté. Počítalo se tedy s tím, že je dioda vadná. Po výměně byl ale výsledek stejný. Když se ale horní dioda vyjmula a poslal se signál do druhého zapojení, tak se zde dioda rozsvítila. | Po vyslání signálu pro rozsvícení diod se ale ani jedna nerozsvítila. Po dlouhém zkoumání se zjistilo, že jenom horní dioda má na výstupu signál. Proto byl předpoklad, že správné zapojení je podle datasheetu. Signál byl ale stejný jako na vstupu a prvních 24 bitů měly být oříznuté. Počítalo se tedy s tím, že je dioda vadná. Po výměně byl ale výsledek stejný. Když se ale horní dioda vyjmula a poslal se signál do druhého zapojení, tak se zde dioda rozsvítila. | ||
- | K oběma zapojením tedy nesmělo být zároveň přivedeno napájení. Nakonec bylo zjištěno, že pro projekt byly zakoupeny diody typu SK6812, což je kopie WS2812B akorát mají jiné uspořádaní výstupních pinů a trochu odlišné šířky pulzů. [[https://cdn-shop.adafruit.com/product-files/2686/SK6812MINI_REV.01-1-2.pdf|datasheet SK6812mini]] | + | K oběma zapojením tedy nesmělo být zároveň přivedeno napájení. Nakonec bylo zjištěno, že pro projekt byly zakoupeny diody typu SK6812, což je kopie WS2812B akorát mají jiné uspořádaní výstupních pinů a trochu odlišné šířky pulzů. [[https://cdn-shop.adafruit.com/product-files/2686/SK6812MINI_REV.01-1-2.pdf|datasheet SK6812mini]] [[https://cpldcpu.wordpress.com/2016/03/09/the-sk6812-another-intelligent-rgb-led/|srovnání WS2812B a SK6812]] |
====Kód==== | ====Kód==== | ||
- | Způsob řešení pro rozsvícení diod, je založen na využití pole se zadanými 24 bitovými hodnotami odpovídajícím barvám. Podle těchto vstupních dat se bude každou periodu určovat hodnota střídy PWM signálu, tedy zda má být generován bit 1 nebo 0. | + | Způsob řešení pro rozsvícení diod o určitých barvách, je založen na využití pole se zadanými 24 bitovými hodnotami. Podle těchto vstupních dat se bude každou periodu určovat hodnota střídy PWM signálu, tedy zda má být generován bit 1 nebo 0. |
- | Pro nastavení střídy PWM signálu se vytvořila funkce set_duty(). Parametry pro funkci jsou hodnota barvy a poradi bitu, ktery ma byt prečten. | + | Pro nastavení střídy PWM signálu se vytvořila funkce //set_duty()//. Parametry pro funkci jsou hodnota barvy a pořadí bitu, který má být přečten. |
Řádek 67: | Řádek 75: | ||
</code> | </code> | ||
- | Hlavní kód | + | V hlavním kódu jsou v nekonečné smyčce dvě podmínky pro přečtení všech bitů ze zadaného pole. V opačném případě je nastaven reset a cyklus se pak opakuje. |
+ | Pro časování změny střídy a nastavení resetu je využita funkce pro zpoždění v mikrosekundách //DWT_Delay_us()// převzatá [[https://www.youtube.com/watch?v=iq6j1hGTVR8|zde]]. | ||
+ | Aby se diodám měnila barva jsou na konci smyčky přidány další dvě podmínky, které způsobují změnu v pořadí čtení pole. | ||
+ | |||
+ | Zadaných hodnot v poli nemusí přímo odpovídat počtu zapojených diod. Způsobí to pouze vygenerování delšího signálu a výstupní signál z poslední diody nebude tím pádem přijat. Při kratším signále by se poslední diody nerozsvítily. Důležité je, aby byl nastavený reset. Uvádí se hodnota alespoň 50 us. Experimentálně bylo zjištěno, že ještě při 40 us se diody rozsvítili. V kódu je nastavena větší hodnota 1 ms kvůli měnění barev. | ||
<code c> | <code c> | ||
int main(void) | int main(void) | ||
{ | { | ||
- | /* USER CODE BEGIN 2 */ | ||
- | DWT_Delay_Init(); | ||
- | HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); | ||
- | htim2.Instance -> CCR2 = 0; //set duty cycle | ||
- | /* USER CODE END 2 */ | ||
- | |||
/* Infinite loop */ | /* Infinite loop */ | ||
/* USER CODE BEGIN WHILE */ | /* USER CODE BEGIN WHILE */ | ||
Řádek 84: | Řádek 90: | ||
uint8_t arrayRGBsize = 8; | uint8_t arrayRGBsize = 8; | ||
uint8_t numbit = 0; //number of bit | uint8_t numbit = 0; //number of bit | ||
- | uint8_t numcolor = 0; | + | uint8_t numcolor = 0; //number of color |
uint8_t moves = 0; | uint8_t moves = 0; | ||
Řádek 131: | Řádek 137: | ||
} | } | ||
</code> | </code> | ||
+ | |||
+ | Hodnota u funkce //DWT_Delay_us()// se musela korigovat tak, aby zadané barvy přibližně odpovídali zobrazeným. S přibývajícím kódem se totiž rychlost procesoru snižuje a časování pak není přesné. V ukázce jde vidět, že jedna dioda problikává, což znamená, že se střída mění tam kde by neměla. | ||
+ | Pro více zapojených diod by tento způsob nebyl dostačující. | ||
+ | Lepším způsobem by bylo využití jiného časovače se stejnou periodou, ve kterém by se v každém cyklu střída signálu měnila. Ideálně při každé náběžné hraně PWM signálu, jak je zřejmě naznačeno [[https://electronics.stackexchange.com/questions/367294/how-to-count-the-number-of-the-generated-pwm-pulse-on-stm32|zde]]. Bohužel se tohoto nepodařilo docílit. | ||
+ | |||
====Ukázka==== | ====Ukázka==== | ||
- | V ukázce je v horním zapojení desky přidaná jedna dioda typu WS2812B a ve spodním jsou SK6812. | + | V horním zapojení desky je přidaná jedna dioda typu WS2812B a ve spodním jsou SK6812. |
- | {{youtube>77tzE8z8MQc?medium}} | + | {{ youtube>77tzE8z8MQc?medium }} |
+ | |||
+ | ---- | ||
=====Závěr====== | =====Závěr====== | ||
Prostudoval se princip řízení digitálních RGB diod a vygeneroval signál pro jejich ovládání barev. Z časových důvodů, kdy nastal problém se zapojením diod, nebyla vyrobena deska s rozložením 8x4, jak je uvedeno v zadání, ale ponechala se původní se čtyřmi diodami. Vytvořený kód zajišťuje rozsvícení barev podle zadaného pole a po krátkém čase dělá jejich změnu. | Prostudoval se princip řízení digitálních RGB diod a vygeneroval signál pro jejich ovládání barev. Z časových důvodů, kdy nastal problém se zapojením diod, nebyla vyrobena deska s rozložením 8x4, jak je uvedeno v zadání, ale ponechala se původní se čtyřmi diodami. Vytvořený kód zajišťuje rozsvícení barev podle zadaného pole a po krátkém čase dělá jejich změnu. | ||
+ | |||
+ | ===Zdrojové soubory projektu=== | ||
+ | {{:2018:rgb-controller:mpoa_projekt_rgb-controller.zip }} | ||