Spisu treści:

ESP32 Bluetooth BLE Pilot zdalnego sterowania: 8 kroków
ESP32 Bluetooth BLE Pilot zdalnego sterowania: 8 kroków

Wideo: ESP32 Bluetooth BLE Pilot zdalnego sterowania: 8 kroków

Wideo: ESP32 Bluetooth BLE Pilot zdalnego sterowania: 8 kroków
Wideo: Zdalne sterowanie na esp32 2024, Listopad
Anonim
Pilot zdalnego sterowania Bluetooth BLE ESP32
Pilot zdalnego sterowania Bluetooth BLE ESP32
ESP32 Bluetooth BLE pilot zdalnego sterowania
ESP32 Bluetooth BLE pilot zdalnego sterowania
Pilot zdalnego sterowania Bluetooth BLE ESP32
Pilot zdalnego sterowania Bluetooth BLE ESP32
ESP32 Bluetooth BLE pilot zdalnego sterowania
ESP32 Bluetooth BLE pilot zdalnego sterowania

Ten projekt jest przykładem jak podłączyć niedrogi joystick Bluetooth BLE do ESP32. Kod został napisany przy użyciu Arduino IDE Ver 1.8.5 z dodatkiem ESP32. Użyty joystick BLE to urządzenie komercyjne, które można kupić w Internecie za mniej niż 20,00 USD lub w lokalnym sklepie fiveBELoW za 5,00 USD.

Joystick, którego użyłem w tym projekcie, to pilot zdalnego sterowania Bluetooth Spektrum VR Control. Jest reklamowany jako działający z tabletami z systemem Android i IOS jako joystick/mysz do użytku z zestawami VR.

Pilot zdalnego sterowania Bluetooth VR Control ma pojedynczy joystick z osią X i Y, dwa przyciski wyzwalające z przodu i sześć przycisków na uchwycie. Dwa przyciski służą do włączania/wyłączania zasilania i sterowania trybem. Pozostałe cztery przyciski mogą być używane do wszystkiego, co chcesz. Ten projekt jest szkieletem lub frameworkiem, który obsługuje wszystkie interfejsy Bluetooth i dekodowanie przycisków i joysticka. Wszystko, co musisz zrobić, to dodać wywołania funkcji, aby obsłużyć to, co chcesz, aby robiły przyciski i joystick. Nie musisz nic wiedzieć o Bluetooth, aby korzystać z tego frameworka.

Istnieje wiele stron internetowych ze szczegółowymi instrukcjami instalacji Arduino IDE i dodatku ESP32. Nie zamierzam tutaj powtarzać tych informacji. Google i postępuj zgodnie ze wskazówkami.

Framework jest adaptacją przykładowego klienta BLE opublikowanego przez IoT Sharing. Znajdziesz go tutaj. Możesz przestudiować ten kod, aby zorientować się, jak działa BLE. Expressif ma kompletny przykład dla klienta GATT BLE i szczegółowo wyjaśnia działanie (nie napisany dla Arduino IDE). Możesz to dostać tutaj.

To nie jest samouczek BLE. Nie będę szczegółowo wyjaśniał, jak działa kod. Użyję terminologii BLE, aby opisać niektóre funkcje joysticka. Część kodu, którą musisz zmodyfikować dla swojego projektu, zostanie szczegółowo wyjaśniona, aby pomóc Ci ją zmodyfikować. Zakres jest ograniczony, aby ten Instruktaż był krótki i skoncentrowany na korzystaniu z joysticka.

Krok 1: Trochę o Bluetooth Low Energy (BLE)

To nie jest samouczek dotyczący BLE. Kiedy zaczynałem ten projekt, nie znałem różnicy między BLE a Classic Bluetooth. Chciałem tylko sprawdzić, czy kupiony przeze mnie joystick będzie działał z ESP32. W poniższym tekście używam terminologii BLE, aby przedstawić uproszczony przegląd działania BLE.

BLE wykorzystuje architekturę klient/serwer. Jedno urządzenie to serwer świadczący usługi. Drugim urządzeniem jest klient korzystający z usług. Aby ograniczyć zapotrzebowanie na energię, BLE przesyła tylko małe pakiety informacji, gdy nastąpi zmiana. W przypadku joysticka urządzeniem joysticka jest serwer. Jako serwer ogłasza się i przesyła listę usług, które świadczy, gdy zostanie o to poproszony. Urządzenie joysticka reklamuje pięć usług. Jedyną interesującą nas usługą jest usługa BLE HID (Human Interface Device). Z usługą BLE związane są tak zwane cechy charakterystyczne. Charakterystyka jest zazwyczaj źródłem danych. Usługa HID joysticka ma dziesięć cech. Niektóre cechy są duplikatami i są ignorowane. Interesuje nas tylko charakterystyka raportów BLE, które mają możliwości odczytu i powiadamiania. Trzy cechy spełniają te wymagania i dostarczają danych o położeniu joysticka i stanie przycisków. Gdy powiadomienie jest włączone, serwer wyśle pakiety danych po wykryciu zmiany w powiązanej charakterystyce.

