Jeffrey Cross
Jeffrey Cross

Pédalez un vélo dans la réalité virtuelle pour moins de 100 $

Le «truc Arduino» de Paul Yan fait entrer le cyclisme en réalité virtuelle dans le domaine de l’abordabilité. Yan confesse: "Je déteste absolument faire de l'exercice et je veux rendre cette expérience un peu moins douloureuse et engourdissante." Cela, ajouté à son idée qu'Arduino est "un autre type de contrôleur de jeu", a amené l'idée d'une réalité virtuelle. expérience de vélo. L’appareil fonctionne selon deux mécanismes: il mesure les révolutions de la roue du vélo avec un tachymètre qui utilise la lumière infrarouge et il est capable de communiquer ces informations à un smartphone via BLE. Ces mécanismes fonctionnent ensemble pour mesurer votre sortie de pédalage et l’alimenter dans un environnement de réalité virtuelle.

Yan a installé son vélo sur un entraîneur intérieur stationnaire, lui permettant de pédaler sur place. La beauté de son appareil réside dans le fait qu’il est largement compatible non seulement avec tous les types de vélo, mais aussi théoriquement avec tous les appareils dotés d’une surface en boucle ou tournante, comme un tapis de course. C’est parce que le tachymètre optique est relativement peu invasif et qu’il ne nécessite qu’un petit morceau de papier collé sur le pneu. Yan explique que "chaque fois que la roue effectue une rotation complète, l'Arduino détecte le moment où le morceau de papier passe et envoie ensuite un message sans fil au téléphone mobile", faisant ainsi avancer le vélo virtuel dans son environnement virtuel.

Yan utilise ce casque à 10 dollars et une simple ville de bande dessinée développée avec Unity qu’il rend pour la réalité virtuelle à l’aide du SDK gratuit de Google Cardboard. Il explique comment il a configuré le vélo virtuel pour se déplacer dans l'environnement:

J'ai utilisé un package tiers appelé Simple Waypoint System pour tracer un chemin de spline. Si vous savez ce que vous faites, ce package n’est pas nécessaire, mais il a rendu la vie beaucoup plus facile. L’un de leurs exemples a été conçu pour pousser une voiture le long d’un chemin à l’aide du bouton haut du clavier. J'ai donc remplacé la voiture par la caméra et le Ping BLE entrant a la même fonction que le bouton haut.

Au total, Yan cite son coût à 30 $ pour l’Arduino et à 10 $ pour le casque, soit un total de 40 $ pour le projet. Toutefois, il est important de noter que l’environnement Unity coûte 10 $, le package tiers prenant en charge BLE pour iOS et Android coûte 10 $, et le système optionnel Simple Waypoint est de 15 $. Vous aurez également besoin de créer ou d’obtenir une configuration de vélo stationnaire, une sortie BLE et un capteur infrarouge à connecter à l’Arduino. De plus, si vous souhaitez pouvoir diriger le vélo à gauche et à droite, des composants supplémentaires sont également nécessaires.Bien que ces considérations supplémentaires portent certainement le prix à plus de 40 $, il peut encore être construit pour moins de 100 $, ce qui n’est pas trop mal non plus.

Ci-dessous, le schéma de Yan ainsi que le code Arduino.

L’Arduino comporte deux composants clés: une sortie BLE (nRF8001 d’Adafruit) et un capteur infrarouge réfléchissant. Le capteur réfléchissant a deux côtés: l’un avec une LED IR (“E”) et l’autre avec un phototransistor IR (“S”). Je les ai soudés sur une petite planche de performance éloignée de l'Arduino avec une rallonge composée de fil de calibre 18. Le fil est assez épais pour suspendre la planche de perforation en l'air, mais suffisamment souple pour ajuster sa position et viser comme une lampe à col de cygne. Le module nRF8001 BLE utilise les broches 2, 9, 10, 11, 12 et 13, mais votre configuration sera probablement différente.

#include #include "Adafruit_BLE_UART.h" // broches nRF8001: SCK: 13, MISO: 12, MOSI: 11, REQ: 10, ACI: X, RST: 9, 3Vo: X #define ADAFRUITBLE_REQ 10 #define ADAFRUITBLE_RST 9 # define ADAFRUITBLE_RDY 2 Adafruit_BLE_UART uart = Adafruit_BLE_UART (ADAFRUITBLE_REQ, ADAFRUITBLE_RDY, ADAFRUITBLE_RST); unsigned long time = 0l; connexion booléenne = faux; uint8_t btm = 65; uint8_t out = btm; uint8_t cap = 90; #define persec 30 #define sendat (1000 / persec) int irPin = 7; int irSensorPin = 5; int testLEDPin = 4; int tripTime = 0; int lastTrip = 0; int tripBetween; boolean detectState = false; boolean lastDetectState = false; void setup (void) {Serial.begin (9600); pinMode (irPin, OUTPUT); pinMode (irSensorPin, INPUT); pinMode (testLEDPin, OUTPUT); uart.setDeviceName ("YanBLE"); / * définition du nom BLE: 7 caractères maximum! * / uart.setRXcallback (rxCallback); uart.setACIcallback (aciCallback); uart.begin (); } void loop () {pollIR (); // capteur infrarouge uart.pollACI (); // BLE} void pollIR () {digitalWrite (irPin, HIGH); if (digitalRead (irSensorPin) == BAS) {detectState = true; if (detectState! = lastDetectState) {// exécute la première réflexion détectée Serial.println ("message envoyé via BLE"); if (connection == true) {sendBlueMessage ("1"); // données factices passées ici, cela peut être n'importe quelle valeur. Nous avons juste besoin de faire un ping sur l'application} lastDetectState = true; } else {// nous voyons la même réflexion sur plusieurs images // allume la LED de test pour donner une indication visuelle d'une réflexion positive digitalWrite (testLEDPin, HIGH); }} else {detectState = false; lastDetectState = false; digitalWrite (testLEDPin, LOW); }} / ********************************************** **************************** / / *! Fonctions liées à la BLE en dessous de ce point * / / *************************************** *********************************** / void aciCallback (événement aci_evt_opcode_t) {// cette fonction est appelée à chaque fois que vous sélectionnez Les événements ACI ont lieu switch (événement) {case ACI_EVT_DEVICE_STARTED: Serial.println (F ("Annonce lancée")); Pause; case ACI_EVT_CONNECTED: Serial.println (F ("Connecté!")); connexion = true; Pause; case ACI_EVT_DISCONNECTED: Serial.println (F ("Déconnecté")); connexion = faux; Pause; défaut: break; }} void rxCallback (tampon uint8_t *, lint uint8_t) {// cette fonction est appelée chaque fois que des données arrivent sur le canal RX} void sendBlueMessage (message de chaîne) {uint8_t sendbuffer [20]; message.getBytes (sendbuffer, 20); char sendbuffersize = min (20, message.length ()); Serial.print (F (" n * Envoi -> " ")); Serial.print ((char *) sendbuffer); Serial.println (" ""); // écrit les données uart.write (sendbuffer, sendbuffersize); }

Part

Laisser Un Commentaire