#026 - LIB04 - STM32 HAL WS2812B
Dziś szybki wpis z krótkim opisem biblioteki do sterowania diodkami powszechnie znanymi jako “NeoPixel” - WS2812B - temat odkopany przy okazji świąt, chyba co roku wtedy coś z nimi robię.
Bilbiotekę można znaleźć na moim gitlabie: https://gitlab.com/embedownik/WS2812B.
Biblioteka jest totalnie podstawowa - nie ma w sobie animacji (tzn. jest kilka testowych, ale nie one są celem biblioteki + działają blokująco i tylko do testów), umożliwia ustawienie koloru wybranej ledki (w RGB lub HSV), odświeżenie paska - więc ewentualne animacje trzeba dobudować na warstwie wyżej.
Nie ma wsparcia dla podwójnego buforowania itp - głównie dlatego, że powstawała dla projektu, który wykorzystywał mały mikrokontroler STM32F030F4P6 i nie było to potrzebne. Nie planuję dodać do niej takiej opcji w przyszłości - prawdopodobnie jednak powstanie alternatywa dla tej biblioteki z większą ilością opcji/konfiguracji.
Do działania potrzebuje odpowiednio skonfigurowane SPI + DMA. O konfiguracji później, natomiast nie będę w tym wpisie umieszczał informacji na temat “niskopoziomowego” działania tej biblioteki - w jaki sposób można wykorzystać SPI do komunikacji z diodami - odeślę w tym temacie do np. tej strony: https://msalamon.pl/adresowalne-diody-ws2812b-na-stm32-cz-1/.
Co ją wyróżnia względem wielu dostępnych na githubie itp - jest ona wydzielona z projektu i łatwo można ją reużyć/aktualizować ponieważ repozytorium jest przeznaczone tylko na nią. Dodatkowo jak już wspomniałem wcześniej - nie zawiera w sobie bezpośrednio żadnej konfiguracji - należy ją do niej przekazać z zewnętrz - dzięki temu zadziała na każdej rodzinie STM32 (chyba, ale nie widzę aktualnie żadnego problemu z tym).
W skrócie algorytm działania:
- biblioteka zawiera 2 statyczne bufory:
- (1)aktualne ustawienia kolorów paska (w RGB)
- (2)bufor na dane przesyłane przez SPI do DMA
- wpisywanie nowych kolorów powoduje ustawienie danych w buforze 1, bez ich aktualizacji na taśmie
- aby wyświetlić kolorki na diodach należy wywołać funkcję “WS28B12_RefreshScreen(void);”
- w środku biblioteka wygeneruje bufor(2) na podstawie kolorów diod
- następnie ten bufor zostaje przekazany do SPI/DMA do przesłania do paska.
Konfiguracja biblioteki
Instrukcja znajduje się w pliku readme.md - tutaj “spolszczona” wersja.
Biblioteka nie zawiera w sobie konfiguracji SPI i DMA - należy to wykonać z zewnętrz (dobrze się tu sprawdzi cubeMX) i zainicjalizować bibtiotekę za pomocą funkcji “WS28B12_Init(&hspi1);” przekazując adres na już wcześniej skonfigurowane i zainicjalizowane peryferium.
Użytkownik musi przekazać bibliotece informację o ilości użytych diod - w tym celu należy w projekcie utworzyć plik “board.h” i zdefiniować ją przez wartość defina “WS28B12_LEDS_NUMBER”:
/* settings for WS28B12 library */
#define WS28B12_LEDS_NUMBER (24U)
w pliku board.h powinna też znaleźć się linijka:
#include <main.h>
dzięki temu bibioteka będzie miała dostęp do biblioteki HAL itp.
Wymagania odnośnie peryferium SPI - w zasadzie są 2:
- pierwsze to jego częstotliwość wyjściowa - musi wynosić 3MHz, czyli w CubeMX/IDE oczekujemy wartości pola “Baud Rate” 3 MBit/s:
- drugie - to uruchomienie DMA dla tego peryferium dla requestu “SPIx_TX” w tym przypadku SPI1:
Przykład wykorzystania
Filmik ze starego projektu - zegarek w wykorzystaniem diod WS2812B - jego animacja startowa.
https://www.youtube.com/watch?v=blQs4nSXCDM
jeszcze nie opanowałem dobrej metody na filmiki z yt w Jekyllu - więc URL.
Po niej godzina jaka jest wyświetlana to 14:29.