İçindekiler:

ESP32 Bluetooth BLE Uzaktan Kumanda: 8 Adım
ESP32 Bluetooth BLE Uzaktan Kumanda: 8 Adım

Video: ESP32 Bluetooth BLE Uzaktan Kumanda: 8 Adım

Video: ESP32 Bluetooth BLE Uzaktan Kumanda: 8 Adım
Video: ESP32 ile Bluetooth Low Energy Kullanımı 2024, Kasım
Anonim
ESP32 Bluetooth BLE Uzaktan Kumanda
ESP32 Bluetooth BLE Uzaktan Kumanda
ESP32 Bluetooth BLE Uzaktan Kumanda
ESP32 Bluetooth BLE Uzaktan Kumanda
ESP32 Bluetooth BLE Uzaktan Kumanda
ESP32 Bluetooth BLE Uzaktan Kumanda
ESP32 Bluetooth BLE Uzaktan Kumanda
ESP32 Bluetooth BLE Uzaktan Kumanda

Bu proje, ucuz bir Bluetooth BLE joystick'in bir ESP32'ye nasıl bağlanacağının bir örneğidir. Kod, ESP32 eklentisi ile Arduino IDE Ver 1.8.5 kullanılarak yazılmıştır. Kullanılan BLE joystick, İnternetten 20,00$'dan daha düşük bir fiyata veya yerel FiveBELoW mağazanızdan 5.00$'a satın alabileceğiniz ticari bir cihazdır.

Bu proje için kullandığım joystick bir Spektrum VR Control Bluetooth Uzaktan Kumanda. VR kulaklıklarla kullanım için bir joystick/fare olarak Android ve IOS tabletlerle çalışan olarak pazarlanmaktadır.

VR Control Bluetooth Uzaktan Kumanda, X ve Y eksenli tek bir joystick, önde iki tetik düğmesi ve kol üzerinde altı düğme içerir. Düğmelerden ikisi açma/kapama ve mod kontrolü içindir. Diğer dört düğme, istediğiniz her şey için kullanılabilir. Bu proje, düğmelerin ve joystick'in tüm Bluetooth arabirimini ve kod çözme işlemlerini gerçekleştiren bir iskelet veya çerçevedir. Tek yapmanız gereken, düğmelerin ve joystick'in yapmasını istediğiniz şeyi halletmek için işlev çağrıları eklemek. Bu çerçeveyi kullanmak için Bluetooth hakkında hiçbir şey bilmenize gerek yok.

Arduino IDE ve ESP32 eklentisini kurmak için ayrıntılı talimatlar içeren çok sayıda web sitesi vardır. Bu bilgiyi burada tekrarlamaya çalışmayacağım. Google ve yönergeleri izleyin.

Çerçeve, IoT Sharing tarafından yayınlanan bir BLE istemci örneğinin bir uyarlamasıdır. Burada bulabilirsiniz. BLE'nin nasıl çalıştığı hakkında bir fikir edinmek için bu kodu inceleyebilirsiniz. Expressif, bir GATT BLE istemcisi için eksiksiz bir örneğe sahiptir ve işlemi ayrıntılı olarak açıklar (Arduino IDE için yazılmamıştır). Buradan alabilirsiniz.

Bu bir BLE öğreticisi değildir. Kodun nasıl çalıştığını ayrıntılı olarak açıklamayacağım. Joystick'in bazı özelliklerini açıklamak için BLE terminolojisini kullanacağım. Kodun projeniz için değiştirmeniz gereken kısmı, değiştirmenize yardımcı olmak için ayrıntılı olarak açıklanacaktır. Kapsam, bu Talimatı kısa tutmak ve joystick'i kullanmaya odaklanmak için sınırlıdır.

1. Adım: Bluetooth Düşük Enerjisi (BLE) Hakkında Biraz

Bu, BLE hakkında bir eğitim olarak tasarlanmamıştır. Bu projeye başladığımda BLE ve Klasik Bluetooth arasındaki farkı bilmiyordum. ESP32 ile çalışmak için aldığım joystick'i alıp alamayacağımı görmek istedim. Aşağıdaki metinde, BLE'nin nasıl çalıştığına dair basitleştirilmiş bir genel bakış sağlamak için BLE terminolojisini kullanıyorum.

BLE, bir istemci/sunucu mimarisi kullanır. Bir cihaz, hizmet sağlayan bir sunucudur. Diğer cihaz, hizmetleri tüketen bir istemcidir. Güç gereksinimlerini düşük tutmak için BLE, bir değişiklik meydana geldiğinde yalnızca küçük bilgi paketleri iletir. Joystick durumunda, joystick cihazı bir sunucudur. Bir sunucu olarak kendi reklamını yapar ve istendiğinde sağladığı hizmetlerin bir listesini iletir. Joystick cihazı beş hizmetin reklamını yapar. İlgilendiğimiz tek hizmet BLE HID (İnsan Arayüzü Cihazı) hizmetidir. Bir BLE hizmeti, kendisiyle ilişkili Özellikler olarak bilinenlere sahiptir. Bir Karakteristik tipik olarak bir veri kaynağıdır. Joystick'in HID hizmetinin on Özelliği vardır. Bazı Özellikler kopyadır ve yoksayılır. Yalnızca Okuma ve Bildirme özelliklerine sahip BLE Rapor Özellikleri ile ilgileniyoruz. Üç özellik bu gereksinimleri karşılar ve joystick'in konumu ve düğmelerin durumu hakkında veri sağlar. Bildirim etkinleştirildiğinde, ilgili karakteristikte bir değişiklik tespit edildiğinde sunucu veri paketleri gönderir.

Çerçeve, bulduğu sunucunun BLE HID hizmetine sahip olduğunu doğrular ve ardından joystick ve düğme durumu bilgisi sağlayan üç Rapor Özelliği üzerinde Bildirimleri etkinleştirir. Ardından, bir düğmeye basıldığında veya bırakıldığında ya da joystick hareket ettirildiğinde, ESP32, yeni joystick konumunun ne olduğunu ve/veya bazı düğmelerin durumunu bildiren bir veri paketi alır.

2. Adım: Tarama ve Bağlantı Göstergeleri

Çerçeve, YEŞİL ve MAVİ LED olmak üzere iki LED'i tanımlar ve bunları ESP32'nin GPIO pinlerinden ikisine atar. ESP32, BLE joystick'i ararken YEŞİL LED yanar. Joystick bulunduğunda, bağlantının kurulduğunu ve gitmeye hazır olduğunuzu belirtmek için YEŞİL LED kapanır ve MAVİ LED yanar. Bağlantı kesilirse, MAVİLED kapanır, ESP32 sıfırlanır, YEŞİL LED yanar ve tarama yeniden başlar. Joystick otuz saniye içinde bulunamazsa, tarama durur ve YEŞİL LED söner. Beş saniye sonra tarama yeniden başlar ve YEŞİL LED yanar.

Sonuç, ESP32'nin joystick'i bulana kadar taramaya devam etmesidir. Bağlantı yapıldıktan sonra, bağlantı kesilirse, ESP32 kendini sıfırlar ve yeniden taramaya başlar. ESP32 sıfırlanır çünkü taramayı yeniden başlatmak üzere Bluetooth yığınını sıfırlayacak ESP32 SDK işlevi yoktur.

Adım 3: Joystick ve Düğme Olaylarının Deşifre Edilmesi

ESP32'deki bir geri arama olayı, Bildirimler sağlamak üzere ayarlanan üç Özellik için sunucudan üç farklı veri paketi alır. Bir paket dört bayt uzunluğundadır. Baytlardan üçü, baytta bit eşlenen X ekseni konumunu, Y ekseni konumunu ve tetik düğmelerini içerir. Diğer iki paketin her biri iki bayttır ve bit eşlemeli düğme durumuna sahip tek bir bayta sahiptir. Alınan paketlerin kodu çözülür ve bellekteki bir bayt dizisine kopyalanır. Joystick ekseni verileri, X ve Y veri baytlarına gider ve üç bitlik eşlenmiş düğme baytlarının her biri, bu düğmeler için uygun baytlara yönlendirilir.

Bildirimler tarafından alınan verileri işlemek için bir FreeRTOS görevi oluşturulur. Joystick ve tetik düğmeleri için bir görev, A ve B düğmeleri için bir görev ve C ve D düğmeleri için bir görev. Bu görevlerin her biri, etkinlikle istediğinizi yapmak için kod eklemeniz gereken açıkça işaretlenmiş alanlara sahiptir. Görevin gövdesinde "//===== kodunuzu buraya ekleyin =====" yorumunu arayın ve kodunuzu ondan sonra ekleyin. Her görevin ne için kullanıldığını belirten bir yorumu vardır ve meydana gelen olay hakkında bir mesaj yazdırmak için bir Serial.println() kullanır.

İşte A/B düğmesi görevinden bir örnek;

void taskButtonAB(void *parametre){ uint8_t düğmeleri;

//===== görev herhangi bir kez başlatma gerektiriyorsa, buraya koyun =====

while(true) { // CPU'dan vazgeç, yeni veri bekle vTaskSuspend(NULL); // yeni uyandık, yeni veriler mevcut butonlar = VrBoxData[VB_BTNAB]; Serial.printf("A/B Düğmeleri: %02X\n", düğmeler); if (düğmeler & VB_BUTTON_A) { // A düğmesine basılır veya basılı tutulur Serial.println("A Düğmesi"); //===== kodunuzu buraya ekleyin ===== }

if (düğmeler ve VB_BUTTON_B)

{ // B düğmesine basıldı veya basılı tutuluyor Serial.println("Buton B");

//===== kodunuzu buraya ekleyin =====

} } // için } // görevButtonAB

Adım 4: VR Kutusu Çalışması: Joystick

Joystick orta konumda bırakılırsa, joystick bildirimi gönderilmez. Joystick merkezden uzaklaştırıldığında, yaklaşık her 15mS'de bir joystick verileri ve tetik düğmesi verileri içeren bir bildirim mesajı gönderilir. Joystick tekrar merkeze taşındığında, merkeze taşındığına dair bir bildirim gönderilmez. Başka bir deyişle, joystick'in merkezden uzaklaştığını söyler, ancak merkeze hareket ettiğini söylemez. Sonuç olarak, joystick'in merkeze doğru hareket ettiğini belirten mesajlar alırsınız, ancak merkeze ulaştığını göstermezsiniz. Çok sinir bozucu. İki tetik düğmesi, joystick verilerine dahildir. Joystick'i merkeze getirdikten sonra tetik düğmelerinden birine basmak, joystick konumunu sıfıra güncelleyecektir. Çerçeve, tüm joystick/tetik düğmesi bildirim mesajlarının gelmesi durduktan kısa bir süre sonra bir joystick bildirim mesajını otomatik olarak simüle eden yerleşik bir zaman aşımı zamanlayıcısına sahiptir. Zamanlayıcı, joystick'i sıfıra ayarlar. Joystick'in her eksende yaklaşık +/- 25 aralığı vardır.

Adım 5: VR Kutusu İşlemi: Tetik Düğmeleri

Tetik düğmeleri, basıldığında bir kez ve bırakıldığında tekrar bir bildirim mesajı gönderir. Basılan bildirim mesajı, basılan düğmeyi gösterecektir. Sürüm bildirim mesajı, her iki düğmenin de serbest bırakıldığını gösterir.

Alt tetik düğmesini basılı tutmak, sunucunun üst tetik düğmesine basıldığını algılamasını engeller. Üst tetik düğmesini basılı tutmak ve alt tetik düğmesine basmak, sunucunun alt tetik düğmesine basıldığına dair bir bildirim mesajı göndermesine neden olur (üst tetik düğmesi sıfır olacaktır!). Alt tetik düğmesinin serbest bırakılması, sunucunun üst tetik düğmesine basıldığına ve alt tetikleyicinin bırakıldığına dair bir bildirim göndermesine neden olacaktır.

Başka bir deyişle, alt tetik düğmesi üst tetik düğmesine baskındır ve her ikisine de basıldığında onu geçersiz kılar. Her iki düğmeye de basılması durumunda nasıl davranılacağını belirlemelisiniz.

Adım 6: VR Kutusu İşlemi: A/B Düğmeleri

A ve B düğmeleri joystick gibi çalışır ve basılı tutulduğunda sürekli olarak bildirim mesajları gönderir. Düğme bırakıldığında mesajlar durur. A ve B düğmeleri Tetik düğmelerine benzer şekilde çalışır, çünkü A düğmesi B düğmesine hükmeder, tıpkı alt tetik düğmesinin üst tetik düğmesine hükmetmesi gibi.

Adım 7: VR Kutusu İşlemi: C/D Düğmeleri

C ve D düğmeleri, basıldığında bir kez ve bırakıldığında tekrar bir bildirim mesajı gönderir. Basılı tutulursa, bırakılana kadar başka mesaj gönderilmez. C veya D düğmelerinden birini basılı tutmak, sunucunun diğer düğmedeki etkinliği algılamasını engeller.

Adım 8: Sonuç

Düğmelerin çalışması bence biraz riskli. Çerçeve, bir düğmeye basıldığında işlem yapmak için kodunuzu koyabileceğiniz yerler sağlar. Düğme serbest bırakmalarını da algılamanız gerekiyorsa, nasıl yapacağınızı anlamanız size kalmıştır.

Her düğmenin ne yapmasını istediğinizi ve joystick'in ne hareket etmesi gerektiğini belirlemek tamamen size kalmış. Tetik, A & B ve C & D düğmelerindeki farklılıkları nasıl ele alacağınız size kalmış.

için koda bakın; taskJoyStick(), taskButtonAB(), taskButtonCD() fonksiyonları ve "//====== kodunuzu buraya ekleyin =====" yorumundan sonra kodunuzu ekleyin.

Joystick'i (ileri, geri, sağ ve sol) kullanmak için dört adede kadar fonksiyona ve çeşitli düğmeleri kullanmak için altı adede kadar fonksiyona ihtiyacınız olacaktır. Hepsini veya sadece ihtiyacınız olanı uygulayın. Seçim senin.

Bu çerçeveyi kullanırsanız. Ne için kullandığınızı ve kullanımı kolay bulursanız, çok sevinirim.

Nasıl çalıştığı hakkında sorularınız varsa veya çalışması için yardıma ihtiyacınız varsa, benimle iletişime geçin.

Kod GitHub'da burada mevcuttur.

Eğlence.

Önerilen: