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

W tej części kursu zajmiemy się obsługą modułu Bluetooth. Na warsztat weźmiemy popularny moduł HC-06, który wykorzystamy do sterowania kolorami świecenia adresowalnych diod LED RGB WS2812b na pasku z giętkiego laminatu.

Bluetooth

Bluetooth to standard sieciowy tworzenia bezprzewodowych sieci osobistych (PAN) o małym zasięgu. Został stworzony, aby łatwo i szybko przyłączać do komputera, telefonu lub tabletu urządzenia peryferyjne, takie jak klawiatury, myszki czy zestawy słuchawkowe lub aby wymieniać dane między tymi urządzeniami. Prace nad protokołem Bluetooth zostały zainicjowane przez firmę Ericsson w 1994 roku. Wspólnie z czterema innymi firmami –  IBM, Intelem, Nokią i Toshibą –  firma Ericsson założyła grupę SIG (Special Interest Group), której celem było stworzenie standardu Bluetooth. Obecnie nad rozwojem sieci Bluetooth pracuje grupa zadaniowa IEEE 802.15.1, Instytutu IEEE.

W architekturze Bluetooth istnieją węzły – urządzenia typu master oraz slave. Każde urządzenie master może w danym czasie być połączone z maksymalnie siedmioma innymi aktywnymi urządzeniami typu slave. Mimo to w pojedynczej sieci Bluetooth może znajdować się do 255 sparowanych urządzeń – część z nich przechodzi wtedy w stan uśpiony. Urządzenie master decyduje o tym, z którym urządzeniem typu slave wymiena ono w danej chwili dane. Wymiana danych następuje tylko pomiędzy węzłami typu master i slave.

Standard sieci Bluetooth nie poprzestaje, podobanie jak większość innych standardów sieci lokalnych (takich jak sieć WiFi – IEEE 802.11, czy Ethernet – IEEE 802.3), na dostarczeniu kanału transmisyjnego pomiędzy urządzeniami. Definiuje on dodatkowo protokoły warstwy aplikacji – profile sieci Bluetooth określające sposób komunikacji z konkretnymi urządzeniami lub w konkretnym celu. Istnieją profile transmisji dźwięku do zestawów słuchawkowych, przyłączania klawiatury i myszki, przesyłania krótkich wiadomości tekstowych czy zestawiania wirtualnego połączenia szeregowego (COM/RS-232), a także wiele innych.

Moduł HC-06

Opisywany moduł jest bardzo prosty w obsłudze. Wspiera on tylko jeden z wymienionych powyżej profili Bluetooth – profil portu szeregowego. Moduł posiada cztery wyprowadzenia: piny zasilania – VCC i GND oraz piny transmisji i odbioru danych interfejsu UART – TX i RX. Po przyłączeniu do nich mikrokontrolera oraz sprawowaniu z modułem urządzenia Bluetooth i otwarciu wirtualnego portu szeregowego na tym urządzeniu możliwa jest między nimi wymiana danych na podobnej zasadzie, jak gdyby były one połączone kablem poprzez adapter UART-USB lub zwykły port COM – RS232.

Fot. 1. Wygląd modułu HC-06

Konfiguracja modułu – nadanie mu własnej nazwy, wybór szybkości pracy wirtualnego portu szeregowego czy nadanie kodu pin odbywa się również za pośrednictwem interfejsu UART przy pomocy specjalnych poleceń, przed sparowaniem urządzeń i otwarciem portu szeregowego. Obsługiwane są następujące polecenia konfiguracyjne:

  • AT+BAUD[Liczba z zakresu od 1 do 8] – ustawia szybkość wirtualnego portu szeregowego, liczba z zakresu od 1 do 8 odpowiada jednej z wymienionych szybkości pracy: 1 – 1200 bps, 2 – 2400 bps, 3 – 4800 bps, 4 – 9600 bps, 5 – 19200 bps, 6 – 38400 bps, 7 – 57600 bps, 8 – 115200 bps. Przykładowo, polecenie “AT_BAUD4” ustawi szybkość połączenia na 9600 bps.
  • AT+NAME[Nazwa] – ustawia nazwę jaką rozgłasza urządzenie, np. “AT+NAMEBT_TEST”.
  • AT+PIN[4 cyfry] – ustawia pin kod którego podanie wymagane jest do sparowania urządzeń, np. “AT+PIN1234”.

Domyślne parametry to nazwa: “HC-06”, szybkość połączenia: 9600 bps oraz pin kod: 1234. Parametry po zmianie są przechowywane w pamięci EEPROM, więc konfiguracja nie jest tracona po odcięciu zasilania.

Tworzymy projekt

Program, który utworzymy w kolejnych krokach, będzie korzystał z dwóch peryferiali: SPI – do wygenerowania sygnału sterującego dla diod WS2812b, dokładniej opisanego w numerze marcowym, oraz interfejsu UART – do wymiany danych z modułem. Z urządzenia bezprzewodowego przyłączonego do modułu Bluetooth będą przesyłane polecenia zmiany koloru diod na pasku w postaci ramek danych. Ramka ta zaczynać się będzie od znaku @ oraz kończyć znakiem nowej linii – „\r\n”. Wewnątrz ramki znajdą się wartości numeryczne z zakresu od 0 do 255, rozdzielone przecinkami i zgrupowane po trzy. Każde kolejne grupy wartości będą opisywać kolor kolejnej diody na pasku – pierwsza liczba w grupie opisuje jasność składowej czerwonej, druga – zielonej, a trzecia – niebieskiej.

Poniżej przykład ramki danych, ustawiającej na kolejnych 30 diodach na pasku, naprzemiennie kolory – czerwony, zielony i niebieski:

Format powyższej ramki nie pozwala na wygodne ręczne sterowanie diodami przy pomocy takiej aplikacji jak np. PuTTY, ułatwia jednak napisanie własnej aplikacji na telefon, tablet lub komputer.

Zatem do dzieła! Standardowo już włączamy program STM32CubeMX i tworzymy w nim nowy projekt, wybierając posiadany przez nas mikrokontroler (u mnie, na płytce KA-NUCELO-F411CE, jest to układ STM32F411CEU6).

  1. Na pierwszym ekranie konfiguratora, zatytułowanym „Pinout”, ustawiamy, jakie źródło sygnału taktującego podłączone jest do układu – na liście po lewej stronie ekranu, rozwijamy pozycję „RCC” i w polu „High Speed Clock (HSC)” wybieramy „Crystal/Ceramic Resonator”.

Następnie musimy wybrać i uruchomić interfejs SPI. Wykorzystywany przeze mnie układ dysponuje aż pięcioma takimi interfejsami. Nie ma znaczenia, który z nich wybierzemy, jednak, ponieważ peryferiale SPI1, SPI4 i SPI5 taktowane są z innej szyny niż SPI2 i SPI3, na potrzeby tego projektu, wybieramy któryś z tych pierwszych. W przykładzie użyję interfejsu SPI1 oraz pinów PA5 oraz PA7, odpowiednio w roli SPI1_SCK – sygnału zegara – oraz SPI1_MOSI – wyjścia danych. Jako tryb pracy wybieramy pozycję: „Transmit Only Master”. Więcej informacji na temat znaczenia tych parametrów podane zostało w części poświęconej interfejsowi SPI.

Do pobrania