[8] STM32CUBE w przykładach (obsługa Bluetootha)

  1. Po wykonaniu wszystkich powyższych kroków parujemy nasz komputer z modułem Bluetooth. Pod Windowsem 10 uruchamiamy “Ustawienia” i przechodzimy do zakładki “Urządzenia” -> “Bluetooth”, tam odnajdujemy urządzenie “ep_bt”. Zaznaczamy je, klikamy “Sparuj” i podajemy pin kod “3498”. Pod Linuksem jest to zależne od używanego środowiska graficznego.
Rys. 10. Parowanie urządzeń Bluetooth w systemie Windows 10
  1. Teraz otwieramy Menedżera urządzeń i rozwijamy zakładkę “Porty (COM i LPT)”. Zapamiętujemy (lub zapisujemy) numer portu COM pierwszego urządzenia Bluetooth. Pod Linuksem identyfikator portu nowego urządzenia możemy sprawdzić poleceniem dmesg.
Rys. 11. Wirtualne porty szeregowe profilu portu szeregowego widoczne w Menedżerze urządzeń w systemie Windows 10
  1. Nie pozostaje nam już nic innego jak otworzyć port szeregowy w programie PuTTY i przesłać do mikrokontrolera ramkę danych. W polu “Connection Type:” zaznaczamy opcję “Serial”, w polu “Serial line” podajemy identyfikator portu szeregowego, a w polu “Speed”, szybkość połączenia – 9600, następnie klikamy przycisk “Open” i w oknie konsoli, które pojawi się po chwili oczekiwania, wklejamy testową ramkę danych oraz klikamy klawisz Enter.

Testowa ramka danych:

Rys. 12. Konfiguracja połączenia szeregowego w programie PuTTY

Na pasku LED, na kolejnych diodach, powinny pojawić się na przemian kolory: czerwony, zielony i niebieski.

Jak to działa?

Biblioteka frame_parser.h/frame_parser.c odpowiada za interpretację danych otrzymanych przez interfejs UART z modułu Bluetooth. W odpowiednich momentach wywołuje ona funkcje biblioteki ws2812b, ustawiając kolor konkretnej diody na podstawie danych odebranych z ramek lub wywołując funkcję generującą sygnał – ws2812b_refresh(), gdy nie jest przetwarzane żadne przerwanie. Podobnie jak poprzednio, funkcja frame_parser_init() generuje strukturę przechowującą zmienne konfiguracyjne, bufory danych oraz uchwyt biblioteki ws2812b (wygenerowany przez funkcję ws2812b_init()). Funkcja frame_parser_recv_char() wywoływana jest w momencie otrzymania nowego bajtu danych – znaku ASCII przez interfejs UART, dodaje on do bufora nowy znak, a w odpowiednim momencie (po odebraniu znacznika końca ramki), ustawia ona flagę wymuszającą interpretację nowej ramki przez kolejną omawianą funkcję. Funkcja frame_parser_process_frame() wywoływana jest ciągle, w pętli głównej programu, gdy zachodzi taka potrzeba – gdy ustawiona jest flaga wymuszająca interpretację ramki, funkcja odczytuje z odebranej ramki wartości natężeń poszczególnych składowych kolorów kolejnych diod i ustawia na diodach te kolory, a dalej – po zinterpretowaniu całej ramki, wywołuje funkcję ws2812b_refresh(), generująca sygnał sterujący.

W pliku main.c, w sekcji USER CODE 0, tworzone są zmienne przechowujące uchwyty dla obu bibliotek oraz dwie funkcje:

  • HAL_UART_RxCpltCallback(), wykonywana w przerwaniu, w momencie otrzymania nowego znaku przez interfejs UART oraz
  • setup_uart(), wysyłająca do modułu Bluetooth, polecenia sterujące.

Następnie, w sekcji USER CODE 2 są inicjowane uchwyty obu bibliotek, wywoływana jest funkcja uart_setup() oraz uruchamiana jest obsługa przerwań peryferialu UART. W sekcji USER CODE 3 ciągle wywoływana jest, omówiona powyżej, funkcja frame_parser_process_frame().

Aleksander Kurczyk

Do pobrania

Autor: