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:

obr

  • drugie - to uruchomienie DMA dla tego peryferium dla requestu “SPIx_TX” w tym przypadku SPI1:

obr

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.