Talaan ng mga Nilalaman:

ESP32 Bluetooth BLE Remote Control: 8 Mga Hakbang
ESP32 Bluetooth BLE Remote Control: 8 Mga Hakbang

Video: ESP32 Bluetooth BLE Remote Control: 8 Mga Hakbang

Video: ESP32 Bluetooth BLE Remote Control: 8 Mga Hakbang
Video: Simple Programming, Amazing Results: DIY Bluetooth Speaker with #ESP32 and 2 Speakers 2024, Nobyembre
Anonim
Ang ESP32 Bluetooth BLE Remote Control
Ang ESP32 Bluetooth BLE Remote Control
Ang ESP32 Bluetooth BLE Remote Control
Ang ESP32 Bluetooth BLE Remote Control
Ang ESP32 Bluetooth BLE Remote Control
Ang ESP32 Bluetooth BLE Remote Control
Ang ESP32 Bluetooth BLE Remote Control
Ang ESP32 Bluetooth BLE Remote Control

Ang proyektong ito ay isang halimbawa ng kung paano ikonekta ang isang hindi magastos na Bluetooth BLE joystick sa isang ESP32. Ang code ay isinulat gamit ang Arduino IDE Ver 1.8.5 na may addon na ESP32. Ang ginamit na BLE joystick ay isang komersyal na aparato na maaari kang bumili sa Internet nang mas mababa sa $ 20.00 o mula sa iyong lokal na tindahan ng limangBELoW sa halagang $ 5.00.

Ang joystick na ginamit ko para sa proyektong ito ay isang Spektrum VR Control Bluetooth Remote Controller. Ito ay ibinebenta bilang nagtatrabaho sa mga Android at IOS tablet bilang isang joystick / mouse para magamit sa mga VR headset.

Ang VR Control Bluetooth Remote Controller ay may isang solong joystick na may X at Y axis, dalawang mga pindutan ng pag-trigger sa harap at anim na mga pindutan sa hawakan. Ang dalawa sa mga pindutan ay para sa power on / off at mode control. Ang iba pang apat na mga pindutan ay maaaring magamit para sa anumang nais mo. Ang proyektong ito ay isang balangkas o balangkas na humahawak sa lahat ng interface ng Bluetooth at pag-decode ng mga pindutan at joystick. Ang kailangan mo lang gawin ay magdagdag ng mga tawag sa pag-andar upang hawakan kung ano ang nais mong gawin ng mga pindutan at joystick. Hindi mo kailangang malaman ang tungkol sa Bluetooth upang magamit ang balangkas na ito.

Mayroong maraming mga web site na may detalyadong mga tagubilin para sa pag-install ng Arduino IDE at ang addon ng ESP32. Hindi ko susubukan na ulitin ang impormasyong ito dito. Google ito at sundin ang mga direksyon.

Ang balangkas ay isang pagbagay ng isang halimbawa ng kliyente ng BLE na inilathala ng IoT Sharing. Mahahanap mo ito rito. Maaari mong pag-aralan ang code na ito upang makakuha ng isang ideya kung paano gumagana ang BLE. Ang Expressif ay may isang kumpletong halimbawa para sa isang kliyente ng GATT BLE at ipinaliwanag ang operasyon nang detalyado (hindi nakasulat para sa Arduino IDE). Maaari mo itong makuha dito.

Hindi ito isang BLE tutorial. Hindi ko ipaliwanag kung paano gumagana nang detalyado ang code. Gagamitin ko ang BLE terminology upang ilarawan ang ilan sa mga tampok ng joystick. Ang bahagi ng code na kailangan mong baguhin para sa iyong proyekto ay ipapaliwanag nang detalyado upang matulungan kang baguhin ito. Limitado ang saklaw upang mapanatili itong Maituturo na maikli at nakatuon sa paggamit ng joystick.

Hakbang 1: Kaunti Tungkol sa Bluetooth Mababang Enerhiya (BLE)

Hindi ito inilaan upang maging isang tutorial sa BLE. Nang sinimulan ko ang proyektong ito, hindi ko alam ang pagkakaiba sa pagitan ng BLE at Klasikong Bluetooth. Nais ko lamang makita kung makakakuha ako ng binili kong joystick upang magtrabaho kasama ang ESP32. Sa sumusunod na teksto gumagamit ako ng terminolohiya ng BLE upang magbigay ng isang pinasimple na pangkalahatang ideya ng kung paano gumagana ang BLE.

Gumagamit si BLE ng arkitektura ng client / server. Ang isang aparato ay isang server na nagbibigay ng mga serbisyo. Ang iba pang aparato ay isang kliyente na gumagamit ng mga serbisyo. Upang mapanatili ang mga kinakailangan sa kuryente, nagpapadala lamang ang BLE ng maliliit na mga packet ng impormasyon kapag nangyari ang isang pagbabago. Sa kaso ng joystick, ang aparato ng joystick ay isang server. Bilang isang server, ini-advertise nito ang sarili at magpapadala ng isang listahan ng mga serbisyong ibinibigay nito kapag tinanong. Ang aparato ng joystick ay nag-advertise ng limang mga serbisyo. Ang tanging serbisyo na interesado kami ay ang serbisyo ng BLE HID (Human Interface Device). Ang isang serbisyo na BLE ay mayroong kilala na Mga Katangian na nauugnay dito. Ang isang Katangian ay karaniwang isang mapagkukunan ng data. Ang serbisyo ng HID ng joystick ay may sampung Mga Katangian. Ang ilan sa Mga Katangian ay mga duplicate at hindi pinansin. Interesado lamang kami sa Mga Katangian sa Ulat ng BLE na mayroong mga kakayahan sa Basahin at Abisuhan. Tatlo sa mga katangian ang nakakatugon sa mga kinakailangang ito at nagbibigay ng data tungkol sa posisyon ng joystick at estado ng mga pindutan. Kapag pinagana ang abiso, magpapadala ang server ng mga data packet kapag nakita ang isang pagbabago sa nauugnay na katangian.

Pinatutunayan ng balangkas na ang server na nahahanap nito ay mayroong serbisyo na BLE HID at paganahin ang Mga Abiso sa tatlong Mga Katangian sa Pag-ulat na nagbibigay ng impormasyon ng estado ng joystick at pindutan. Pagkatapos, kapag ang isang pindutan ay pinindot o inilabas o ang joystick ay inilipat, ang ESP32 ay tumatanggap ng isang packet ng data na nagsasabi dito kung ano ang bagong posisyon ng joystick at / o ang estado ng ilang mga pindutan.

Hakbang 2: Mga Tagapahiwatig ng Pag-scan at Koneksyon

Tinutukoy ng balangkas ang dalawang LEDS, GREENLED at BLUELED at itinalaga ang mga ito sa dalawa sa mga pin ng GPIO ng ESP32. Ang GREENLED ay naiilawan kapag ang ESP32 ay naghahanap para sa BLE joystick. Kapag natagpuan ang joystick ang GREENLED ay naka-patay at ang BLUELED ay naiilawan upang ipahiwatig na ang koneksyon ay naitatag at handa ka nang umalis. Kung ang koneksyon ay nawala, ang BLUELED ay naka-patay, ang ESP32 ay naka-reset, ang GREENLED ay naiilawan at magsimulang muli ang pag-scan. Kung ang joystick ay hindi natagpuan sa loob ng tatlumpung segundo pagkatapos ay tumitigil ang pag-scan at ang GREENLED ay naka-patay. Pagkatapos ng limang segundo, magsisimula muli ang pag-scan at ang GREENLED ay nakabukas.

Ang huling resulta ay ang ESP32 ay magpapatuloy na mag-scan para sa joystick hanggang sa makita ito. Kapag nagawa ang koneksyon, kung nawala ito, i-reset ng ESP32 ang sarili nito at magsisimulang mag-scan muli. Ang ESP32 ay nai-reset dahil walang mga pagpapaandar ng ESP32 SDK upang i-reset ang Bluetooth stack upang muling simulan ang pag-scan.

Hakbang 3: Pag-unawa ng Mga Kaganapan sa Joystick at Button

Ang isang kaganapan sa callback sa ESP32 ay tumatanggap ng tatlong magkakaibang mga packet ng data mula sa server para sa tatlong Mga Katangian na na-setup upang magbigay ng Mga Abiso. Ang isang pakete ay may haba na apat na bytes. Ang tatlo sa mga byte ay naglalaman ng posisyon ng X axis, posisyon ng Y axis at mga trigger button, na medyo nai-map sa byte. Ang dalawa pang mga packet ay dalawang byte bawat isa at may isang solong byte na may estado ng bit na nai-mapa. Ang mga natanggap na packet ay na-decode at nakopya sa isang byte array sa memorya. Ang data ng axis ng joystick ay papunta sa mga byte ng X at Y at ang bawat isa sa tatlong bit na naka-map na mga byte ng pindutan ay nakadirekta sa naaangkop na byte para sa mga pindutang iyon.

Ang isang gawain ng FreeRTOS ay nilikha upang hawakan ang data na natanggap ng mga abiso. Isang gawain para sa mga joystick at trigger button, isang gawain para sa mga A & B na pindutan at isang gawain para sa mga C & D na pindutan. Ang bawat isa sa mga gawaing ito ay malinaw na minarkahan ang mga lugar kung saan dapat mong idagdag ang iyong code upang gawin ang nais mo sa kaganapan. Hanapin ang komentong "// ===== idagdag ang iyong code dito ===" sa katawan ng gawain at idagdag ang iyong code pagkatapos nito. Ang bawat gawain ay may isang puna na nagpapahiwatig kung ano ang ginagamit nito at gumagamit ng isang Serial.println () upang mag-print ng isang mensahe tungkol sa naganap na kaganapan.

Narito ang isang halimbawa mula sa gawain ng A / B na pindutan;

walang bisa ang task ButtonAB (walang bisa * parameter) {mga pindutan ng uint8_t;

// === kung ang gawain ay nangangailangan ng anumang isang beses na pagsisimula, ilagay ito dito ===

habang (totoo) {// isuko ang CPU, maghintay para sa bagong data vTaskSuspend (NULL); // kakagising lang namin, may magagamit na bagong data na mga pindutan = VrBoxData [VB_BTNAB]; Serial.printf ("A / B Buttons:% 02X / n", mga pindutan); kung (mga pindutan at VB_BUTTON_A) {// button A na pinindot o pinipigilan Serial.println ("Button A"); // === idagdag ang iyong code dito ===}

kung (mga pindutan at VB_BUTTON_B)

{// button B pinindot o pinipigilan ng Serial.println ("Button B");

// === idagdag ang iyong code dito ===

}} // para} // task ButtonAB

Hakbang 4: Operasyon ng VR Box: ang Joystick

Kung ang joystick ay naiwan sa posisyon ng gitna, walang ipinapadala na mga abiso ng joystick. Kapag ang joystick ay inilipat sa gitna, isang mensahe ng abiso na may data ng joystick at data ng pindutan ng pag-trigger ay ipinadala tungkol sa bawat 15mS. Kapag ang joystick ay inilipat pabalik sa gitna, isang notification na lumipat ito sa gitna ay hindi naipadala. Sa madaling salita, sinasabi nito sa iyo na ang joystick ay lumipat sa gitna, ngunit hindi na lumipat ito sa gitna. Ang huling resulta ay nakakatanggap ka ng mga mensahe na nagpapahiwatig na ang joystick ay papalipat sa gitna, ngunit hindi na umabot sa gitna. Sobrang nakakainis. Ang dalawang mga pindutan ng pag-trigger ay kasama ng data ng joystick. Ang pagpindot sa isa sa mga pindutan ng pag-trigger pagkatapos ibalik ang joystick sa gitna ay maa-update ang posisyon ng joystick sa zero. Ang Framework ay may built-in na timer na timer na awtomatikong simulate ang isang mensahe ng abiso ng joystick sa maikling panahon pagkatapos ng lahat ng mga mensahe ng abiso ng joystick / gatilyo na huminto sa pagdating. Itinatakda ng timer ang joystick sa zero. Ang joystick ay may isang saklaw na tungkol sa +/- 25 sa bawat axis.

Hakbang 5: Pagpapatakbo ng VR Box: Mga Trigger Buttons

Ang mga pindutan ng pag-trigger ay magpapadala ng isang mensahe ng abiso nang isang beses kapag pinindot at muli kapag inilabas. Ang pinindot na mensahe ng abiso ay magpapahiwatig ng pindutan na pinindot. Ipinapahiwatig ng mensahe ng notification sa paglabas na ang parehong mga pindutan ay pinakawalan.

Ang paghawak sa ibabang pindutan ng pag-trigger ay pipigilan ang server mula sa pagtuklas na ang itaas na pindutan ng pag-trigger ay pinindot. Ang paghawak sa itaas na pindutan ng pag-trigger at pagpindot sa ibabang mga pindutan ng pag-trigger ay nagreresulta sa server na nagpapadala ng isang mensahe ng abiso na pinindot ang ibabang pindutan ng pag-trigger (ang itaas na pindutan ng pag-trigger ay magiging zero!). Ang paglabas ng pindutan ng mas mababang gatilyo ay magdudulot sa server ng pagpapadala ng isang abiso na ang itaas na pindutan ng pag-trigger ay pinindot at ang mas mababang gatilyo ay inilabas.

Sa madaling salita, ang mas mababang pindutan ng pag-trigger ay nangingibabaw sa itaas na pindutan ng pag-trigger at i-override ito kapag pareho ang pinindot. Dapat mong matukoy kung paano hawakan ang kaso ng parehong mga pindutan na pinindot.

Hakbang 6: Pagpapatakbo ng VR Box: Mga Butones na A / B

Ang mga A at B na pindutan ay kumikilos tulad ng joystick at patuloy na nagpapadala ng mga mensahe ng abiso kapag pinindot at pinigilan. Humihinto ang mga mensahe kapag ang pindutan ay pinakawalan. Gumagana ang mga pindutan na A at B na katulad ng mga pindutan ng Trigger na ang isang pindutan ay nangingibabaw sa pindutan ng B tulad ng mas mababang pindutan ng pag-trigger na nangingibabaw sa itaas na pindutan ng pag-trigger.

Hakbang 7: Pagpapatakbo ng VR Box: Mga Pindutan na C / D

Ang mga pindutan ng C at D ay nagpapadala ng isang mensahe ng abiso nang isang beses kapag pinindot at muli kapag inilabas. Kung pinigilan, walang karagdagang mga mensahe ang ipapadala hanggang mailabas ang mga ito. Ang pagpigil sa alinman sa mga pindutan ng C o D ay pipigilan ang server mula sa tiktikan ang aktibidad sa kabilang pindutan.

Hakbang 8: Konklusyon

Ang pagpapatakbo ng mga pindutan ay sa aking palagay ng isang maliit na wonky. Nagbibigay ang Framework para sa mga lugar upang ilagay ang iyong code upang kumilos kapag pinindot ang isang pindutan. Kung kailangan mo ring tuklasin ang pagpapalabas ng pindutan, naiwan para sa iyo upang malaman kung paano gawin.

Nasa iyo ang ganap na alamin kung ano ang nais mong gawin ng bawat pindutan at kung anong paggalaw ang dapat gawin ng joystick. Paano mo hahawakan ang mga pagkakaiba sa gatilyo, A & B at ang mga pindutang C & D ay nasa iyo.

Hanapin sa code para sa; functionJoyStick (), task ButtonAB (), taskbuttonCD () ay gumagana at idagdag ang iyong code pagkatapos ng "// ===== idagdag ang iyong code dito ===" komento.

Kakailanganin mo ng hanggang sa apat na mga pagpapaandar upang hawakan ang joystick (pasulong, paatras, kanan at kaliwa) at hanggang sa anim na mga pag-andar upang hawakan ang iba't ibang mga pindutan. Ipatupad ang lahat o ang kailangan mo lang. Ang pagpipilian ay sa iyo.

Kung gagamitin mo ang balangkas na ito. Gusto kong sigawan tungkol sa kung ano mo ito ginamit para sa at kung nahanap mong madaling gamitin.

Kung mayroon kang mga katanungan tungkol sa kung paano ito gumagana o kailangan ng tulong sa pagpapaandar nito, makipag-ugnay sa akin.

Magagamit ang code sa GitHub dito.

Tangkilikin

Inirerekumendang: