Sommario:

Telecomando ESP32 Bluetooth BLE: 8 passaggi
Telecomando ESP32 Bluetooth BLE: 8 passaggi

Video: Telecomando ESP32 Bluetooth BLE: 8 passaggi

Video: Telecomando ESP32 Bluetooth BLE: 8 passaggi
Video: Home Automation using ESP32 Blynk Bluetooth IR Remote | IoT Projects 2023 2024, Dicembre
Anonim
Telecomando ESP32 Bluetooth BLE
Telecomando ESP32 Bluetooth BLE
Telecomando ESP32 Bluetooth BLE
Telecomando ESP32 Bluetooth BLE
Telecomando ESP32 Bluetooth BLE
Telecomando ESP32 Bluetooth BLE
Telecomando ESP32 Bluetooth BLE
Telecomando ESP32 Bluetooth BLE

Questo progetto è un esempio di come collegare un joystick Bluetooth BLE economico a un ESP32. Il codice è stato scritto utilizzando l'IDE Arduino Ver 1.8.5 con l'addon ESP32. Il joystick BLE utilizzato è un dispositivo commerciale che puoi acquistare su Internet per meno di $ 20,00 o dal tuo negozio fiveBELoW locale per $ 5,00.

Il joystick che ho usato per questo progetto è un telecomando Bluetooth Spektrum VR Control. Viene commercializzato come compatibile con tablet Android e IOS come joystick/mouse da utilizzare con visori VR.

Il telecomando Bluetooth VR Control ha un singolo joystick con gli assi X e Y, due pulsanti di attivazione nella parte anteriore e sei pulsanti sull'impugnatura. Due dei pulsanti servono per l'accensione/spegnimento e il controllo della modalità. Gli altri quattro pulsanti possono essere utilizzati per quello che vuoi. Questo progetto è uno scheletro o un framework che gestisce tutte le interfacce Bluetooth e la decodifica dei pulsanti e del joystick. Tutto quello che devi fare è aggiungere chiamate di funzione per gestire ciò che desideri che i pulsanti e il joystick facciano. Non è necessario sapere nulla sul Bluetooth per utilizzare questo framework.

Esistono numerosi siti Web con istruzioni dettagliate per l'installazione dell'IDE Arduino e dell'addon ESP32. Non ho intenzione di tentare di ripetere queste informazioni qui. Cerca su Google e segui le indicazioni.

Il framework è un adattamento di un esempio di client BLE pubblicato da IoT Sharing. Potete trovare qui. Puoi studiare questo codice per avere un'idea di come funziona BLE. Expressif ha un esempio completo per un client GATT BLE e spiega l'operazione in dettaglio (non scritto per Arduino IDE). Puoi ottenerlo qui.

Questo non è un tutorial BLE. Non spiegherò in dettaglio come funziona il codice. Userò la terminologia BLE per descrivere alcune delle caratteristiche del joystick. La parte del codice che devi modificare per il tuo progetto verrà spiegata in dettaglio per aiutarti a modificarlo. Lo scopo è limitato a mantenere questo Instructable breve e focalizzato sull'uso del joystick.

Passaggio 1: un po' di Bluetooth Low Energy (BLE)

Questo non vuole essere un tutorial su BLE. Quando ho iniziato questo progetto, non conoscevo la differenza tra BLE e Classic Bluetooth. Volevo solo vedere se potevo far funzionare il joystick che ho comprato con ESP32. Nel testo seguente sto usando la terminologia BLE per fornire una panoramica semplificata di come funziona BLE.

BLE utilizza un'architettura client/server. Un dispositivo è un server che fornisce servizi. L'altro dispositivo è un client che consuma servizi. Per mantenere bassi i requisiti di alimentazione, BLE trasmette solo piccoli pacchetti di informazioni quando si verifica un cambiamento. Nel caso del joystick, il dispositivo joystick è un server. Come server, si pubblicizza e trasmetterà un elenco dei servizi che fornisce quando richiesto. Il dispositivo joystick pubblicizza cinque servizi. L'unico servizio che ci interessa è il servizio BLE HID (Human Interface Device). A un servizio BLE sono associate le cosiddette Caratteristiche. Una caratteristica è in genere una fonte di dati. Il servizio HID del joystick ha dieci caratteristiche. Alcune delle Caratteristiche sono duplicati e vengono ignorate. Siamo interessati solo alle caratteristiche del report BLE che hanno funzionalità di lettura e notifica. Tre delle caratteristiche soddisfano questi requisiti e forniscono dati sulla posizione del joystick e sullo stato dei pulsanti. Quando la notifica è abilitata, il server invierà pacchetti di dati quando viene rilevata una modifica sulla caratteristica associata.

Il framework verifica che il server che trova disponga del servizio BLE HID e quindi abiliterà le notifiche sulle tre caratteristiche del report che forniscono informazioni sullo stato del joystick e dei pulsanti. Quindi, quando si preme o si rilascia un pulsante o si sposta il joystick, ESP32 riceve un pacchetto di dati che gli dice qual è la nuova posizione del joystick e/o lo stato di alcuni pulsanti.

Passaggio 2: indicatori di scansione e connessione

Il framework definisce due LED, GREENLED e BLUELED e li assegna a due dei pin GPIO di ESP32. Il LED VERDE è acceso quando l'ESP32 sta cercando il joystick BLE. Quando viene trovato il joystick, il LED VERDE si spegne e il LED BLU si accende per indicare che la connessione è stata stabilita e che sei pronto per partire. Se si perde la connessione, il LED BLU si spegne, l'ESP32 viene resettato, il LED VERDE si accende e la scansione ricomincia. Se il joystick non viene trovato entro trenta secondi, la scansione si interrompe e il LED VERDE si spegne. Dopo cinque secondi, la scansione ricomincia e il LED VERDE si accende.

Il risultato finale è che ESP32 continuerà a cercare il joystick finché non lo trova. Una volta stabilita la connessione, se viene persa, ESP32 si ripristinerà e ricomincerà la scansione. L'ESP32 viene ripristinato perché non ci sono funzioni SDK ESP32 per ripristinare lo stack Bluetooth per riavviare la scansione.

Passaggio 3: decifrazione degli eventi di joystick e pulsanti

Un evento di callback su ESP32 riceve tre diversi pacchetti di dati dal server per le tre caratteristiche che sono state impostate per fornire le notifiche. Un pacchetto è lungo quattro byte. Tre dei byte contengono la posizione dell'asse X, la posizione dell'asse Y e i pulsanti di attivazione, che sono mappati a bit nel byte. Gli altri due pacchetti sono due byte ciascuno e hanno un singolo byte che ha lo stato del pulsante a mappatura di bit. I pacchetti ricevuti vengono decodificati e copiati in un array di byte in memoria. I dati dell'asse del joystick vanno nei byte di dati X e Y e ciascuno dei tre byte dei pulsanti mappati a bit è diretto nel byte appropriato per quei pulsanti.

Viene creata un'attività FreeRTOS per gestire i dati ricevuti dalle notifiche. Un compito per il joystick e i pulsanti di attivazione, un compito per i pulsanti A e B e un compito per i pulsanti C e D. Ognuna di queste attività ha aree chiaramente contrassegnate in cui è necessario aggiungere il codice per fare ciò che si desidera con l'evento. Cerca il commento "//===== aggiungi il tuo codice qui =====" nel corpo dell'attività e aggiungi il codice dopo di esso. Ogni attività ha un commento che indica a cosa serve e usa un Serial.println() per stampare un messaggio sull'evento che si è verificato.

Ecco un esempio dall'attività del pulsante A/B;

void taskButtonAB(void *parametro){ uint8_t pulsanti;

//===== se l'attività richiede un'inizializzazione una tantum, inseriscila qui =====

while(true) { // rinuncia alla CPU, aspetta nuovi dati vTaskSuspend(NULL); // ci siamo appena svegliati, sono disponibili nuovi dati button = VrBoxData[VB_BTNAB]; Serial.printf("Pulsanti A/B: %02X\n", pulsanti); if (pulsanti & VB_BUTTON_A) { // pulsante A premuto o tenuto premuto Serial.println("Pulsante A"); //===== aggiungi qui il tuo codice ===== }

if (pulsanti & VB_BUTTON_B)

{ // pulsante B premuto o tenuto premuto Serial.println("Pulsante B");

//===== aggiungi qui il tuo codice =====

} } // per } // taskButtonAB

Passaggio 4: funzionamento della scatola VR: il joystick

Se il joystick viene lasciato in posizione centrale, non vengono inviate notifiche del joystick. Una volta spostato il joystick dal centro, viene inviato un messaggio di notifica con i dati del joystick e i dati del pulsante di attivazione ogni 15 ms circa. Quando il joystick viene riportato al centro, non viene inviata una notifica che indica che è stato spostato al centro. In altre parole, ti dice che il joystick si è spostato dal centro, ma non che si è spostato al centro. Il risultato finale è che ricevi messaggi che indicano che il joystick si sta muovendo verso il centro, ma non che ha raggiunto il centro. Molto noioso. I due pulsanti di attivazione sono inclusi con i dati del joystick. Premendo uno dei pulsanti di attivazione dopo aver riportato il joystick al centro, la posizione del joystick verrà aggiornata a zero. Il Framework ha un timer di timeout integrato che simula automaticamente un messaggio di notifica del joystick poco tempo dopo che tutti i messaggi di notifica del pulsante joystick/trigger smettono di arrivare. Il timer azzera il joystick. Il joystick ha una portata di circa +/- 25 su ciascun asse.

Passaggio 5: funzionamento della scatola VR: pulsanti di attivazione

I pulsanti di attivazione invieranno un messaggio di notifica una volta quando vengono premuti e di nuovo quando vengono rilasciati. Il messaggio di notifica premuto indicherà il pulsante che è stato premuto. Il messaggio di notifica del rilascio indica che entrambi i pulsanti sono stati rilasciati.

Tenendo premuto il pulsante di attivazione inferiore si impedirà al server di rilevare che è stato premuto il pulsante di attivazione superiore. Tenendo premuto il pulsante di attivazione superiore e premendo il pulsante di attivazione inferiore, il server invia un messaggio di notifica che informa che è stato premuto il pulsante di attivazione inferiore (il pulsante di attivazione superiore sarà zero!). Il rilascio del pulsante di attivazione inferiore farà sì che il server invii una notifica che il pulsante di attivazione superiore è stato premuto e il pulsante di attivazione inferiore viene rilasciato.

In altre parole, il pulsante di attivazione inferiore è dominante sul pulsante di attivazione superiore e lo sovrascriverà quando vengono premuti entrambi. Devi determinare come gestire il caso in cui entrambi i pulsanti vengono premuti.

Passaggio 6: funzionamento della scatola VR: pulsanti A/B

I pulsanti A e B agiscono come il joystick e inviano continuamente messaggi di notifica quando vengono premuti e tenuti premuti. I messaggi si fermano al rilascio del pulsante. I pulsanti A e B funzionano in modo simile ai pulsanti Trigger in quanto il pulsante A domina il pulsante B proprio come il pulsante di attivazione inferiore domina il pulsante di attivazione superiore.

Passaggio 7: funzionamento della scatola VR: pulsanti C/D

I pulsanti C e D inviano un messaggio di notifica una volta quando vengono premuti e di nuovo quando vengono rilasciati. Se tenuto premuto, non vengono inviati ulteriori messaggi fino a quando non vengono rilasciati. Tenendo premuto uno dei pulsanti C o D si impedirà al server di rilevare attività sull'altro pulsante.

Passaggio 8: conclusione

Il funzionamento dei pulsanti è a mio parere un po' traballante. Il Framework fornisce posti in cui mettere il tuo codice su cui agire quando viene premuto un pulsante. Se hai anche bisogno di rilevare i rilasci dei pulsanti, ti resta da capire come fare.

Sta a te determinare cosa vuoi che faccia ogni pulsante e cosa dovrebbe fare il joystick. Sta a te decidere come gestire le differenze nei pulsanti trigger, A e B e C e D.

Cerca nel codice per il; taskJoyStick(), taskButtonAB(), taskButtonCD() e aggiungi il tuo codice dopo il commento "//===== aggiungi il tuo codice qui =====".

Avrai bisogno di fino a quattro funzioni per gestire il joystick (avanti, indietro, destra e sinistra) e fino a sei funzioni per gestire i vari pulsanti. Implementali tutti o solo quello di cui hai bisogno. La scelta è tua.

Se usi questo framework Mi piacerebbe un grido su cosa l'hai usato per e se l'hai trovato facile da usare.

Se hai domande su come funziona o hai bisogno di aiuto per farlo funzionare, contattami.

Il codice è disponibile su GitHub qui.

Godere.

Consigliato: