Sisukord:

Infinity Bike - siseruumides jalgrattatreeningu videomäng: 5 sammu
Infinity Bike - siseruumides jalgrattatreeningu videomäng: 5 sammu

Video: Infinity Bike - siseruumides jalgrattatreeningu videomäng: 5 sammu

Video: Infinity Bike - siseruumides jalgrattatreeningu videomäng: 5 sammu
Video: ТОП 13 Преимущества Электроскутера Citycoco VS бензиновых мопедов 2024, Juuni
Anonim
Image
Image
Materjalid
Materjalid

Talveperioodidel, külmadel päevadel ja halva ilmaga on jalgratturite entusiastidel vaid mõned võimalused oma lemmikspordi harrastamiseks. Otsisime võimalust jalgratta/treeneri seadistusega siseruumides treenimist veidi lõbusamaks muuta, kuid enamik saadaolevaid tooteid on kas kulukad või lihtsalt igavad. Seetõttu hakkasime arendama Infinity Bike'i avatud lähtekoodiga treeningvideomänguna. Infinity bike loeb teie jalgratta kiirust ja suunda ning pakub interaktiivsuse taset, mida jalgratta treeneritega hõlpsasti ei leia.

Kasutame lihtsust, mida pakub Arduino mikrokontroller ja mõned 3D -prinditud osad, et kinnitada odavad andurid treenijale paigaldatud jalgrattale. Teave edastatakse videomängule, mis on loodud populaarse mängutootmismootori Unity abil. Selle juhendi lõpuks peaksite saama oma jalgrattale oma andurid üles seada ja andurite teabe Unityle edastada. Lisasime isegi raja, millel saate mööda sõita ja oma uut seadistust katsetada. Kui olete oma panusest huvitatud, saate vaadata meie GitHubi.

Samm: materjalid

Materjalid
Materjalid

Vajalik materjalide loend võib veidi erineda; eest

Näiteks dikteerib teie ratta suurus vajalike hüppajakaablite pikkused, kuid siin on peamised osad, mida vajate. Tõenäoliselt leiate veebisaidilt, nagu AliExpress, iga tüki jaoks odavamad hinnad, kuid 6 -kuuline kohaletoimetamine ei ole alati valik, nii et kasutasite veidi kallimaid osi, nii et hinnang ei ole moonutatud.

1 x Arduino nano ($ 22.00)

1 x Mini Breadboard (1,33 dollarit ühiku kohta)

1 x 220 oomi takisti (1,00 dollarit komplekti kohta)

1 x 10K potentsiomeeter (1,80 dollarit ühiku kohta)

1 x Halli andur (0,96 dollarit)

20 cm x 6 mm 3D -printeri hammasrihm (3,33 dollarit)

1 komplekt x erineva pikkusega M3 kruvid ja poldid (6,82 dollarit)

1 x jalgratta spidomeetri magnet (0,98 dollarit)

Paigaldasime ülaltoodud materjali 3D -prinditud osadega. Meie kasutatavad failid on loetletud allpool ja need on nummerdatud sama tavaga nagu selle jaotise alguses olev pilt. Kõik failid leiate Thingiversest. Saate neid kasutada nii nagu on, kuid veenduge, et meie kasutatud mõõtmed vastavad teie jalgrattale.

1. FrameConnection_PotentiometerHolder_U_Holder.stl

2. FrameConnection_Spacer.stl

3. BreadboardFrameHolder.stl

4. Rihmaratas_PotentiometerSide.stl

5. Pot_PulleyConnection.stl

6. FrameConnection.stl

7. Pulley_HandleBarSide_Print2.stl

8. FrameToHallSensorConnector.stl

9. PotHolder.stl

10. HallSensorAttach.stl

2. samm: andmete lugemine ja edastamine Unityle

Andmete lugemine ja edastamine Unityle
Andmete lugemine ja edastamine Unityle

Arduino ja Unity kood töötavad koos, et koguda, jalgrattal olevate andurite andmeid edastada ja töödelda. Unity küsib väärtust Arduino käest, saates seeria kaudu stringi ja ootab, kuni Arduino vastab soovitud väärtustega.

Esiteks valmistame Arduino ette raamatukogu seeriakäsuga, mida kasutatakse Unity päringute haldamiseks, sidudes funktsiooniga päringustringi. Selle raamatukogu põhiseadistuse saab teha järgmiselt;

#include "SerialCommand.h"

SerialCommand sCmd; void setup () {sCmd.addCommand ("TRIGG", TriggHanlder); Seriaalne algus (9600); } void loop () {while (Serial.available ()> 0) {sCmd.readSerial (); }} void TriggHandler () { /*Lugege ja edastage andureid siit* /}

Funktsioon TriggHandler on lisatud objektile SCmd. Kui seeria saab stringi, mis vastab manustatud käsule (antud juhul TRIGG), käivitatakse funktsioon TriggHandler.

Roolisuuna mõõtmiseks kasutame potentsiomeetrit ja jalgratta pöörlemissageduse mõõtmiseks halli andurit. Potentsiomeetri näiteid saab hõlpsasti teha, kasutades Arduino sisseehitatud funktsioone. Funktsioon TriggHandler saab seejärel väärtuse seeriale printida järgmise muudatusega.

tühine TriggHandler () {

/*Potentsiomeetri väärtuse lugemine*/ Serial.println (analogRead (ANALOGPIN)); }

Halli anduril on natuke rohkem seadistusi, enne kui saame kasulikke mõõtmisi. Vastupidiselt potentsiomeetrile ei ole saali anduri hetkväärtus eriti kasulik. Kuna üritasime ratta kiirust mõõta, huvitas see päästikute vaheline aeg.

Iga Arduino koodis kasutatav funktsioon võtab aega ja kui magnet läheb Halli anduriga valele ajale, võib mõõtmine parimal juhul edasi lükata või halvemal juhul täielikult vahele jätta. See on ilmselgelt halb, sest Arduino võib teatada kiirusest, mis erineb ratta tegelikust kiirusest.

Selle vältimiseks kasutame Arduinose funktsiooni nimega manustamise katkestamine, mis võimaldab meil käivitada funktsiooni alati, kui määratud digitaalne tihvt käivitatakse tõusva signaaliga. Funktsioon rpm_fun on lisatud katkestusele, seadistuskoodile on lisatud üksainus koodirida.

tühine seadistus () {

sCmd.addCommand ("TRIGG", TriggHanlder); attachInterrupt (0, rpm_fun, RISING); Seriaalne algus (9600); } // Kiiruse arvutamiseks kasutatakse funktsiooni rpm_fun ja see on defineeritud kui; allkirjastamata pikk lastRevolTime = 0; allkirjata pikk pöörlemiskiirus = 0; void rpm_fun () {unsigned long revolTime = millis (); allkirjastamata pikk deltaTime = revolTime - lastRevolTime; /*revolSpeed on Arduino koodile edastatud väärtus* / revolSpeed = 20000 / deltaTime; lastRevolTime = revolTime; } Seejärel saab TriggHandler soovi korral edastada ülejäänud teabe. void TriggHanlder () { /*Potentsiomeetri väärtuse lugemine* / Serial.println (analogRead (ANALOGPIN)); Serial.println (revolSpeed); }

Meil on nüüd kõik ehitusplokid, mida saab kasutada Arduino koodi loomiseks, mis edastab andmed seeria kaudu kuni Unity taotluse esitamiseni. Kui soovite saada kogu koodi koopiat, saate selle alla laadida meie GitHubist. Et kontrollida, kas kood oli õigesti seadistatud, saate TRIGG-i saatmiseks kasutada jadamonitori; veenduge, et liini lõpuks oleks määratud Carriage return. Järgmine jaotis keskendub sellele, kuidas meie Unity skriptid saavad Arduino käest teavet küsida ja vastu võtta.

3. samm: andmete vastuvõtmine ja töötlemine

Andmete vastuvõtmine ja töötlemine
Andmete vastuvõtmine ja töötlemine

Unity on suurepärane tarkvara, mis on harrastajatele tasuta saadaval

huvitatud mängude tegemisest; see sisaldab suurt hulka funktsioone, mis võivad tõesti vähendada teatud asjade, näiteks keermestamise või GPU programmeerimise (AKA varjutus) seadistamise aega, piiramata seda, mida saab teha C# skriptidega. Unity ja Arduino mikrokontrollereid saab koos kasutada suhteliselt väikese eelarvega ainulaadsete interaktiivsete kogemuste loomiseks.

Selle juhendi eesmärk on aidata luua Unity ja Arduino vahelist suhtlust, nii et me ei sukelduks liiga sügavale enamikus Unity'is saadaolevatesse funktsioonidesse. Ühtsuse ja uskumatu kogukonna jaoks on palju suurepäraseid õpetusi, mis võiksid Unity toimimise selgitamiseks palju paremini hakkama saada. Siiski on eriauhind neile, kes suudavad selle juhendi läbi töötada, mis on väike näide sellest, mida võiks teha. Meie Githubist saate alla laadida meie esimese katse realistliku jalgrattafüüsikaga raja tegemiseks.

Kõigepealt vaatame läbi miinimumi, mis tuleb teha, et Arduinoga suhelda sarja kaudu. Kiiresti saab selgeks, et see kood ei sobi mängimiseks, kuid on hea läbida kõik sammud ja õppida, millised on piirangud.

Looge Unity'is uus stseen ühe tühja GameObjectiga, mille nimi on ArduinoRecept ja lisage C# skript, mille nimi on ka ArduinoRecept. See skript lisab kogu koodi, mis haldab Arduinoga suhtlemist.

On olemas teek, millele peab olema juurdepääs, enne kui saame teie arvuti jadaportidega suhelda; Unity tuleb seadistada teatud teekide kasutamiseks. Valige Redigeerimine-> ProjectSerring-> Mängija ja konfiguratsioonilüliti all oleva Api ühilduvusastme kõrval. NET 2.0 alamhulk. NET 2.0. Nüüd lisage skripti ülaossa järgmine kood;

kasutades System. IO. Ports;

See võimaldab juurdepääsu SerialPort klassile, mille saate määratleda ArduinoRecept klassi objektina. Muutke see privaatseks, et vältida teiste skriptide sekkumist.

privaatne SerialPort arduinoPort;

Objekti arduinoPort saab avada, valides õige pordi (nt millise USB -ga Arduino on ühendatud) ja andmeedastuskiirusega (st teabe saatmise kiirusega). Kui te pole kindel, millisesse porti Arduino on ühendatud, saate seda teada kas seadmehalduris või avades Arduino IDE. Boodikiiruse jaoks on enamiku seadmete vaikeväärtus 9600, lihtsalt veenduge, et see väärtus oleks teie Arduino koodis ja see peaks töötama.

Kood peaks nüüd välja nägema selline;

kasutades System. Collections;

kasutades System. Collections. Generic; UnityEngine'i kasutamine; kasutades System. IO. Ports; avalik klass ArduinoReieve: MonoBehaviour {private SerialPort arduinoPort; // Kasuta seda initsialiseerimisel void Start () {arduinoPort = new SerialPort ("COM5", 9600); arduinoPort. Open (); WriteToArduino ("TRIGG"); }}

Teie COM -number on tõenäoliselt erinev. Kui kasutate MAC -i, võib teie COM -i nimi olla selline /dev/cu.wchusbserial1420. Veenduge, et jaotise 4 kood on Arduinosse üles laaditud ja jadamonitor ülejäänud selle osa jaoks suletud ning see kood kompileerib ilma probleemideta.

Saadame nüüd igal kaadril Arduinole päringu ja kirjutame tulemused konsoolaknasse. Lisage funktsioon WriteToArduino klassi ArduinoRecept. Vankri tagastamine ja uus rida on vajalikud, et Arduino kood saaks sissetuleva käsu õigesti sõeluda.

private void WriteToArduino (stringisõnum)

{message = message + "\ r / n"; arduinoPort. Write (sõnum); arduinoPort. BaseStream. Flush (); }

Seda funktsiooni saab seejärel nimetada värskendusringis.

tühine värskendus ()

{WriteToArduino ("TRIGG"); Debug. Log ("Esimene väärtus:" + arduinoPort. ReadLine ()); Debug. Log ("Teine väärtus:" + arduinoPort. ReadLine ()); }

Ülaltoodud kood on miinimum, mida vajate Arduino andmete lugemiseks. Kui pöörate suurt tähelepanu ühtsuse FPS -ile, peaksite jõudlust märkimisväärselt langetama. Minu puhul läheb see umbes 90 kaadrit sekundis ilma lugemise/kirjutamiseta kuni 20 kaadrini sekundis. Kui teie projekt ei vaja sagedasi värskendusi, võib see olla piisav, kuid videomängu jaoks on 20 kaadrit sekundis liiga madal. Järgmine jaotis käsitleb, kuidas saate mitme keermestamise abil jõudlust parandada.

4. samm: andmeedastuse optimeerimine

Eelmine osa käsitles põhi seadistamist

suhtlus programmi Arduino ja Unity vahel. Selle koodi peamine probleem on jõudlus. Praeguses rakenduses peab Unity ootama, kuni Arduino saab taotluse vastu, töötleb ja vastab sellele. Selle aja jooksul peab Unity kood ootama taotluse täitmist ega tee muud. Lahendasime selle probleemi, luues lõime, mis tegeleb päringutega ja salvestab muutuja põhilõimele.

Alustuseks peame lisama lõiminguteegi;

kasutades System. Threadingut;

Järgmisena seadistame lõimides käivitatava funktsiooni. AsynchronousReadFromArduino alustab, kirjutades taotluse Arduinole funktsiooni WrtieToArduino abil. Lugemine on suletud proovipüüdmisplokki, kui lugemise ajalõpp jääb muutujad tühjaks ja OnArduinoInfoRecept asemel kutsutakse funktsioon OnArduinoInfoFail.

Järgmisena määratleme funktsioonid OnArduinoInfoFail ja OnArduinoInfoRecep. Selle juhendi jaoks prindime tulemused konsooli, kuid saate tulemused salvestada oma projekti jaoks vajalikele muutujatele.

private void OnArduinoInfoFail ()

{Debug. Log ("Lugemine ebaõnnestus"); } private void OnArduinoInfoReceived (stringide pöörlemine, stringide kiirus) {Debug. Log ("Readin Successfull"); Debug. Log ("Esimene väärtus:" + pööramine); Debug. Log ("Teine väärtus:" + kiirus); }

Viimane samm on alustada ja peatada niidid, mis küsivad Arduino väärtusi. Enne uue lõime alustamist peame tagama, et viimane lõng on tehtud viimase ülesandega. Vastasel juhul võidakse Arduinole esitada mitu taotlust korraga, mis võib Arduino/Unity segadusse ajada ja anda ettearvamatuid tulemusi.

private Thread activeThread = null;

tühine värskendus () {if (activeThread == null ||! activeThread. IsAlive) {activeThread = new Thread (AsynchronousReadFromArduino); activeThread. Start (); }}

Kui võrrelda koodi toimivust sellega, mille oleme kirjutanud 5. jaos, tuleks jõudlust oluliselt parandada.

private void OnArduinoInfoFail ()

{Debug. Log ("Lugemine ebaõnnestus"); }

5. samm: kuhu edasi?

Kuhu edasi?
Kuhu edasi?

Valmistasime ette demo, mille saate alla laadida meie Githubist (https://github.com/AlexandreDoucet/InfinityBike), laadida alla kood ja mäng ning sõita läbi meie raja. See kõik on ette nähtud kiireks treeninguks ja loodame, et see annab teile maitse, mida võiksite ehitada, kui kasutate seda, mida me teile selle juhendiga õpetasime.

Autorid

Projekti kaasautorid

Alexandre Doucet (_Doucet_)

Maxime Boudreau (MxBoud)

Välised ressursid [The Unity mängumootor] (https://unity3d.com)

See projekt sai alguse pärast seda, kui lugesime Allan Zucconi õpetust „Arduino integreerimine Unityga” (https://www.alanzucconi.com/2015/10/07/how-to-int…)

Arduino taotlust käsitletakse SerialCommandi raamatukogu abil (https://github.com/kroimon/Arduino-SerialCommand)

Soovitan: