Агуулгын хүснэгт:

Infinity Bike - Дотор дугуйн сургалтын видео тоглоом: 5 алхам
Infinity Bike - Дотор дугуйн сургалтын видео тоглоом: 5 алхам

Видео: Infinity Bike - Дотор дугуйн сургалтын видео тоглоом: 5 алхам

Видео: Infinity Bike - Дотор дугуйн сургалтын видео тоглоом: 5 алхам
Видео: Amalfi & Atrani, Italy Walking Tour - 4K 60fps with Captions *NEW* 2024, Есдүгээр
Anonim
Image
Image
Материал
Материал

Өвлийн улирал, хүйтэн өдөр, цаг агаар муутай үед дугуйчин сонирхогчид дуртай спортоороо хичээллэх цөөн хэдэн сонголттой байдаг. Бид дугуй/сургагч багшийн тохиргоог ашиглан доторх сургалтыг арай илүү зугаатай болгох арга замыг хайж байсан боловч ихэнх бүтээгдэхүүн нь үнэтэй эсвэл ашиглахад уйтгартай байдаг. Ийм учраас бид Infinity Bike -ийг Нээлттэй эх сурвалжийн сургалтын видео тоглоом болгон хөгжүүлж эхэлсэн. Infinity дугуй нь таны унадаг дугуйн хурд, чиглэлийг уншиж, дугуйн дасгалжуулагчийн тусламжтайгаар олох боломжгүй интерактив түвшинг санал болгодог.

Бид Arduino микроконтроллерийн энгийн хялбар байдал, 3D хэвлэмэл хэсгүүдийн давуу талыг ашиглан сургагч дээр суурилуулсан унадаг дугуйнд хямд үнэтэй мэдрэгч суурилуулдаг. Мэдээллийг алдартай тоглоом бүтээх хөдөлгүүр болох Unity -тэй хийсэн видео тоглоомд дамжуулдаг. Энэхүү зааварчилгааны төгсгөлд та дугуй дээрээ өөрийн мэдрэгчийг тохируулж, мэдрэгчийнхээ мэдээллийг Unity рүү дамжуулах боломжтой байх ёстой. Бид та хамт явж, шинэ төхөөрөмжөө туршиж үзэх боломжтой замыг оруулсан болно. Хэрэв та хувь нэмэр оруулах сонирхолтой байгаа бол манай GitHub -ийг үзэх боломжтой.

Алхам 1: Материал

Материал
Материал

Танд хэрэгтэй материалын жагсаалт арай өөр байж магадгүй; -ийн хувьд

Жишээлбэл, дугуйны хэмжээ нь танд хэрэгтэй холбогч кабелийн уртыг тодорхойлдог боловч танд хэрэгтэй үндсэн хэсгүүдийг энд оруулав. AliExpress гэх мэт вэбсайт дээрх хэсэг бүрийн хувьд хямд үнийг олж магадгүй, гэхдээ тээвэрлэлтийг 6 сар хүлээх нь үргэлж сонголт биш тул арай илүү үнэтэй эд ангиудыг ашигладаг тул тооцоолол нь гажууддаггүй.

1 x Arduino нано ($ 22.00)

1 x Mini Breadboard ($ 1.33/нэгж)

1 x 220 Ом эсэргүүцэл (иж бүрдэл 1.00 доллар)

1 x 10K потенциометр (нэгж $ 1.80)

1 x танхимын мэдрэгч ($ 0.96)

20 см х 6 мм хэмжээтэй 3D принтерийн цагны бүс ($ 3.33)

1 багц x Янз бүрийн урт M3 эрэг, боолт ($ 6.82)

1 x Унадаг дугуйн хурд хэмжигч соронз ($ 0.98)

Бид дээрх материалыг 3D хэвлэсэн хэсгүүдээр холбосон. Бидний ашигласан файлуудыг доор жагсаасан бөгөөд энэ хэсгийн эхэнд байгаа зурагтай ижил дүрсээр дугаарласан болно. Бүх файлыг Thingiverse дээрээс олж болно. Та тэдгээрийг байгаагаар нь ашиглаж болно, гэхдээ бидний ашигласан хэмжээсүүд таны унадаг дугуйтай тохирч байгаа эсэхийг шалгаарай.

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: Өгөгдлийг уншиж, Unity руу шилжүүлэх

Өгөгдлийг Унших, Эв нэгдэл рүү шилжүүлэх
Өгөгдлийг Унших, Эв нэгдэл рүү шилжүүлэх

Arduino болон Unity код нь цуглуулахын тулд хамтран ажиллах болно.

дугуй дээрх мэдрэгчээс өгөгдлийг дамжуулах, боловсруулах. Юнити нь цувралыг дамжуулах замаар Arduino -аас үнэ цэнийг хүсч, Arduino -аас хүссэн утгын дагуу хариу өгөхийг хүлээх болно.

Нэгдүгээрт, бид Arduino -г номын сангийн сериал командын тусламжтайгаар бэлтгэдэг бөгөөд энэ нь Unity -с ирсэн хүсэлтийг функцтэй хослуулах замаар хүсэлтийг удирдахад хэрэглэгддэг. Энэхүү номын сангийн үндсэн тохиргоог дараах байдлаар хийж болно;

#"SerialCommand.h" -ийг оруулна уу

SerialCommand sCmd; хүчингүй тохиргоо () {sCmd.addCommand ("TRIGG", TriggHanlder); Цуваа эхлэх (9600); } void loop () {while (Serial.available ()> 0) {sCmd.readSerial (); }} void TriggHandler () { /*Мэдрэгчийг эндээс уншиж дамжуулна уу* /}

TriggHandler функцийг SCmd объектод хавсаргасан болно. Хэрэв цуврал нь хавсаргасан тушаалтай тохирох мөрийг хүлээн авбал (энэ тохиолдолд TRIGG) TriggHandler функцийг гүйцэтгэнэ.

Бид жолооны чиглэлийг хэмжихийн тулд потенциометр, унадаг дугуйны нэг минутын эргэлтийг хэмжих танхимын мэдрэгчийг ашигладаг. Потенциометрийн уншилтыг Arduino-ийн суурилуулсан функцуудыг ашиглан хялбархан хийж болно. TriggHandler функц нь дараах өөрчлөлтөөр утгыг цувралд хэвлэх боломжтой болно.

хүчингүй TriggHandler () {

/*Потенциометрийн утгыг унших*/ Serial.println (analogRead (ANALOGPIN)); }

Хэрэгтэй хэмжилт хийхээс өмнө танхимын мэдрэгч арай илүү тохируулагдсан байдаг. Потенциометрээс ялгаатай нь танхимын мэдрэгчийн агшин зуурын утга нь тийм ч ашигтай биш юм. Дугуйны хурдыг хэмжих гэж оролдож байсан тул триггерүүдийн хоорондох хугацаа нь сонирхож байсан зүйл юм.

Arduino кодонд ашиглагддаг функц бүр цаг хугацаа шаарддаг бөгөөд хэрэв соронз нь Hall мэдрэгчтэй буруу цагт таарвал хэмжилтийг хамгийн сайн хойшлуулж эсвэл хамгийн муу тохиолдолд алгасаж болно. Энэ нь мэдээж муу, учир нь Arduino нь дугуйны бодит хурднаас эрс ялгаатай хурдны талаар мэдээлж чаддаг.

Үүнээс зайлсхийхийн тулд бид Arduinos -ийн хавсаргах тасалдах функцийг ашигладаг бөгөөд энэ нь өгөгдсөн дохиогоор дижитал зүү асаах бүрт функцийг идэвхжүүлэх боломжийг олгодог. Rpm_fun функц нь тохируулгын кодод нэг мөр код нэмсэн тасалдалд хавсаргасан болно.

хүчингүй тохиргоо () {

sCmd.addCommand ("TRIGG", TriggHanlder); attachInterrupt (0, rpm_fun, RISING); Цуваа эхлэх (9600); } // rpm_fun функцийг хурдыг тооцоолоход ашигладаг бөгөөд үүнийг дараах байдлаар тодорхойлдог; гарын үсэг зураагүй long lastRevolTime = 0; гарын үсэг зураагүй урт revolSpeed = 0; void rpm_fun () {unsigned long revolTime = millis (); гарын үсэг зураагүй урт deltaTime = revolTime - lastRevolTime; /*revolSpeed бол Arduino код руу дамжуулсан утга юм* / revolSpeed = 20000 / deltaTime; lastRevolTime = revolTime; } Дараа нь TriggHandler шаардлагатай бол үлдсэн мэдээллийг дамжуулах боломжтой. void TriggHanlder () { /*Потенциометрийн утгыг унших* / Serial.println (analogRead (ANALOGPIN)); Serial.println (revolSpeed); }

Бидэнд одоо Unity -ээс хүсэлт гаргах үед өгөгдлийг цувралаар дамжуулах Arduino кодыг бүтээхэд ашиглаж болох бүх барилгын блокууд бий. Хэрэв та кодын бүрэн хуулбарыг авахыг хүсвэл манай GitHub дээрээс татаж авах боломжтой. Кодыг зөв тохируулсан эсэхийг шалгахын тулд та цуваа дэлгэцийг ашиглан TRIGG илгээж болно; Төгсгөлийг буцах гэж тохируулсан эсэхийг шалгаарай. Дараагийн хэсэг нь манай Юнити скриптүүд Arduino -оос хэрхэн мэдээлэл хүсч, хүлээн авах талаар ярилцах болно.

Алхам 3: Мэдээлэл хүлээн авах, боловсруулах

Мэдээлэл хүлээн авах, боловсруулах
Мэдээлэл хүлээн авах, боловсруулах

Unity бол үнэгүй хобби сонирхогчдод зориулсан гайхалтай програм хангамж юм

тоглоом хийх сонирхолтой; Энэ нь C# скриптүүдээр юу хийхийг хязгаарлахгүйгээр урсгалт эсвэл GPU програмчлал (AKA сүүдэрлэх) гэх мэт зарим зүйлийг тохируулах хугацааг үнэхээр бууруулах боломжтой олон тооны функцуудтай ирдэг. Unity болон Arduino микроконтроллеруудыг хамтад нь ашиглаж, харьцангуй бага төсөвтэй өвөрмөц интерактив туршлагыг бий болгож чадна.

Энэхүү зааварчилгааны гол зорилго нь Юнити ба Ардуино хоёрын хооронд харилцаа холбоо тогтооход туслах явдал юм, тиймээс бид Unity-ийн ихэнх боломжуудыг хэт гүнзгий судлахгүй. Эв нэгдэл, гайхалтай олон нийтэд зориулагдсан маш олон гайхалтай хичээлүүд байдаг бөгөөд энэ нь Юнити хэрхэн ажилладаг талаар илүү сайн ойлголт өгөх болно. Гэсэн хэдий ч хийж болох зүйлийг харуулах бяцхан үзүүлбэр болж өгдөг энэхүү зааварчилгаагаар дамжуулан амжилттай ажиллаж чаддаг хүмүүст зориулсан тусгай шагнал байдаг. Та манай Github дээрээс унадаг дугуйн физик бүхий зам хийх анхны оролдлогыг татаж авах боломжтой.

Нэгдүгээрт, цувралаар Arduino -той холбогдохын тулд хийх ёстой хамгийн бага хэмжээг авч үзье. Энэ код нь тоглоом тоглоход тохиромжгүй болох нь тодорхой болно, гэхдээ алхам бүрийг даван туулж, хязгаарлалтууд юу болохыг олж мэдэх нь зүйтэй юм.

Unity -д ArduinoReceive нэртэй ганц хоосон GameObject -тай шинэ дүрсийг бүтээгээрэй. Энэ скрипт бол бид Arduino -той харилцах бүх кодыг нэмэх болно.

Бид таны компьютерийн цуваа порттой харилцахаас өмнө хандах ёстой номын сан байдаг. Зарим номын санг ашиглахыг зөвшөөрөхийн тулд эв нэгдлийг тохируулах ёстой. Edit-> ProjectSerring-> Player рүү очоод Api Compatibility Level-ийн хажууд байгаа тохиргооны унтраалга. Одоо скриптийн дээд хэсэгт дараах кодыг нэмнэ үү;

System. IO. Ports ашиглах;

Энэ нь ArduinoReceive ангийн объект гэж тодорхойлж болох SerialPort ангилалд хандах боломжийг танд олгоно. Өөр скриптийг хөндлөнгөөс оролцуулахгүйн тулд үүнийг хувийн болго.

хувийн SerialPort arduinoPort;

ArduinoPort объектыг зөв порт (жишээлбэл Arduino USB -тэй холбогдсон) болон дамжуулах хурд (өөрөөр хэлбэл мэдээлэл дамжуулах хурд) сонгох замаар нээх боломжтой. Хэрэв та Arduino -ийг аль портод залгасан болохыг мэдэхгүй байгаа бол төхөөрөмжийн менежер эсвэл Arduino IDE -ийг нээх замаар олж мэдэх боломжтой. Бодын хурдны хувьд ихэнх төхөөрөмж дээрх анхдагч утга нь 9600 байдаг бөгөөд энэ утгыг Arduino код дээрээ оруулсан эсэхээ шалгаарай, энэ нь ажиллах ёстой.

Код одоо иймэрхүү харагдах ёстой;

System. Collections ашиглах;

System. Collections. Generic ашиглах; UnityEngine ашиглах; System. IO. Ports ашиглах; нийтийн анги ArduinoReceive: MonoBehaviour {хувийн SerialPort arduinoPort; // Үүнийг void Start () {arduinoPort = new SerialPort ("COM5", 9600) эхлүүлэхэд ашиглана уу; arduinoPort. Open (); WriteToArduino ("TRIGG"); }}

Таны COM дугаар өөр байх магадлалтай. Хэрэв та MAC дээр байгаа бол таны COM нэр нь /dev/cu.wchusbserial1420 шиг нэртэй байж магадгүй юм. 4 -р хэсгийн кодыг Arduino -д байршуулж, энэ хэсгийн үлдсэн хэсэгт цуваа дэлгэцийг хааж, энэ кодыг асуудалгүй эмхэтгэсэн эсэхийг шалгаарай.

Одоо бүх хүрээ Arduino руу хүсэлт илгээж, үр дүнг консолын цонхонд бичье. WriteToArduino функцийг ArduinoReceive ангилалд нэмнэ үү. Arduino код ирж буй зааврыг зөв задлахын тулд тэрэгний буцах болон шинэ шугам шаардлагатай.

хувийн хоосон WriteToArduino (мөрт мессеж)

{message = message + "\ r / n"; arduinoPort. Write (мессеж); arduinoPort. BaseStream. Flush (); }

Дараа нь энэ функцийг Update гогцоонд дуудаж болно.

хүчингүй шинэчлэлт ()

{WriteToArduino ("TRIGG"); Debug. Log ("Эхний утга:" + arduinoPort. ReadLine ()); Debug. Log ("Хоёр дахь утга:" + arduinoPort. ReadLine ()); }

Дээрх код нь Arduino -ийн өгөгдлийг уншихад шаардлагатай хамгийн бага хэмжээ юм. Хэрэв та эв нэгдлээр өгсөн FPS -ийг анхааралтай ажиглавал гүйцэтгэл мэдэгдэхүйц буурах болно. Миний хувьд энэ нь унших/бичихгүйгээр 90 FPS -ээс 20 FPS хүртэл явдаг. Хэрэв таны төсөл байнга шинэчлэлт хийх шаардлагагүй бол энэ нь хангалттай байж болох ч видео тоглоомын хувьд 20 FPS хэтэрхий бага байна. Дараагийн хэсэгт олон урсгалт ашиглан гүйцэтгэлийг хэрхэн сайжруулах талаар авч үзэх болно.

Алхам 4: Мэдээлэл дамжуулалтыг оновчтой болгох

Өмнөх хэсэгт үндсэн програмыг хэрхэн тохируулах талаар бичсэн болно

Arduino ба Unity програмын хоорондох харилцаа холбоо. Энэ кодын гол асуудал бол гүйцэтгэл юм. Одоогийн хэрэгжилтэд Unity нь Arduino -г хүсэлтийг хүлээн авах, боловсруулах, хариулах хүртэл хүлээх ёстой. Энэ хугацаанд Unity код нь хүсэлтийг биелүүлэхийг хүлээх ёстой бөгөөд өөр юу ч хийхгүй. Бид хүсэлтийг зохицуулж, хувьсагчийг үндсэн урсгал дээр хадгалах утас үүсгэх замаар энэ асуудлыг шийдсэн.

Эхлэхийн тулд бид урсгал оруулах номын санг нэмж оруулах ёстой;

System. Threading ашиглах;

Дараа нь бид утаснуудаас эхлүүлж буй функцийг тохируулдаг. AsynchronousReadFromArduino нь WrtieToArduino функцээр Arduino руу хүсэлт бичихээс эхэлдэг. Уншихыг оролдох блок дотор оруулсан бөгөөд хэрэв унших хугацаа дууссан бол хувьсагчид хүчингүй хэвээр байх ба OnArduinoInfoFece функцийг OnArduinoInfoReceive-ийн оронд дуудна.

Дараа нь бид OnArduinoInfoFail болон OnArduinoInfoReceive функцийг тодорхойлдог. Энэхүү зааварчилгааны хувьд бид үр дүнг консол дээр хэвлэдэг боловч та үр дүнг өөрийн төсөлд шаардлагатай хувьсагчдад хадгалах боломжтой.

хувийн хоосон OnArduinoInfoFail ()

{Debug. Log ("Уншиж чадсангүй"); } хувийн хоосон OnArduinoInfoReceived (мөрийг эргүүлэх, мөрийн хурд) {Debug. Log ("Readin Sucessfull"); Debug. Log ("Эхний утга:" + эргүүлэх); Debug. Log ("Хоёр дахь утга:" + хурд); }

Сүүлийн алхам бол Arduino -аас утгыг шаардах утаснуудыг эхлүүлэх, зогсоох явдал юм. Бид шинэ утас эхлэхээс өмнө сүүлчийн утас нь түүний сүүлчийн даалгаврыг гүйцэтгэсэн эсэхийг баталгаажуулах ёстой. Үгүй бол Arduino/Unity -ийг төөрөлдүүлж, урьдчилан таамаглах боломжгүй үр дүнд хүргэх олон хүсэлтийг нэг дор хийх боломжтой.

private Thread activeThread = null;

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

Хэрэв та кодын гүйцэтгэлийг 5 -р хэсэгт бичсэн кодтой харьцуулж үзвэл гүйцэтгэл мэдэгдэхүйц сайжирна.

хувийн хоосон OnArduinoInfoFail ()

{Debug. Log ("Уншиж чадсангүй"); }

Алхам 5: Дараа нь хаана байна?

Дараа нь хаана?
Дараа нь хаана?

Та манай Github дээрээс татаж авах боломжтой демо бэлдсэн (https://github.com/AlexandreDoucet/InfinityBike), код, тоглоомыг татаж аваад манай замыг туулаарай. Энэ бүхэн хурдан дасгал хийхэд зориулагдсан бөгөөд хэрэв та энэхүү зааварчилгааны тусламжтайгаар бидний зааж өгсөн зүйлийг ашиглавал таны бүтээж чадах зүйлийг амсуулж чадна гэж найдаж байна.

Зээл

Төслийн хувь нэмэр оруулагчид

Александр Дюцет (_Doucet_)

Максим Будро (MxBoud)

Гадаад эх сурвалж [Unity тоглоомын хөдөлгүүр] (https://unity3d.com)

Энэхүү төсөл нь Аллан Зукконигийн "Arduino-ийг Unity-тэй хэрхэн нэгтгэх" (https://www.alanzucconi.com/2015/10/07/how-to-int…) зааврыг уншсаны дараа эхэлсэн юм.

Arduino-ийн хүсэлтийг SerialCommand номын сан ашиглан гүйцэтгэдэг (https://github.com/kroimon/Arduino-SerialCommand)

Зөвлөмж болгож буй: