Thingy:52 i Raspberry: odczyt czujników ruchu (Mark II)

Budując „sterowaną” wersję podstawy do teleskopu (Mark II),  postanowiłem wykorzystać Thingy:52. Urządzonko zawiera pokaźny zestaw czujników położenia, których użyję do pozycjonowania tuby. Stało się to możliwe dopiero po rozwiązaniu wszystkich kwestii związanych zasilaniem i resetowaniem Thingy (zobacz: Thingy:52 – zasilanie z Raspberry). Teraz muszę nauczyć się jak odczytywać interesujące mnie parametry położenia poprzez interfejs BTLE  z Raspberry.

Zdaję sobie sprawę, że Thingy:52 nie jest zbytnio popularną platformą dla zastosowań amatorskich. Jednak informacje, które znajdziecie w tym tekście, przydadzą się w obsłudze każdego podobnego urządzenia wystawiającego dane z czujników przez BTLE. 

Tutaj znajdziecie indeks tekstów na temat budowy podstawy teleskopu

Kąty Eulera

Tradycyjny układ odniesienia składa się z osi x, y, z. Przyjmuje się, że:

  • oś x wskazuje kierunek północny,
  • oś y – wschodni
  • oś z – wskazuje na wysokość, ale w kierunku środka ziemi (tzn. im wyżej, tym większa wartość ujemna).

System ten nazywany jest również NED – North-East-Down.
Flight dynamics with text.png
By ZeroOne – self-made using Blender, CC BY 3.0, Link

W przestrzeni obiekty mogą obracać się wokół tych 3 osi, czego efekty będą następujące:

  • Wokół osi z (yaw), w płaszczyźnie poziomej – czyli w kierunku – np. wyznaczanymi przez kompas (heading),
  • Osi y (pitch), w płaszczyźnie pionowej – a więc wznoszenie, opadanie – kąt azymutalny,
  • Osi x(roll) – wokół własnej osi.

Z punktu widzenia montażu azymutalnego (AZ, Altazimuth), najbardziej będą mnie interesowały komponenty yaw (kierunek, azymut) oraz pitch (kąt podniesienia, altitude). Wszystkie te parametry można odczytać z charakterystyk BTLE Thingy:52.

Charakterystyki

Pełną listę usług i charakterystyk dla Thingy:52 znajdziecie na stronach Nordic: dokumentacja thingy:52. Najpotrzebniejsze rzeczy:

Co Wartość Typ Wyjście Uwagi
UUID usługa ruchu (motion) EF68xxxx-9B35-4933-9B10-52FFA9740042
Kierunek (heading) xxxx = 0409 Notyfikacja
  • int32
W stopniach, format 16q16 (16 bitów znaczących i 16 dziesiętnych)
Kąty Eulera xxxx = 0407 Notyfikacja
  • int32_t – roll
  • int32_t – pitch
  • int32_t – yaw
W stopniach, format 16q16

Wykorzystanie charakterystyk

Do tematu wykorzystania charakterystyk BTLE podchodziłem już w tekście Thingy 52: usługi pod Raspberry PI Zero (w).  Znajdziecie tam trochę teorii. Polecam lekturę, będzie Wam łatwiej zrozumieć poniższe podejście.

Spróbujmy wylistować interesujące nas charakterystyki (mój Thingy ma adres MAC E3:F2:CA:0B:88:1E, niektóre linijki usunąłem dla  zachowania przejrzystości tekstu):

Zauważcie „ef680400” na liście usług („primary”) i całą listę charakterystyk „ef6804xx” („characteristics”).  Mnie interesują:

Kierunek

Zajmijmy się kierunkiem  – charakterystyką o UUID zaczynającym się od ef680409, uchwycie 0x49 do 0x4c (0x4c to uchwyt do następnej usługi):

Interesują mnie 0x004b: deskryptor typu2902 – CCCD. Zapiszę do niego „1”, żeby dostać notyfikacje o wartości kierunku:

Teraz dostaję notyfikacje o kierunku:

Zatrzymam je:

Wartość „fc fe 46 01” należy odczytać jako 0x0146fefc.

Kąty Eulera

Dla usługi 407 – kąty Eulera:

Tutaj sytuacja trochę bardziej skomplikowana – z ostatniego wpisu:

  • Roll: 7c cf b3 00 (00 b3 cf 7c)- obrót wokół osi,
  • Pitch: 94 8e 00 00 (00 00 8e 94) – pokazuje kąt podniesienia, -90 – 0-90 stopni,
  • Yaw: ed 5f be ff – (ff be 5f ed) pokazuje kierunek.

Przyznaję, dostanie się do tych usług może wydawać się odrobinę karkołomne. W poprzednim tekście poprzestałem na wyciągnięciu danych za pomocą narzędzi linux. Tym razem spróbuję to zrobić za pomocą pythona.

bluepy

Przez pewien czas bawiłem się z biblioteką bluepy. Możecie ją znaleźć tutaj: https://github.com/IanHarvey/bluepy. Biblioteka zadziałała, ale była trochę… kapryśna. Zdarzały jej się time-outy na odczycie bufora, szybkość też nie była jakaś zachwycająca. Ale gdy już połączyła się i odpowiednio zarejestrowała – udało mi się z niej uzyskać odczyty.

pygatt

Z biblioteką pygatt miałem więcej szczęścia – zadziałała mi bez problemów. Nie jest tak elegancka jak bluepy (trzeba poznać kilka magicznych numerków – jak powyżej) – albe szybka i skuteczna. Instalacja (trochę nadmiarowo):

Teraz, szybki test na podstawie załączonego przykładu  – zmodyfikowany dla usługi kompasu (https://github.com/peplin/pygatt, e3:f2:ca:0b:88:1e to adres mojej Thingy):

Przydatne

W poprzednim tekście Thingy:52 – zasilanie z Raspberry pokazałem, jak zrestartować porty USB. Czasami warto również zrestartować usługę BT na raspberry:

Właśnie taką sekwencję stosuję przy inicjalizacji lub problemach z połączeniem – reset USB i BT.

Podsumowanie

Chodzi niezawodnie i szybko – a więc dlaczego nie używać?

Skomentuj ten tekst na facebook.

Źródła

  • Thingy:52 – zasilanie z Raspberry
  • Thingy 52: usługi pod Raspberry PI Zero (w).
  • https://nordicsemiconductor.github.io/Nordic-Thingy52-FW/documentation/firmware_architecture.html
  • http://www.chrobotics.com/library/understanding-quaternions
  • https://pypi.org/project/pygatt/
  • https://devzone.nordicsemi.com/f/nordic-q-a/21270/best-way-to-send-float-over-ble
  • https://stackoverflow.com/questions/30124608/convert-unsigned-integer-to-float-in-python