Struktura weryfikuje, czy znaleziony serwer ma usługę BLE HID, a następnie włącza powiadomienia w trzech charakterystykach raportu, które dostarczają informacji o stanie joysticka i przycisku. Następnie, po naciśnięciu lub zwolnieniu przycisku lub poruszeniu joysticka, ESP32 otrzymuje pakiet danych informujący o nowej pozycji joysticka i/lub stanie niektórych przycisków.

Krok 2: Wskaźniki skanowania i połączenia

Struktura definiuje dwie diody LED, GREENLED i BLUELED i przypisuje je do dwóch pinów GPIO ESP32. ZIELONA DIODA świeci się, gdy ESP32 szuka joysticka BLE. Po znalezieniu joysticka ZIELONA DIODA gaśnie, a NIEBIESKA DIODA świeci, aby wskazać, że połączenie zostało nawiązane i jesteś gotowy do pracy. Jeśli połączenie zostanie utracone, NIEBIESKA dioda jest wyłączona, ESP32 jest resetowany, ZIELONA dioda świeci i skanowanie rozpoczyna się od nowa. Jeśli joystick nie zostanie znaleziony w ciągu trzydziestu sekund, skanowanie zostanie zatrzymane, a ZIELONA DIODA gaśnie. Po pięciu sekundach skanowanie rozpocznie się ponownie, a ZIELONA DIODA zostanie włączona.

Efektem końcowym jest to, że ESP32 będzie kontynuował skanowanie w poszukiwaniu joysticka, dopóki go nie znajdzie. Po nawiązaniu połączenia, jeśli zostanie ono utracone, ESP32 zresetuje się i rozpocznie ponowne skanowanie. ESP32 jest resetowany, ponieważ nie ma funkcji ESP32 SDK do resetowania stosu Bluetooth w celu ponownego uruchomienia skanowania.

Krok 3: Rozszyfrowanie zdarzeń joysticka i przycisków

Jedno zdarzenie wywołania zwrotnego w ESP32 odbiera trzy różne pakiety danych z serwera dla trzech charakterystyk, które zostały skonfigurowane w celu dostarczania powiadomień. Jeden pakiet ma długość czterech bajtów. Trzy z bajtów zawierają pozycję osi X, pozycję osi Y i przyciski wyzwalające, które są mapowane bitowo w bajcie. Pozostałe dwa pakiety mają po dwa bajty i mają jeden bajt, który ma stan przycisku mapowanego bitowo. Odebrane pakiety są dekodowane i kopiowane do tablicy bajtów w pamięci. Dane osi joysticka trafiają do bajtów danych X i Y, a każdy z trzech mapowanych bitowo bajtów przycisków jest kierowany do odpowiedniego bajtu dla tych przycisków.

Zadanie FreeRTOS jest tworzone w celu obsługi danych otrzymanych przez powiadomienia. Jedno zadanie dla dżojstika i przycisków spustowych, jedno zadanie dla przycisków A i B i jedno zadanie dla przycisków C i D. Każde z tych zadań ma wyraźnie oznaczone obszary, w których należy dodać kod, aby zrobić to, co chcesz z wydarzeniem. Poszukaj komentarza „//===== dodaj swój kod tutaj ===== w treści zadania i dodaj swój kod po nim. Każde zadanie ma komentarz wskazujący, do czego jest używane i używa Serial.println() do wydrukowania komunikatu o zdarzeniu, które miało miejsce.

Oto przykład z zadania przycisku A/B;

void taskButtonAB(void *parametr){ przyciski uint8_t;

//===== jeśli zadanie wymaga jednorazowej inicjalizacji, umieść je tutaj =====

while(true) { // zrezygnuj z procesora, poczekaj na nowe dane vTaskSuspend(NULL); // właśnie się obudziliśmy, dostępne są nowe dane buttony = VrBoxData[VB_BTNAB]; Serial.printf("Przyciski A/B: %02X\n", przyciski); if (buttons & VB_BUTTON_A) { // przycisk A naciśnięty lub przytrzymany Serial.println("Przycisk A"); //===== dodaj swój kod tutaj ===== }

jeśli (przyciski i VB_BUTTON_B)

{ // przycisk B naciśnięty lub przytrzymany Serial.println("Przycisk B");

//===== dodaj swój kod tutaj =====

} } // dla } // taskButtonAB

Krok 4: Działanie VR Box: Joystick

Jeśli joystick zostanie pozostawiony w pozycji środkowej, powiadomienia z joysticka nie będą wysyłane. Gdy joystick zostanie przesunięty poza środek, wiadomość z powiadomieniem z danymi joysticka i danymi przycisku wyzwalacza jest wysyłana co około 15 ms. Po przesunięciu joysticka z powrotem na środek powiadomienie, że został przesunięty na środek, nie jest wysyłane. Innymi słowy, mówi ci, że joystick przesunął się poza środek, ale nie, że przesunął się do środka. W rezultacie otrzymujesz komunikaty wskazujące, że joystick zbliża się do środka, ale nie, że osiągnął środek. Bardzo irytujące. Dwa przyciski wyzwalające są dołączone do danych joysticka. Naciśnięcie jednego z przycisków spustowych po powrocie joysticka do środka spowoduje zaktualizowanie pozycji joysticka do zera. Platforma ma wbudowany licznik czasu oczekiwania, który automatycznie symuluje komunikat powiadomienia joysticka krótko po tym, jak wszystkie powiadomienia dotyczące przycisków joysticka/triggera przestaną napływać. Timer ustawia joystick na zero. Joystick ma zasięg około +/- 25 na każdej osi.

Krok 5: Działanie skrzynki VR: przyciski wyzwalające

Przyciski wyzwalające wyślą powiadomienie raz po naciśnięciu i ponownie po zwolnieniu. Naciśnięty komunikat powiadomienia wskaże przycisk, który został naciśnięty. Komunikat z powiadomieniem o zwolnieniu wskazuje, że oba przyciski są zwolnione.

Przytrzymanie dolnego przycisku wyzwalacza uniemożliwi serwerowi wykrycie, że naciśnięto górny przycisk wyzwalacza. Przytrzymanie górnego przycisku wyzwalacza i wciśnięcie dolnego przycisku wyzwalacza powoduje wysłanie przez serwer powiadomienia o wciśnięciu dolnego przycisku wyzwalacza (górny przycisk wyzwalacza będzie miał zero!). Zwolnienie dolnego przycisku wyzwalacza spowoduje, że serwer wyśle powiadomienie o naciśnięciu górnego przycisku wyzwalacza i zwolnieniu dolnego wyzwalacza.

Innymi słowy, dolny przycisk spustowy dominuje nad górnym przyciskiem spustowym i zastąpi go, gdy oba zostaną naciśnięte. Musisz ustalić, jak postępować w przypadku naciśnięcia obu przycisków.

Krok 6: Działanie skrzynki VR: przyciski A/B

Przyciski A i B działają jak joystick i stale wysyłają powiadomienia po naciśnięciu i przytrzymaniu. Komunikaty kończą się po zwolnieniu przycisku. Przyciski A i B działają podobnie do przycisków wyzwalania, ponieważ przycisk A dominuje nad przyciskiem B, tak jak dolny przycisk wyzwalacza dominuje nad górnym przyciskiem.

Krok 7: Obsługa skrzynki VR: przyciski C/D

Przyciski C i D wysyłają powiadomienie raz po naciśnięciu i ponownie po zwolnieniu. Jeśli zostanie przytrzymany, dalsze wiadomości nie będą wysyłane, dopóki nie zostaną zwolnione. Przytrzymanie jednego z przycisków C lub D uniemożliwi serwerowi wykrycie aktywności na drugim przycisku.

Krok 8: Wniosek

Obsługa przycisków jest moim zdaniem trochę niepewna. Framework zapewnia miejsca, w których kod ma działać po naciśnięciu przycisku. Jeśli chcesz również wykryć zwolnienia przycisków, musisz dowiedzieć się, jak to zrobić.

Tylko od Ciebie zależy, co chcesz zrobić dla każdego przycisku i co ma robić ruch joystickiem. To, jak poradzisz sobie z różnicami w spuście, przyciskach A i B oraz C i D, zależy od Ciebie.

Poszukaj w kodzie; funkcji taskJoyStick(), taskButtonAB(), taskButtonCD() i dodaj swój kod po komentarzu „//===== dodaj swój kod tutaj =====.

Do obsługi joysticka potrzebne są maksymalnie cztery funkcje (do przodu, do tyłu, w prawo i w lewo) oraz do sześciu funkcji do obsługi różnych przycisków. Zaimplementuj je wszystkie lub tylko to, czego potrzebujesz. Wybór nalezy do ciebie.

Jeśli korzystasz z tego frameworka. Chciałbym opowiedzieć o tym, do czego go użyłeś i czy uważasz, że jest łatwy w użyciu.

Jeśli masz pytania dotyczące tego, jak to działa lub potrzebujesz pomocy w jego uruchomieniu, skontaktuj się ze mną.

Kod jest dostępny na GitHub tutaj.

Cieszyć się.

Zalecana: