Mündəricat:

ESP32 Bluetooth BLE Uzaqdan İdarəetmə: 8 addım
ESP32 Bluetooth BLE Uzaqdan İdarəetmə: 8 addım

Video: ESP32 Bluetooth BLE Uzaqdan İdarəetmə: 8 addım

Video: ESP32 Bluetooth BLE Uzaqdan İdarəetmə: 8 addım
Video: Управляем адресными светодиодами на ESP32, прошивка WLED, применение в Home Assistant 2024, Noyabr
Anonim
ESP32 Bluetooth BLE Uzaqdan İdarəetmə
ESP32 Bluetooth BLE Uzaqdan İdarəetmə
ESP32 Bluetooth BLE Uzaqdan İdarəetmə
ESP32 Bluetooth BLE Uzaqdan İdarəetmə
ESP32 Bluetooth BLE Uzaqdan İdarəetmə
ESP32 Bluetooth BLE Uzaqdan İdarəetmə
ESP32 Bluetooth BLE Uzaqdan İdarəetmə
ESP32 Bluetooth BLE Uzaqdan İdarəetmə

Bu layihə, ucuz bir Bluetooth BLE joystickini ESP32 -yə necə bağlamağın nümunəsidir. Kod, ESP32 addon ilə Arduino IDE Ver 1.8.5 istifadə edərək yazılmışdır. İstifadə olunan BLE joystick, İnternetdə 20,00 dollardan aşağı və ya yerli 5BELoW mağazanızdan 5,00 dollara satın ala biləcəyiniz ticarət cihazıdır.

Bu layihə üçün istifadə etdiyim joystick Spektrum VR Control Bluetooth Uzaqdan Nəzarətçisidir. Android və IOS tabletləri ilə işləyərək VR qulaqlıqlarda istifadə üçün joystick/siçan kimi satışa çıxarılır.

VR Control Bluetooth Uzaqdan İdarəetmə qurğusunda X və Y oxlu tək bir joystick, öndə iki tetik düyməsi və sapda altı düymə var. Düymələrdən ikisi güc açma/söndürmə və rejimə nəzarət üçündür. Digər dörd düymə istədiyiniz hər şey üçün istifadə edilə bilər. Bu layihə, bütün Bluetooth interfeyslərini və düymələrin və joystikin deşifrini aparan bir skelet və ya çərçivədir. Etməli olduğunuz şey, düymələrin və joystickin istədiyini idarə etmək üçün funksiya zəngləri əlavə etməkdir. Bu çərçivəni istifadə etmək üçün Bluetooth haqqında heç nə bilməyinizə ehtiyac yoxdur.

Arduino IDE və ESP32 əlavəsini quraşdırmaq üçün ətraflı təlimatları olan çoxsaylı veb saytlar var. Bu məlumatı burada təkrar etməyə çalışmayacağam. Google edin və təlimatları izləyin.

Çərçivə, IoT Paylaşımı tərəfindən nəşr olunan BLE müştəri nümunəsinin uyğunlaşdırılmasıdır. Burada tapa bilərsiniz. BLE -nin necə işlədiyini bilmək üçün bu kodu öyrənə bilərsiniz. Expressif, GATT BLE müştərisi üçün tam bir nümunəyə malikdir və əməliyyatı ətraflı şəkildə izah edir (Arduino IDE üçün yazılmamışdır). Burada əldə edə bilərsiniz.

Bu BLE dərsliyi deyil. Kodun necə işlədiyini ətraflı izah etməyəcəyəm. Joystickin bəzi xüsusiyyətlərini təsvir etmək üçün BLE terminologiyasından istifadə edəcəyəm. Kodun layihəniz üçün dəyişdirməli olduğunuz hissəsi, onu dəyişdirməyinizə kömək etmək üçün ətraflı izah ediləcəkdir. Bu təlimatı qısa saxlamaq üçün məhduddur və joystickdən istifadə etməyə yönəlmişdir.

Addım 1: Bluetooth Enerjisi Haqqında Biraz (BLE)

Bunun BLE ilə bağlı bir dərs olması nəzərdə tutulmayıb. Bu layihəyə başlayanda BLE ilə Klassik Bluetooth arasındakı fərqi bilmirdim. ESP32 ilə işləmək üçün aldığım joysticki ala biləcəyimi görmək istədim. Aşağıdakı mətndə, BLE -nin necə işlədiyinə sadələşdirilmiş bir baxış vermək üçün BLE terminologiyasından istifadə edirəm.

BLE bir müştəri/server arxitekturasından istifadə edir. Bir cihaz xidmət göstərən bir serverdir. Digər cihaz xidmətlərdən istifadə edən bir müştəridir. Güc tələblərini aşağı salmaq üçün BLE yalnız dəyişiklik baş verdikdə kiçik məlumat paketlərini ötürür. Joystick vəziyyətində, joystick cihazı bir serverdir. Bir server olaraq, özünü reklam edir və istədikdə təqdim etdiyi xidmətlərin siyahısını ötürür. Joystick cihazı beş xidməti reklam edir. Maraqlandığımız yeganə xidmət BLE HID (İnsan Arayüzü Cihazı) xidmətidir. Bir BLE xidməti, onunla əlaqəli Xüsusiyyətlər olaraq bilinənlərə malikdir. Bir xarakterik, ümumiyyətlə məlumat mənbəyidir. Joystickin HID xidməti on xüsusiyyətə malikdir. Bəzi xüsusiyyətlər təkrarlanır və nəzərə alınmır. Yalnız oxumaq və bildirmək qabiliyyətinə malik olan BLE Hesabat Xüsusiyyətləri ilə maraqlanırıq. Üç xüsusiyyət bu tələblərə cavab verir və joystickin mövqeyi və düymələrin vəziyyəti haqqında məlumat verir. Bildiriş aktiv olduqda, əlaqəli xüsusiyyətdə dəyişiklik aşkar edildikdə server məlumat paketləri göndərəcək.

Çərçivə, tapdığı serverin BLE HID xidmətinə malik olduğunu yoxlayır və sonra joystick və düymə vəziyyəti haqqında məlumat verən üç Hesab Xüsusiyyətinə dair Bildirişləri aktivləşdirəcək. Sonra, bir düyməyə basıldıqda və ya buraxıldıqda və ya joystick hərəkət etdirildikdə, ESP32 yeni joystick mövqeyinin nə olduğunu və/və ya bəzi düymələrin vəziyyətini bildirən bir məlumat paketi alır.

Addım 2: Tarama və Bağlantı Göstəriciləri

Çərçivə GREENLED və BLUELED iki LED təyin edir və onları ESP32 -nin GPIO pinlərindən ikisinə təyin edir. GREENLED, ESP32 BLE joystickini axtardıqda yanır. Joystick tapıldıqda, GREENLED söndürülür və MAVİ yanır və əlaqənin qurulduğunu və getməyə hazır olduğunuzu bildirir. Əlaqə kəsilərsə, MAVİ sönür, ESP32 sıfırlanır, GREENLED yandırılır və tarama yenidən başlayır. Joystick otuz saniyə ərzində tapılmazsa, tarama dayanır və GREENLED sönür. Beş saniyədən sonra tarama yenidən başlayır və GREENLED açılır.

Son nəticə, ESP32 -in tapılmayana qədər joystick axtarışına davam etməsidir. Bağlantı qurulduqdan sonra, itirildikdə, ESP32 özünü sıfırlayacaq və yenidən taramağa başlayacaq. ESP32 sıfırlanır, çünki taramanı yenidən başlatmaq üçün Bluetooth yığınını sıfırlayan ESP32 SDK funksiyaları yoxdur.

Addım 3: Joystick və Düymə Hadisələrinin deşifr edilməsi

ESP32 -də bir geri çağırma hadisəsi, bildirişləri təmin etmək üçün qurulmuş üç xüsusiyyət üçün serverdən üç fərqli məlumat paketi alır. Bir paket dörd bayt uzunluğundadır. Baytlardan üçü, X oxu mövqeyi, Y oxu mövqeyi və baytda bitlə xəritələnmiş tətik düymələrini ehtiva edir. Digər iki paket hər biri iki baytdır və bit eşlenmiş düymə vəziyyətinə malik tək bir bayta malikdir. Alınan paketlər deşifr olunur və yaddaşda bir bayt silsiləsinə kopyalanır. Joystick ox məlumatları X və Y məlumat baytlarına daxil olur və üç bit eşlenen düymə baytlarının hər biri bu düymələr üçün uyğun bayta yönəldilir.

Bildirişlər tərəfindən alınan məlumatları idarə etmək üçün bir FreeRTOS vəzifəsi yaradılmışdır. Joystick və tetik düymələri üçün bir tapşırıq, A & B düymələri üçün bir vəzifə və C & D düymələri üçün bir vəzifə. Bu vəzifələrin hər birində hadisə ilə istədiyinizi etmək üçün kod əlavə etməli olduğunuz açıq şəkildə qeyd olunmuş sahələr var. Tapşırığın gövdəsində "// ===== kodunuzu bura əlavə edin =====" şərhini axtarın və kodunuzu bundan sonra əlavə edin. Hər bir tapşırığın nə üçün istifadə edildiyini göstərən bir şərh var və baş verən hadisə ilə bağlı mesajı çap etmək üçün Serial.println () istifadə edir.

A/B düyməsi tapşırığından bir nümunə;

void taskButtonAB (void *parametri) {uint8_t düymələri;

// ===== Əgər tapşırıq birdəfəlik başlanğıc tələb edirsə, bura qoyun =====

while (true) {// CPU -dan imtina edin, yeni məlumatları gözləyin vTaskSuspend (NULL); // yeni oyandıq, yeni məlumatlar mövcuddur düymələr = VrBoxData [VB_BTNAB]; Serial.printf ("A/B Düymələri: %02X / n", düymələr); if (düymələr & VB_BUTTON_A) {// düyməsi A basıldıqda və ya Serial.println ("Düymə A") basıldığı halda; // ===== kodunuzu bura əlavə edin =====}

əgər (düymələr və VB_BUTTON_B)

{// B düyməsinə basıldı və ya Serial.println ("B düyməsi") basılı tutuldu;

// ===== kodunuzu bura əlavə edin =====

}} // üçün} // taskButtonAB

Addım 4: VR Box Əməliyyatı: Joystick

Joystick mərkəzi vəziyyətdə qalarsa, heç bir joystick bildirişi göndərilmir. Joystick mərkəzdən uzaqlaşdırıldıqda, hər 15mS -də joystick məlumatları və tetik düyməsi məlumatları olan bir bildiriş mesajı göndərilir. Joystick yenidən mərkəzə köçürüldükdə mərkəzə köçdüyü barədə bildiriş göndərilmir. Başqa sözlə, joystickin mərkəzdən uzaqlaşdığını söyləyir, ancaq mərkəzə keçdiyini deyil. Son nəticə, joystickin mərkəzə doğru hərəkət etdiyini göstərən mesajları alırsınız, ancaq mərkəzə çatdığını deyil. Çox əsəbi. İki tetikleyici düymə joystick məlumatları ilə birlikdə verilir. Joystick'i mərkəzə qaytardıqdan sonra tətik düymələrindən birinə basmaq, joystickin mövqeyini sıfıra dəyişəcək. Çərçivə, bütün joystick/tetikleyici düymə bildiriş mesajlarının gəlməsini dayandırdıqdan qısa müddət sonra avtomatik olaraq bir joystick bildiriş mesajını simulyasiya edən bir zaman aşımı taymerinə malikdir. Taymer, joystick'i sıfıra qoyur. Joystickin hər oxda təxminən +/- 25 aralığına malikdir.

Addım 5: VR Box Əməliyyatı: Tetik düymələri

Tetik düymələri bir dəfə basıldıqda və sərbəst buraxıldıqda yenidən bir bildiriş mesajı göndərəcək. Basılan bildiriş mesajı basıldığı düyməni göstərəcək. Buraxılış bildirişi mesajı hər iki düymənin buraxıldığını göstərir.

Aşağı tətik düyməsini basıb saxlamaq serverin yuxarı tətik düyməsinə basıldığını aşkar etməsinə mane olacaq. Üst tətik düyməsini basıb aşağı tetik düyməsinə basmaq serverin aşağı tetik düyməsinə basıldığını bildirən bir mesaj göndərməsi ilə nəticələnir (yuxarı tətik düyməsi sıfır olacaq!). Aşağı tətik düyməsini buraxmaq, serverin yuxarı tətik düyməsinə basıldığını və aşağı tetikleyicinin sərbəst buraxıldığını bildirən bir bildiriş göndərməsinə səbəb olacaq.

Başqa sözlə, aşağı tətik düyməsi yuxarı tətik düyməsinə üstünlük verir və hər ikisi basıldıqda onu ləğv edəcək. Hər iki düyməyə basılması vəziyyətində necə davranılacağını təyin etməlisiniz.

Addım 6: VR Box Əməliyyatı: A/B Düymələri

A və B düymələri joystick kimi hərəkət edir və basıldıqda davamlı olaraq bildiriş mesajları göndərir. Düymə buraxıldıqda mesajlar dayanır. A və B düymələri, Tetik düymələrinə bənzər şəkildə işləyir, çünki aşağı düymə yuxarı tətik düyməsinə üstünlük verdiyi kimi A düyməsi də B düyməsinə hakimdir.

Addım 7: VR Box Əməliyyatı: C/D Düymələri

C və D düymələri bir dəfə basıldıqda və sərbəst buraxıldıqda da bir bildiriş mesajı göndərir. Basılı saxlanılarsa, buraxılana qədər başqa heç bir mesaj göndərilmir. C və ya D düymələrindən birini basıb saxlamaq serverin digər düymədə aktivliyi aşkar etməsinə mane olacaq.

Addım 8: Nəticə

Düymələrin işləməsi mənim fikrimcə bir az qəribədir. Çərçivə, bir düyməyə basıldığı zaman kodunuzun hərəkətə keçəcəyi yerləri təmin edir. Düymə buraxılışlarını da aşkar etməlisinizsə, bunu necə edəcəyinizi anlamağınız qalır.

Hər düymənin nə etmək istədiyini və joystickin hansı hərəkəti etməli olduğunu təyin etmək tamamilə sizə bağlıdır. Tətik, A & B və C & D düymələrindəki fərqləri necə idarə etməyiniz sizə bağlıdır.

Bunun üçün koda baxın; taskJoyStick (), taskButtonAB (), taskButtonCD () funksiyalarını yerinə yetirin və "// ===== kodunuzu bura əlavə edin =====" şərhindən sonra kodunuzu əlavə edin.

Joystick idarə etmək üçün dörd funksiyaya (irəli, geriyə, sağa və sola) və müxtəlif düymələri idarə etmək üçün altı funksiyaya ehtiyacınız olacaq. Hamısını və ya ehtiyac duyduğunuz şeyi həyata keçirin. Seçim sənindir.

Bu çərçivədən istifadə edirsinizsə. Nə üçün istifadə etdiyinizi və istifadə etməyi asan tapsanız bir qışqırmağı çox istərdim.

Bunun necə işlədiyinə dair suallarınız varsa və ya işə salınması üçün yardıma ehtiyacınız varsa, mənimlə əlaqə saxlayın.

Kod GitHub -da mövcuddur.

Zövq alın.

Tövsiyə: