„Ардуино“ на Пол Ян идва от виртуалната реалност в сферата на достъпността. Ян изповядва: „Аз абсолютно мразя да упражнявам и искам да направя това преживяване малко по-малко болезнено и успокояващо“. Това, в съчетание с идеята му, че Arduino е „алтернативен вид контролер на играта“, доведе до идеята за виртуална реалност. колоездене. Устройството работи по два механизма: измерва оборотите на колелото на колелото с тахометър, който използва инфрачервена светлина, и може да предава тази информация на смартфон през BLE. Тези механизми работят заедно за измерване на изхода на педалите и го захранват във виртуална среда.
Ян постави мотора си на неподвижен вътрешен треньор, позволявайки му да натисне педала на място. Красотата на устройството му е, че тя е широко съвместима не само с всякакъв вид мотор, но и теоретично с всяко устройство, което има примка или въртяща се повърхност, като например бягаща пътека. Това е така, защото оптичният тахометър е сравнително неинвазивен и изисква само малка част от хартията, залепена към гумата. Ян обяснява, че “всеки път, когато колелото завърши пълно завъртане, Arduino ще открие кога хартията минава покрай и след това изпраща безжично съобщение до мобилния телефон”, като по този начин движи виртуалния велосипед напред през неговата виртуална среда.
Yan използва тези $ 10 слушалки и обикновен градски анимационен филм, разработен с Unity, който той прави за VR с помощта на безплатния SDK на Google Cardboard. Той обяснява как е настроил виртуалния велосипед да се движи през околната среда:
Използвах пакет от трета страна, наречен Simple Waypoint System, за да изчертая пътя на сплайн. Ако знаете какво правите, този пакет не е необходим, но е направил живота много по-лесен. Един от примерите им е създаден, за да избута автомобил по пътека, използвайки бутона на клавиатурата, така че сменях колата с камерата и имах входящия BLE ping да извиква същата функция като бутона нагоре.
Като цяло, Ян цитира цената си като $ 30 за Arduino и $ 10 за слушалките, достигайки общо 40 $ за проекта. Въпреки това е важно да се отбележи, че средата Unity е $ 10 за изтегляне, пакетът на третата страна, който поддържа BLE за iOS и Android, е още $ 10, а опционалната система Simple Waypoint е $ 15. Също така ще трябва да изградите или да получите стационарна настройка на велосипеда, BLE пробив и IR сензор, за да свържете към Arduino. Плюс това, ако искате способността да управлявате мотора наляво и надясно, това ще изисква и допълнителни компоненти.Докато тези допълнителни съображения със сигурност допринасят за цената над $ 40, тя все още може да бъде построена за под $ 100, което също не е твърде оскърбено.
По-долу е представена схемата на Ян, както и кодът Arduino.
Arduino има два ключови компонента: BLE пробив (nRF8001 на Adafruit) и отразяващ IR сензор. Отражателният сензор има две страни: едната с IR LED (“E”) и другата с IR фототранзистор (“S”). Споех ги върху малка дъска за парфюм далеч от Ардуино с удължител, съставен от тел с 18 габарити. Тел е достатъчно дебел, за да окачи перфорацията във въздуха, но достатъчно гъвкава, за да регулира положението си и да се прицели като лампа с гъши шия. В nRF8001 BLE пробив заема пина 2, 9, 10, 11, 12 и 13, но вашата настройка вероятно ще се различават.
#include #include "Adafruit_BLE_UART.h" // nRF8001 игли: SCK: 13, MISO: 12, MOSI: 11, REQ: 10, ACI: X, RST: 9, 3Vo: X # дефиниране ADAFRUITBLE_REQ 10 # дефиниране ADAFRUITBLE_RST 9 # define ADAFRUITBLE_RDY 2 Adafruit_BLE_UART uart = Adafruit_BLE_UART (ADAFRUITBLE_REQ, ADAFRUITBLE_RDY, ADAFRUITBLE_RST); неподписано дълго време = 0l; boolean connection = false; 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 tripB между; boolean detectState = false; boolean lastDetectState = false; void setup (void) {Serial.begin (9600); pinMode (irPin, OUTPUT); pinMode (irSensorPin, INPUT); pinMode (testLEDPin, OUTPUT); uart.setDeviceName ( "YanBLE"); / * определи BLE име: 7 символа макс! * / uart.setRXcallback (rxCallback); uart.setACIcallback (aciCallback); uart.begin (); } void loop () {pollIR (); // IR сензор uart.pollACI (); // BLE} void pollIR () {digitalWrite (irPin, HIGH); if (digitalRead (irSensorPin) == LOW) {detectState = true; if (detectState! = lastDetectState) {// изпълни първия път, когато се открие отражение Serial.println ("съобщение, изпратено чрез BLE"); if (връзка == true) {sendBlueMessage ("1"); // пропуснати данни минаха тук, това може да бъде всяка стойност. Трябва само да пробваме приложението: lastDetectState = true; } else {// тук виждаме същото отражение върху няколко кадъра // включете LED теста, за да дадете визуална индикация за положително отражение на цифров запис (testLEDPin, HIGH); }} else {detectState = false; lastDetectState = false; digitalWrite (testLEDPin, LOW); }} / *********************************************** *************************** / / *! BLE-свързани функции под тази точка * / / **************************************** ********************************** / void aciCallback (събитие aci_evt_opcode_t) {// тази функция се извиква, когато изберете ACI събития се случват с ключ (събитие) {case ACI_EVT_DEVICE_STARTED: Serial.println (F ("Реклама започна")); прекъсване; случай ACI_EVT_CONNECTED: Serial.println (F ("Свързан!")); връзка = вярно; прекъсване; случай ACI_EVT_DISCONNECTED: Serial.println (F ("Прекъснат")); connection = false; прекъсване; по подразбиране: прекъсване; }} void rxCallback (uint8_t * буфер, uint8_t len) {// тази функция се извиква всеки път, когато данните постъпят в RX канала} void sendBlueMessage (String message) {uint8_t sendbuffer [20]; message.getBytes (sendbuffer, 20); char sendbuffersize = min (20, message.length ()); Serial.print (F ("*) Изпращане ->" ")); Serial.print ((char *) sendbuffer); Serial.println (" "); // записваме данните uart.write (sendbuffer, sendbuffersize); }