Tabla de contenido:

Control remoto ESP32 Bluetooth BLE: 8 pasos
Control remoto ESP32 Bluetooth BLE: 8 pasos

Video: Control remoto ESP32 Bluetooth BLE: 8 pasos

Video: Control remoto ESP32 Bluetooth BLE: 8 pasos
Video: Home Automation using ESP32 Blynk Bluetooth IR Remote | IoT Projects 2023 2024, Noviembre
Anonim
Control remoto ESP32 Bluetooth BLE
Control remoto ESP32 Bluetooth BLE
Control remoto ESP32 Bluetooth BLE
Control remoto ESP32 Bluetooth BLE
Control remoto ESP32 Bluetooth BLE
Control remoto ESP32 Bluetooth BLE
Control remoto ESP32 Bluetooth BLE
Control remoto ESP32 Bluetooth BLE

Este proyecto es un ejemplo de cómo conectar un joystick BLE Bluetooth económico a un ESP32. El código fue escrito usando Arduino IDE Ver 1.8.5 con el complemento ESP32. El joystick BLE utilizado es un dispositivo comercial que puede comprar en Internet por menos de $ 20.00 o en su tienda local fiveBELoW por $ 5.00.

El joystick que utilicé para este proyecto es un control remoto Bluetooth Spektrum VR Control. Se comercializa para que funcione con tabletas Android e IOS como joystick / mouse para usar con auriculares VR.

El control remoto Bluetooth VR Control tiene un solo joystick con ejes X e Y, dos botones de activación en la parte delantera y seis botones en el mango. Dos de los botones son para encendido / apagado y control de modo. Los otros cuatro botones se pueden utilizar para lo que quieras. Este proyecto es un esqueleto o marco que maneja toda la interfaz Bluetooth y la decodificación de los botones y el joystick. Todo lo que tiene que hacer es agregar llamadas a funciones para manejar lo que desea que hagan los botones y el joystick. No necesita saber nada sobre Bluetooth para utilizar este marco.

Existen numerosos sitios web con instrucciones detalladas para instalar el IDE de Arduino y el complemento ESP32. No voy a intentar repetir esa información aquí. Búscalo en Google y sigue las instrucciones.

El marco es una adaptación de un ejemplo de cliente BLE publicado por IoT Sharing. Lo puedes encontrar aquí. Puede estudiar este código para tener una idea de cómo funciona BLE. Expressif tiene un ejemplo completo para un cliente GATT BLE y explica la operación en detalle (no escrito para Arduino IDE). Puedes obtenerlo aqui.

Este no es un tutorial de BLE. No explicaré en detalle cómo funciona el código. Usaré terminología BLE para describir algunas de las características del joystick. La parte del código que necesita modificar para su proyecto se explicará en detalle para ayudarlo a modificarlo. El alcance está limitado para mantener este Instructable corto y enfocado en el uso del joystick.

Paso 1: Un poco sobre Bluetooth de baja energía (BLE)

Esto no pretende ser un tutorial sobre BLE. Cuando comencé este proyecto, no conocía la diferencia entre BLE y Classic Bluetooth. Solo quería ver si podía hacer que el joystick que compré funcionara con el ESP32. En el siguiente texto, utilizo la terminología BLE para ofrecer una descripción general simplificada de cómo funciona BLE.

BLE utiliza una arquitectura cliente / servidor. Un dispositivo es un servidor que proporciona servicios. El otro dispositivo es un cliente que consume servicios. Para mantener bajos los requisitos de energía, BLE solo transmite pequeños paquetes de información cuando ocurre un cambio. En el caso del joystick, el dispositivo de joystick es un servidor. Como servidor, se anuncia a sí mismo y transmite una lista de los servicios que proporciona cuando se le solicita. El dispositivo de joystick anuncia cinco servicios. El único servicio que nos interesa es el servicio BLE HID (Dispositivo de interfaz humana). Un servicio BLE tiene lo que se conoce como características asociadas. Una característica suele ser una fuente de datos. El servicio HID del joystick tiene diez características. Algunas de las características están duplicadas y se ignoran. Solo estamos interesados en las características del informe BLE que tienen capacidades de lectura y notificación. Tres de las características cumplen estos requisitos y proporcionan datos sobre la posición del joystick y el estado de los botones. Cuando la notificación está habilitada, el servidor enviará paquetes de datos cuando se detecte un cambio en la característica asociada.

El marco verifica que el servidor que encuentra tiene el servicio BLE HID y luego habilitará Notificaciones en las tres Características del Informe que brindan información sobre el estado del joystick y el botón. Luego, cuando se presiona o suelta un botón o se mueve el joystick, el ESP32 recibe un paquete de datos que le indica cuál es la nueva posición del joystick y / o el estado de algunos botones.

Paso 2: Indicadores de conexión y escaneo

El marco define dos LED, VERDE y AZUL y los asigna a dos de los pines GPIO del ESP32. El LED VERDE se enciende cuando el ESP32 está buscando el joystick BLE. Cuando se encuentra el joystick, el VERDE se apaga y el AZUL se enciende para indicar que se ha establecido la conexión y que está listo para comenzar. Si se pierde la conexión, el BLUELED se apaga, el ESP32 se reinicia, el VERDE se enciende y el escaneo comienza de nuevo. Si no se encuentra el joystick en treinta segundos, la exploración se detiene y el LED VERDE se apaga. Después de cinco segundos, el escaneo comienza de nuevo y el LED VERDE se enciende.

El resultado final es que el ESP32 continuará buscando el joystick hasta que lo encuentre. Una vez que se establece la conexión, si luego se pierde, el ESP32 se reiniciará y comenzará a escanear nuevamente. El ESP32 se restablece porque no hay funciones de ESP32 SDK para restablecer la pila de Bluetooth para reiniciar el escaneo.

Paso 3: Descifrar los eventos del joystick y los botones

Un evento de devolución de llamada en el ESP32 recibe tres paquetes de datos diferentes del servidor para las tres características que se configuraron para proporcionar notificaciones. Un paquete tiene cuatro bytes de longitud. Tres de los bytes contienen la posición del eje X, la posición del eje Y y los botones de disparo, que están mapeados en bits en el byte. Los otros dos paquetes son de dos bytes cada uno y tienen un solo byte que tiene el estado de botón de mapa de bits. Los paquetes recibidos se decodifican y copian en una matriz de bytes en la memoria. Los datos del eje del joystick entran en los bytes de datos X e Y y cada uno de los bytes de botón mapeados de tres bits se dirige al byte apropiado para esos botones.

Se crea una tarea FreeRTOS para manejar los datos recibidos por las notificaciones. Una tarea para el joystick y los botones de disparo, una tarea para los botones A y B y una tarea para los botones C y D. Cada una de estas tareas tiene áreas claramente marcadas donde debe agregar su código para hacer lo que quiera con el evento. Busque el comentario "// ===== agregue su código aquí =====" en el cuerpo de la tarea y agregue su código después. Cada tarea tiene un comentario que indica para qué se usa y usa un Serial.println () para imprimir un mensaje sobre el evento que ocurrió.

A continuación se muestra un ejemplo de la tarea del botón A / B;

void taskButtonAB (parámetro void *) {botones uint8_t;

// ===== Si la tarea requiere una inicialización única, colóquela aquí =====

while (true) {// abandona la CPU, espera nuevos datos vTaskSuspend (NULL); // acabamos de despertar, hay nuevos datos disponibles. buttons = VrBoxData [VB_BTNAB]; Serial.printf ("Botones A / B:% 02X / n", botones); if (botones & VB_BUTTON_A) {// botón A presionado o se mantiene presionado Serial.println ("Botón A"); // ===== agregue su código aquí =====}

si (botones & VB_BUTTON_B)

{// botón B presionado o se mantiene presionado Serial.println ("Botón B");

// ===== agregue su código aquí =====

}} // para} // taskButtonAB

Paso 4: Operación de la caja de realidad virtual: el joystick

Si el joystick se deja en la posición central, no se envían notificaciones del joystick. Una vez que el joystick se mueve fuera del centro, se envía un mensaje de notificación con los datos del joystick y los datos del botón de disparo aproximadamente cada 15 ms. Cuando el joystick vuelve al centro, no se envía una notificación de que se ha movido al centro. En otras palabras, le dice que el joystick se ha movido fuera del centro, pero no que se ha movido al centro. El resultado final es que recibe mensajes que indican que el joystick se está moviendo hacia el centro, pero no que ha llegado al centro. Muy molesto. Los dos botones de disparo se incluyen con los datos del joystick. Al presionar uno de los botones de activación después de devolver el joystick al centro, la posición del joystick se actualizará a cero. El Framework tiene un temporizador de tiempo de espera incorporado que simula automáticamente un mensaje de notificación del joystick poco tiempo después de que dejan de llegar todos los mensajes de notificación del joystick / botón disparador. El temporizador pone el joystick a cero. El joystick tiene un rango de aproximadamente +/- 25 en cada eje.

Paso 5: Operación de la caja de realidad virtual: botones de activación

Los botones de activación enviarán un mensaje de notificación una vez cuando se presionan y nuevamente cuando se sueltan. El mensaje de notificación presionado indicará el botón que se presionó. El mensaje de notificación de liberación indica que ambos botones están liberados.

Mantener presionado el botón de activación inferior evitará que el servidor detecte que se ha presionado el botón de activación superior. Si se mantiene presionado el botón de activación superior y se presiona el botón de activación inferior, el servidor envía un mensaje de notificación de que se presiona el botón de activación inferior (¡el botón de activación superior será cero!). Al soltar el botón de activación inferior, el servidor enviará una notificación de que se presiona el botón de activación superior y se libera el activador inferior.

En otras palabras, el botón de disparo inferior es dominante sobre el botón de disparo superior y lo anulará cuando se presionen ambos. Debe determinar cómo manejar el caso de que se presionen ambos botones.

Paso 6: Funcionamiento de la caja de realidad virtual: botones A / B

Los botones A y B actúan como el joystick y envían continuamente mensajes de notificación cuando se presionan y se mantienen presionados. Los mensajes se detienen cuando se suelta el botón. Los botones A y B funcionan de manera similar a los botones de disparo en que el botón A domina el botón B al igual que el botón de disparo inferior domina el botón de disparo superior.

Paso 7: Operación de la caja VR: Botones C / D

Los botones C y D envían un mensaje de notificación una vez cuando se presionan y otra vez cuando se sueltan. Si se mantiene presionado, no se envían más mensajes hasta que se liberan. Si mantiene presionado uno de los botones C o D, evitará que el servidor detecte actividad en el otro botón.

Paso 8: Conclusión

En mi opinión, el funcionamiento de los botones es un poco inestable. El Framework proporciona lugares para poner su código para actuar cuando se presiona un botón. Si también necesita detectar la liberación de botones, eso le queda a usted para que averigüe cómo hacerlo.

Depende totalmente de usted determinar qué desea que haga cada botón y qué debe hacer el movimiento del joystick. La forma en que maneja las diferencias en el gatillo, A & B y los botones C & D depende de usted.

Busque en el código; taskJoyStick (), taskButtonAB (), taskButtonCD () funciona y agrega tu código después del comentario "// ===== agrega tu código aquí =====".

Necesitará hasta cuatro funciones para manejar el joystick (adelante, atrás, derecha e izquierda) y hasta seis funciones para manejar los distintos botones. Impleméntelos todos o solo lo que necesite. La decisión es tuya.

Si usa este framework. Me encantaría comentarle para qué lo usó y si lo encontró fácil de usar.

Si tiene preguntas sobre cómo funciona o necesita ayuda para que funcione, comuníquese conmigo.

El código está disponible en GitHub aquí.

Disfrutar.

Recomendado: