Mundarija:

Infinity velosiped - yopiq velosiped o'rgatish video o'yini: 5 qadam
Infinity velosiped - yopiq velosiped o'rgatish video o'yini: 5 qadam

Video: Infinity velosiped - yopiq velosiped o'rgatish video o'yini: 5 qadam

Video: Infinity velosiped - yopiq velosiped o'rgatish video o'yini: 5 qadam
Video: ТОП-10 признаков, что ВЕЛОСИПЕД – ХЛАМ. Такое покупать нельзя! 2024, Iyun
Anonim
Image
Image
Materiallar
Materiallar

Qish mavsumida, sovuq kunlarda va yomon ob -havoda, velosiped ixlosmandlari sevimli sport bilan shug'ullanish uchun faqat bir nechta variantga ega. Biz yopiq mashg'ulotlarni velosiped/trenajyor o'rnatishni yanada qiziqarli qilish usulini qidirayotgan edik, lekin mavjud bo'lgan mahsulotlarning ko'pi qimmat yoki oddiy zerikarli. Shu sababli biz Infinity Bike -ni Ochiq kodli o'quv video o'yini sifatida rivojlantira boshladik. Infinity velosiped velosipedingizning tezligi va yo'nalishini o'qiydi va interaktivlik darajasini taklif qiladi, uni velosiped murabbiylari bilan osongina topish mumkin emas.

Biz Arduino mikrokontrolerining soddaligi va 3D bosma qismlarining afzalliklaridan foydalanib, trenajyorga o'rnatilgan velosipedni arzon sensorlar bilan ta'minlaymiz. Ma'lumotlar mashhur "Unity" o'yini ishlab chiqaruvchi dvigatel yordamida tayyorlangan video o'yinlarga uzatiladi. Bu ko'rsatma oxirida siz velosipedda o'z sensorlaringizni o'rnatishingiz va sensorlar haqidagi ma'lumotlarni Unity-ga o'tkazishingiz kerak. Biz hatto trekni ham qo'shdik, unda siz minishingiz va yangi qurilmangizni sinab ko'rishingiz mumkin. Agar siz o'z hissangizni qo'shmoqchi bo'lsangiz, bizning GitHub -ni tekshirib ko'rishingiz mumkin.

1 -qadam: materiallar

Materiallar
Materiallar

Sizga kerak bo'lgan materiallar ro'yxati biroz farq qilishi mumkin; uchun

Masalan, velosipedingizning o'lchami sizga kerakli o'tish kabellarining uzunligini belgilaydi, lekin bu erda sizga kerak bo'ladigan asosiy qismlar. Siz, ehtimol, AliExpress kabi veb -saytdagi har bir buyum uchun arzonroq narxlarni topishingiz mumkin edi, lekin etkazib berish uchun 6 oy kutish har doim ham variant emas, shuning uchun biroz qimmatroq qismlardan foydalanganingiz uchun baho chalg'itilmagan.

1 x Arduino nano (22,00 dollar)

1 x Mini Breadboard ($ 1,33/birlik)

1 x 220 Ohmli rezistor (to'plami $ 1,00)

1 x 10K potentsiometr (birlik $ 1,80)

1 x Hall sensori ($ 0.96)

20 sm x 6 mm o'lchamdagi 3D printerli vaqt kamari (3,33 dollar)

1 to'plam x Har xil uzunlikdagi M3 vintlardek va murvat (6,82 dollar)

1 x velosiped tezligi o'lchagich magnit (0,98 dollar)

Biz yuqoridagi materialni 3D bosilgan qismlar bilan o'rnatdik. Biz ishlatgan fayllar quyida sanab o'tilgan va ular ushbu bo'lim boshidagi rasm bilan bir xil konventsiya bilan raqamlangan. Barcha fayllarni Thingiverse -da topish mumkin. Siz ularni avvalgidek ishlatishingiz mumkin, lekin biz o'lchamlari velosipedingizga mos kelishiga ishonch hosil qiling.

1. FrameConnection_PotentiometerHolder_U_Holder.stl

2. FrameConnection_Spacer.stl

3. BreadboardFrameHolder.stl

4. Pulley_PotentiometerSide.stl

5. Pot_PulleyConnection.stl

6. FrameConnection.stl

7. Pulley_HandleBarSide_Print2.stl

8. FrameToHallSensorConnector.stl

9. PotHolder.stl

10. HallSensorAttach.stl

2 -qadam: Ma'lumotlarni o'qish va Unity -ga o'tkazish

Ma'lumotlarni o'qish va Unity -ga o'tkazish
Ma'lumotlarni o'qish va Unity -ga o'tkazish

Arduino va Unity kodlari birgalikda yig'iladi, velosiped sensorlaridagi ma'lumotlarni uzatish va qayta ishlash. Birlik Arduino -dan qiymatni ketma -ket ketma -ket yuborish orqali so'raydi va Arduino talab qilingan qiymatlarga javob berishini kutadi.

Birinchidan, biz Arduino -ni kutubxona Serial buyrug'i bilan tayyorlaymiz, u Unity -dan so'rovlarni funktsiyasi bilan bog'lash orqali boshqariladi. Ushbu kutubxona uchun asosiy sozlash quyidagicha amalga oshirilishi mumkin;

#"SerialCommand.h" ni qo'shing

SerialCommand sCmd; void setup () {sCmd.addCommand ("TRIGG", TriggHanlder); Serial.begin (9600); } void loop () {while (Serial.available ()> 0) {sCmd.readSerial (); }} void TriggHandler () { /*Datchiklarni o'qing va uzating* /}

TriggHandler funksiyasi SCmd obyektiga biriktirilgan. Agar ketma -ket biriktirilgan buyruqqa mos keladigan satrni qabul qilsa (bu holda TRIGG), TriggHandler funktsiyasi bajariladi.

Biz rul yo'nalishini o'lchash uchun potentsiometrdan va velosipedning bir daqiqada aylanishini o'lchash uchun zallar sensori yordamida foydalanamiz. Potentsiometr ko'rsatkichlari Arduino-ning o'rnatilgan funktsiyalari yordamida osonlik bilan o'qilishi mumkin. TriggHandler funktsiyasi quyidagi o'zgarish bilan ketma -ket qiymatni chop etishi mumkin.

bekor TriggHandler () {

/*Potentsiometr qiymatini o'qish*/ Serial.println (analogRead (ANALOGPIN)); }

Foydali o'lchovlarni amalga oshirishimizdan oldin Hall sensori biroz sozlangan. Potentsiometrdan farqli o'laroq, zallar sensorining tezkor qiymati unchalik foydali emas. G'ildirak tezligini o'lchashga urinishganidan beri, tetiklar orasidagi vaqt qiziqdi.

Arduino kodida ishlatiladigan har bir funktsiyaga vaqt kerak bo'ladi va agar magnit zal sensori bilan noto'g'ri vaqtda bog'lansa, o'lchash eng yaxshi kechiktirilishi yoki eng yomon holatda o'tkazib yuborilishi mumkin. Bu juda yomon, chunki Arduino g'ildirakning haqiqiy tezligidan ancha farq qiladigan tezlik haqida xabar berishi mumkin edi.

Bunga yo'l qo'ymaslik uchun biz Arduinos -ning biriktiruvchi uzilish deb nomlangan xususiyatidan foydalanamiz, bu esa har doim belgilangan raqamli pin ko'tarilgan signal bilan ishga tushganda funktsiyani ishga tushirishga imkon beradi. Rpm_fun funktsiyasi o'rnatish kodiga bitta kod qatori qo'shilgan uzilishga biriktirilgan.

bo'sh o'rnatish () {

sCmd.addCommand ("TRIGG", TriggHanlder); attachInterrupt (0, rpm_fun, RISING); Serial.begin (9600); } // rpm_fun funktsiyasi tezlikni hisoblash uchun ishlatiladi va quyidagicha belgilanadi; imzosiz uzoq lastRevolTime = 0; imzosiz uzun revolSpeed = 0; void rpm_fun () {unsigned long revolTime = millis (); imzosiz uzoq deltaTime = revolTime - lastRevolTime; /*revolSpeed - Arduino kodiga uzatiladigan qiymat* / revolSpeed = 20000 / deltaTime; lastRevolTime = revolTime; } TriggHandler so'ralganda qolgan ma'lumotlarni uzatishi mumkin. void TriggHanlder () { /*Potentsiometrning qiymatini o'qish* / Serial.println (analogRead (ANALOGPIN)); Serial.println (revolSpeed); }

Endi bizda Arduino kodini yaratish uchun ishlatilishi mumkin bo'lgan barcha qurilish bloklari mavjud, ular Unity tomonidan so'rov yuborilganda ma'lumotlarni ketma -ket uzatadi. Agar siz to'liq kod nusxasini olishni istasangiz, uni bizning GitHub -da yuklab olishingiz mumkin. Kod to'g'ri sozlanganligini tekshirish uchun ketma-ket monitordan TRIGG yuborish mumkin; chiziqni Aravaga qaytish deb belgilashingizga ishonch hosil qiling. Keyingi bo'limda Unity skriptlari Arduino -dan qanday ma'lumot so'rashi va olishi mumkinligi muhokama qilinadi.

3 -qadam: ma'lumotlarni qabul qilish va qayta ishlash

Ma'lumotlarni qabul qilish va qayta ishlash
Ma'lumotlarni qabul qilish va qayta ishlash

Birlik - bu sevimli mashg'ulot uchun bepul mavjud bo'lgan ajoyib dastur

o'yinni yaratishga qiziqish; Bu C# skriptlari bilan nima qilishni cheklamasdan, masalan, ishlov berish yoki GPU dasturlash (AKA shading) kabi ba'zi narsalarni sozlashni vaqtini qisqartirishi mumkin bo'lgan juda ko'p funktsiyalar bilan birga keladi. Unity va Arduino mikrokontrollerlari nisbatan kichik byudjet bilan noyob interaktiv tajribalarni yaratish uchun birgalikda ishlatilishi mumkin.

Bu ko'rsatmaning asosiy maqsadi Unity va Arduino o'rtasidagi aloqani o'rnatishga yordam berishdir, shuning uchun biz Unity-ning ko'pgina xususiyatlariga chuqur kirmaymiz. Birlik uchun juda ko'p ajoyib darsliklar va Unity qanday ishlashini tushuntirib beradigan ajoyib jamoa bor. Biroq, bu ko'rsatma orqali o'z yo'lini topishga muvaffaq bo'lganlar uchun maxsus mukofot bor, bu esa nima qilish mumkinligini ko'rsatib beradi. Siz bizning Github -ga velosiped fizikasi bilan trekni birinchi urinishimizni yuklab olishingiz mumkin.

Birinchidan, ketma -ket Arduino bilan bog'lanish uchun bajarilishi kerak bo'lgan minimal darajadan o'tamiz. Bu kod o'yin uchun mos emasligi darhol aniq bo'ladi, lekin har bir qadamni bosib o'tish va cheklovlar nima ekanligini bilish yaxshi.

Unity -da ArduinoReceive nomli bitta bo'sh GameObject bilan yangi sahna yarating, C# skriptini ArduinoReceive deb nomlang. Bu erda biz Arduino bilan aloqani boshqaradigan barcha kodlarni qo'shamiz.

Kompyuteringizning ketma -ket portlari bilan bog'lanishimizdan oldin kirishimiz kerak bo'lgan kutubxona mavjud; Ba'zi kutubxonalardan foydalanishga ruxsat berish uchun birlikni o'rnatish kerak. Tartibga solish-> ProjectSerring-> Player-ga o'ting va Konfiguratsiya tugmachasi ostidagi Api moslik darajasi yonida. NET 2.0-ni. NET 2.0-ga o'rnating. Endi skriptning yuqori qismiga quyidagi kodni qo'shing;

System. IO. Ports -dan foydalanish;

Bu sizga ArduinoReceive sinfiga ob'ekt sifatida belgilashingiz mumkin bo'lgan SerialPort sinfiga kirishga imkon beradi. Boshqa skriptning aralashuviga yo'l qo'ymaslik uchun uni shaxsiy qiling.

xususiy SerialPort arduinoPort;

ArduinoPort moslamasini to'g'ri portni (masalan, USB Arduino ulangan) va uzatish tezligini (ya'ni ma'lumotni yuborish tezligini) tanlash orqali ochish mumkin. Agar Arduino qaysi portga ulanganiga ishonchingiz komil bo'lmasa, uni qurilma menejeridan yoki Arduino IDE -ni ochish orqali bilib olishingiz mumkin. Baud tezligi uchun, aksariyat qurilmalarda standart qiymat 9600, Arduino kodingizda bu qiymat borligiga ishonch hosil qiling va u ishlashi kerak.

Kod endi shunday bo'lishi kerak;

System. Collections -dan foydalanish;

System. Collections. Generic -dan foydalanish; UnityEngine -dan foydalanish; System. IO. Ports -dan foydalanish; umumiy sinf ArduinoReceive: MonoBehaviour {private SerialPort arduinoPort; // Buni ishga tushirish uchun ishlating void Start () {arduinoPort = yangi SerialPort ("COM5", 9600); arduinoPort. Open (); WriteToArduino ("TRIGG"); }}

Sizning MAQOMOTI raqamingiz boshqacha bo'lishi mumkin. Agar siz MACda bo'lsangiz, sizning COM ismingiz /dev/cu.wchusbserial1420 ga o'xshash nomga ega bo'lishi mumkin. 4 -bo'limdagi kod Arduino -ga yuklanganligiga va ketma -ket monitor bu bo'limning qolgan qismida yopilganligiga va bu kod muammosiz tuzilganligiga ishonch hosil qiling.

Keling, har bir kadrni Arduino -ga so'rov yuboramiz va natijalarni konsol oynasiga yozamiz. WriteToArduino funktsiyasini ArduinoReceive sinfiga qo'shing. Arduino kodi kiruvchi yo'riqnomani to'g'ri tahlil qilish uchun aravaning qaytishi va yangi qator zarur.

WriteToArduino shaxsiy bo'sh joy (satrli xabar)

{xabar = xabar + "\ r / n"; arduinoPort. Write (xabar); arduinoPort. BaseStream. Flush (); }

Bu funktsiyani Yangilash tsiklida chaqirish mumkin.

bekor qilingan yangilanish ()

{WriteToArduino ("TRIGG"); Debug. Log ("Birinchi qiymat:" + arduinoPort. ReadLine ()); Debug. Log ("Ikkinchi qiymat:" + arduinoPort. ReadLine ()); }

Yuqoridagi kod Arduino ma'lumotlarini o'qish uchun zarur bo'lgan minimal qiymatdir. Agar siz birlik tomonidan berilgan FPSga katta e'tibor bersangiz, ishlashning sezilarli pasayishini ko'rishingiz kerak. Menimcha, bu o'qish/yozishsiz 90 FPS atrofida 20 FPSgacha. Agar sizning loyihangiz tez -tez yangilanishni talab qilmasa, bu etarli bo'lishi mumkin, lekin video o'yin uchun 20 FPS juda past. Keyingi bo'limda ko'p tarmoqli yordamida ishlashni qanday yaxshilash mumkinligi muhokama qilinadi.

4 -qadam: Ma'lumot uzatishni optimallashtirish

Oldingi bo'limda asosiy sozlamalarni o'rnatish haqida gap boradi

Arduino va Unity dasturi o'rtasidagi aloqa. Ushbu kodning asosiy muammosi - bu ishlash. Amalda, Unity Arduino so'rovni qabul qilishini, qayta ishlashini va javob berishini kutishi kerak. Bu vaqt ichida Unity kodi so'rov bajarilishini kutishi kerak va boshqa hech narsa qilmaydi. Biz bu muammoni so'rovlarni bajaradigan va o'zgaruvchini asosiy oqimda saqlaydigan mavzu yaratish orqali hal qildik.

Boshlash uchun biz qo'shish orqali threading kutubxonasini kiritishimiz kerak;

System. Threading -dan foydalanish;

Keyinchalik, biz iplardan boshlaydigan funktsiyani o'rnatamiz. AsynchronousReadFromArduino Arduino -ga WrtieToArduino funktsiyasi yordamida so'rov yozishdan boshlanadi. O'qish sinab ko'rish blokiga kiritilgan, agar o'qish vaqti tugasa, o'zgaruvchilar null bo'lib qoladi va OnArduinoInfoReceive o'rniga OnArduinoInfoFail funktsiyasi chaqiriladi.

Keyin biz OnArduinoInfoFail va OnArduinoInfoReceive funktsiyalarini aniqlaymiz. Buning uchun biz natijalarni konsolda chop etamiz, lekin siz natijalarni loyihangiz uchun kerakli o'zgaruvchilarga saqlashingiz mumkin.

shaxsiy bo'sh joy OnArduinoInfoFail ()

{Debug. Log ("O'qib bo'lmadi"); } shaxsiy bo'sh joy OnArduinoInfoReceived (mag'lubiyat aylanishi, satr tezligi) {Debug. Log ("Readin Sucessfull"); Debug. Log ("Birinchi qiymat:" + aylanish); Debug. Log ("Ikkinchi qiymat:" + tezlik); }

Oxirgi qadam - Arduino -dan qiymatlarni talab qiladigan mavzularni ishga tushirish va to'xtatish. Biz yangisini boshlashdan oldin, uning oxirgi vazifasi bajarilganligiga ishonch hosil qilishimiz kerak. Aks holda, Arduino/Unity -ni chalkashtirib yuborishi va oldindan aytib bo'lmaydigan natijalarga olib kelishi mumkin bo'lgan bir vaqtning o'zida Arduino -ga bir nechta so'rovlar yuborilishi mumkin edi.

private Thread activeThread = null;

void Update () {if (activeThread == null ||! activeThread. IsAlive) {activeThread = new Thread (AsynchronousReadFromArduino); activeThread. Start (); }}

Agar siz kodning ishlashini 5 -bo'limda yozganimiz bilan solishtirsangiz, ish faoliyatini sezilarli darajada yaxshilash kerak.

shaxsiy bo'sh joy OnArduinoInfoFail ()

{Debug. Log ("O'qib bo'lmadi"); }

5 -qadam: Keyingi qaerda?

Keyingi qaerda?
Keyingi qaerda?

Biz Github -da (https://github.com/AlexandreDoucet/InfinityBike) yuklab olishingiz mumkin bo'lgan demo tayyorladik, kodni va o'yinni yuklab oling va bizning trekdan o'ting. Bularning barchasi tez mashq qilish uchun yaratilgan va umid qilamizki, agar siz o'rgatgan narsamizdan foydalansangiz, u sizga nimani qurishingiz mumkinligi haqida ta'm beradi.

Kreditlar

Loyiha ishtirokchilari

Alexandre Doucet (_Doucet_)

Maksim Boudro (MxBoud)

Tashqi manbalar [Unity o'yin mexanizmi] (https://unity3d.com)

Bu loyiha Allan Zukkoni "Arduino-ni Birlik bilan qanday birlashtirish kerak" qo'llanmasini o'qiganimizdan so'ng boshlandi (https://www.alanzucconi.com/2015/10/07/how-to-int…)

Arduino-dan so'rov SerialCommand kutubxonasi yordamida amalga oshiriladi (https://github.com/kroimon/Arduino-SerialCommand)

Tavsiya: