Table des matières:

Télécommande ESP32 Bluetooth BLE : 8 étapes
Télécommande ESP32 Bluetooth BLE : 8 étapes

Vidéo: Télécommande ESP32 Bluetooth BLE : 8 étapes

Vidéo: Télécommande ESP32 Bluetooth BLE : 8 étapes
Vidéo: Allumer trois LEDs connectées à la carte ESP32 par un smartphone via Bluetooth 2024, Novembre
Anonim
Télécommande ESP32 Bluetooth BLE
Télécommande ESP32 Bluetooth BLE
Télécommande ESP32 Bluetooth BLE
Télécommande ESP32 Bluetooth BLE
Télécommande ESP32 Bluetooth BLE
Télécommande ESP32 Bluetooth BLE
Télécommande ESP32 Bluetooth BLE
Télécommande ESP32 Bluetooth BLE

Ce projet est un exemple de connexion d'un joystick Bluetooth BLE bon marché à un ESP32. Le code a été écrit à l'aide de l'IDE Arduino Ver 1.8.5 avec l'addon ESP32. Le joystick BLE utilisé est un appareil commercial que vous pouvez acheter sur Internet pour moins de 20,00 $ ou dans votre magasin local fiveBELoW pour 5,00 $.

Le joystick que j'ai utilisé pour ce projet est une télécommande Bluetooth Spektrum VR Control. Il est commercialisé comme fonctionnant avec les tablettes Android et IOS en tant que joystick/souris à utiliser avec les casques VR.

La télécommande Bluetooth VR Control possède un seul joystick avec axes X et Y, deux boutons de déclenchement à l'avant et six boutons sur la poignée. Deux des boutons sont pour la mise sous/hors tension et le contrôle du mode. Les quatre autres boutons peuvent être utilisés pour ce que vous voulez. Ce projet est un squelette ou un framework qui gère tout l'interfaçage Bluetooth et le décodage des boutons et du joystick. Tout ce que vous avez à faire est d'ajouter des appels de fonction pour gérer ce que vous voulez que les boutons et le joystick fassent. Vous n'avez pas besoin de connaître le Bluetooth pour utiliser ce framework.

Il existe de nombreux sites Web avec des instructions détaillées pour l'installation de l'IDE Arduino et de l'addon ESP32. Je ne vais pas tenter de répéter cette information ici. Google et suivez les instructions.

Le framework est une adaptation d'un exemple de client BLE publié par IoT Sharing. Vous pouvez le trouver ici. Vous pouvez étudier ce code pour avoir une idée du fonctionnement de BLE. Expressif a un exemple complet pour un client GATT BLE et explique le fonctionnement en détail (non écrit pour Arduino IDE). Vous pouvez l'avoir ici.

Ce n'est pas un tutoriel BLE. Je n'expliquerai pas le fonctionnement du code en détail. J'utiliserai la terminologie BLE pour décrire certaines des fonctionnalités du joystick. La partie du code que vous devez modifier pour votre projet sera expliquée en détail pour vous aider à le modifier. La portée est limitée pour garder ce Instructable court et axé sur l'utilisation du joystick.

Étape 1: Un peu sur Bluetooth Low Energy (BLE)

Ce n'est pas destiné à être un tutoriel sur BLE. Lorsque j'ai commencé ce projet, je ne connaissais pas la différence entre BLE et Classic Bluetooth. Je voulais juste voir si je pouvais obtenir le joystick que j'ai acheté pour fonctionner avec l'ESP32. Dans le texte suivant, j'utilise la terminologie BLE pour donner un aperçu simplifié du fonctionnement de BLE.

BLE utilise une architecture client/serveur. Un appareil est un serveur qui fournit des services. L'autre appareil est un client qui consomme des services. Afin de réduire les besoins en énergie, BLE ne transmet que de petits paquets d'informations lorsqu'un changement se produit. Dans le cas du joystick, le dispositif de joystick est un serveur. En tant que serveur, il s'annonce et transmettra une liste des services qu'il fournit lorsqu'on le lui demande. Le joystick annonce cinq services. Le seul service qui nous intéresse est le service BLE HID (Human Interface Device). Un service BLE est associé à ce que l'on appelle des caractéristiques. Une caractéristique est généralement une source de données. Le service HID du joystick a dix caractéristiques. Certaines des caractéristiques sont des doublons et sont ignorées. Nous ne sommes intéressés que par les caractéristiques de rapport BLE qui ont des capacités de lecture et de notification. Trois des caractéristiques répondent à ces exigences et fournissent des données sur la position du joystick et l'état des boutons. Lorsque la notification est activée, le serveur enverra des paquets de données lorsqu'un changement est détecté sur la caractéristique associée.

Le framework vérifie que le serveur qu'il trouve dispose du service BLE HID et activera ensuite les notifications sur les trois caractéristiques de rapport qui fournissent des informations sur l'état du joystick et du bouton. Ensuite, lorsqu'un bouton est enfoncé ou relâché ou que le joystick est déplacé, l'ESP32 reçoit un paquet de données lui indiquant quelle est la nouvelle position du joystick et/ou l'état de certains boutons.

Étape 2: Indicateurs de numérisation et de connexion

Le framework définit deux LED, GREENLED et BLUELED et les attribue à deux des broches GPIO de l'ESP32. Le VERT s'allume lorsque l'ESP32 recherche le joystick BLE. Lorsque le joystick est trouvé, la LED VERTE s'éteint et la LED BLEUE s'allume pour indiquer que la connexion a été établie et que vous êtes prêt à partir. Si la connexion est perdue, la LED BLEUE s'éteint, l'ESP32 est réinitialisé, la LED VERTE s'allume et le balayage recommence. Si le joystick n'est pas trouvé dans les trente secondes, le balayage s'arrête et le voyant VERT s'éteint. Après cinq secondes, le balayage recommence et le VERT s'allume.

Le résultat final est que l'ESP32 continuera à rechercher le joystick jusqu'à ce qu'il le trouve. Une fois la connexion établie, si elle est ensuite perdue, l'ESP32 se réinitialisera et recommencera la numérisation. L'ESP32 est réinitialisé car il n'y a pas de fonctions SDK ESP32 pour réinitialiser la pile Bluetooth pour redémarrer l'analyse.

Étape 3: Déchiffrer les événements de joystick et de bouton

Un événement de rappel sur l'ESP32 reçoit trois paquets de données différents du serveur pour les trois caractéristiques configurées pour fournir des notifications. Un paquet fait quatre octets. Trois des octets contiennent la position de l'axe X, la position de l'axe Y et les boutons de déclenchement, qui sont mappés en bits dans l'octet. Les deux autres paquets font chacun deux octets et ont un seul octet qui a l'état du bouton mappé en bits. Les paquets reçus sont décodés et copiés dans un tableau d'octets en mémoire. Les données de l'axe du joystick entrent dans les octets de données X et Y et chacun des trois octets de bouton mappés en bits est dirigé dans l'octet approprié pour ces boutons.

Une tâche FreeRTOS est créée pour gérer les données reçues par les notifications. Une tâche pour le joystick et les boutons de déclenchement, une tâche pour les boutons A & B et une tâche pour les boutons C & D. Chacune de ces tâches a des zones clairement marquées où vous devez ajouter du code pour faire ce que vous voulez avec l'événement. Recherchez le commentaire "//===== ajoutez votre code ici =====" dans le corps de la tâche et ajoutez votre code après celui-ci. Chaque tâche a un commentaire indiquant à quoi elle sert et utilise un Serial.println() pour imprimer un message sur l'événement qui s'est produit.

Voici un exemple de la tâche du bouton A/B;

void taskButtonAB(void *parameter){ uint8_t boutons;

//===== si la tâche nécessite une initialisation unique, mettez-la ici =====

while(true) { // abandonne le CPU, attend de nouvelles données vTaskSuspend(NULL); // nous venons de nous réveiller, de nouvelles données sont disponibles button = VrBoxData[VB_BTNAB]; Serial.printf("Boutons A/B: %02X\n", boutons); if (boutons & VB_BUTTON_A) { // bouton A enfoncé ou maintenu enfoncé Serial.println("Bouton A"); //===== ajoutez votre code ici ===== }

if (boutons & VB_BUTTON_B)

{ // bouton B enfoncé ou maintenu enfoncé Serial.println("Bouton B");

//===== ajoutez votre code ici =====

} } // pour } // taskButtonAB

Étape 4: Fonctionnement de la VR Box: le Joystick

Si le joystick est laissé en position centrale, aucune notification de joystick n'est envoyée. Une fois que le joystick est décentré, un message de notification contenant les données du joystick et les données du bouton de déclenchement est envoyé toutes les 15 ms environ. Lorsque le joystick est ramené au centre, une notification indiquant qu'il a été déplacé au centre n'est pas envoyée. En d'autres termes, il vous indique que le joystick s'est décentré, mais pas qu'il s'est déplacé vers le centre. Le résultat final est que vous recevez des messages indiquant que le joystick se déplace vers le centre, mais pas qu'il a atteint le centre. Très ennuyant. Les deux boutons de déclenchement sont inclus avec les données du joystick. Appuyez sur l'un des boutons de déclenchement après avoir remis le joystick au centre pour remettre la position du joystick à zéro. Le Framework intègre une minuterie d'expiration qui simule automatiquement un message de notification de joystick peu de temps après que tous les messages de notification de joystick/bouton de déclenchement cessent d'arriver. La minuterie met le joystick à zéro. Le joystick a une portée d'environ +/- 25 sur chaque axe.

Étape 5: Fonctionnement de la VR Box: Boutons de déclenchement

Les boutons de déclenchement enverront un message de notification une fois lorsqu'ils sont enfoncés et à nouveau lorsqu'ils sont relâchés. Le message de notification pressé indiquera le bouton qui a été pressé. Le message de notification de libération indique que les deux boutons sont relâchés.

Maintenir le bouton de déclenchement inférieur empêchera le serveur de détecter que le bouton de déclenchement supérieur a été enfoncé. En maintenant le bouton de déclenchement supérieur enfoncé et en appuyant sur le bouton de déclenchement inférieur, le serveur envoie un message de notification indiquant que le bouton de déclenchement inférieur est enfoncé (le bouton de déclenchement supérieur sera à zéro !). Si vous relâchez le bouton de déclenchement inférieur, le serveur enverra une notification indiquant que le bouton de déclenchement supérieur est enfoncé et que le déclencheur inférieur est relâché.

En d'autres termes, le bouton de déclenchement inférieur est dominant sur le bouton de déclenchement supérieur et le remplacera lorsque les deux seront enfoncés. Vous devez déterminer comment gérer le cas où les deux boutons sont enfoncés.

Étape 6: Fonctionnement de la VR Box: Boutons A/B

Les boutons A et B agissent comme le joystick et envoient en continu des messages de notification lorsqu'ils sont enfoncés et maintenus enfoncés. Les messages s'arrêtent lorsque le bouton est relâché. Les boutons A et B fonctionnent de manière similaire aux boutons de déclenchement en ce sens que le bouton A domine le bouton B tout comme le bouton de déclenchement inférieur domine le bouton de déclenchement supérieur.

Étape 7: Fonctionnement de la VR Box: Boutons C/D

Les boutons C et D envoient un message de notification une fois lorsqu'ils sont enfoncés et à nouveau lorsqu'ils sont relâchés. S'il est maintenu enfoncé, aucun autre message n'est envoyé jusqu'à ce qu'il soit libéré. Maintenir l'un des boutons C ou D empêchera le serveur de détecter une activité sur l'autre bouton.

Étape 8: Conclusion

Le fonctionnement des boutons est à mon avis un peu bancal. Le Framework fournit des emplacements pour placer votre code sur lequel agir lorsqu'un bouton est enfoncé. Si vous avez également besoin de détecter les relâchements de boutons, il vous reste à trouver comment faire.

C'est à vous de déterminer ce que vous voulez que chaque bouton fasse et ce que le déplacement du joystick doit faire. La façon dont vous gérez les différences dans la gâchette, les boutons A & B et C & D dépend de vous.

Recherchez dans le code le; taskJoyStick(), taskButtonAB(), taskButtonCD() et ajoutez votre code après le commentaire "//===== ajoutez votre code ici =====".

Vous aurez besoin de jusqu'à quatre fonctions pour gérer le joystick (avant, arrière, droite et gauche) et jusqu'à six fonctions pour gérer les différents boutons. Mettez-les en œuvre tous ou juste ce dont vous avez besoin. Le choix t'appartient.

Si vous utilisez ce framework. J'aimerais savoir pourquoi vous l'avez utilisé et si vous l'avez trouvé facile à utiliser.

Si vous avez des questions sur son fonctionnement ou si vous avez besoin d'aide pour le faire fonctionner, contactez-moi.

Le code est disponible sur GitHub ici.

Prendre plaisir.

Conseillé: