সুচিপত্র:

ইনফিনিটি বাইক - ইনডোর বাইক ট্রেনিং ভিডিও গেম: ৫ টি ধাপ
ইনফিনিটি বাইক - ইনডোর বাইক ট্রেনিং ভিডিও গেম: ৫ টি ধাপ

ভিডিও: ইনফিনিটি বাইক - ইনডোর বাইক ট্রেনিং ভিডিও গেম: ৫ টি ধাপ

ভিডিও: ইনফিনিটি বাইক - ইনডোর বাইক ট্রেনিং ভিডিও গেম: ৫ টি ধাপ
ভিডিও: রয়্যাল এনফিল্ডের সবচেয়ে সস্তার বাইক || Royal Enfield Bike 2022 || Royal enfield bullet 350 2024, নভেম্বর
Anonim
Image
Image
উপকরণ
উপকরণ

শীতের,তু, ঠান্ডা দিন এবং খারাপ আবহাওয়ার সময়, সাইক্লিস্ট উত্সাহীদের কাছে তাদের পছন্দের খেলাধুলা করার জন্য ব্যায়াম করার কয়েকটি বিকল্প রয়েছে। আমরা বাইক/ট্রেনার সেটআপ দিয়ে একটু বেশি বিনোদনমূলক ইনডোর ট্রেনিং করার উপায় খুঁজছিলাম কিন্তু বেশিরভাগ প্রোডাক্টই হয় ব্যয়বহুল অথবা ব্যবহারে বিরক্তিকর। এই কারণেই আমরা ইনফিনিটি বাইককে একটি ওপেন সোর্স প্রশিক্ষণ ভিডিও গেম হিসাবে বিকাশ করতে শুরু করেছি। ইনফিনিটি বাইক আপনার সাইকেল থেকে গতি এবং দিকটি পড়ে এবং এমন একটি ইন্টারঅ্যাক্টিভিটি অফার করে যা বাইক প্রশিক্ষকদের সাথে সহজে পাওয়া যায় না।

আমরা Arduino মাইক্রোকন্ট্রোলার থেকে পাওয়া সরলতার সুবিধা গ্রহণ করি এবং কিছু থ্রিডি প্রিন্টেড পার্টস সস্তায় সেন্সর সুরক্ষিত করে প্রশিক্ষকের উপর বসানো সাইকেলে। তথ্যটি জনপ্রিয় গেম তৈরির ইঞ্জিন, ইউনিটি দিয়ে তৈরি একটি ভিডিও গেমের সাথে সম্পর্কিত। এই নির্দেশের শেষে, আপনি আপনার বাইকে আপনার নিজের সেন্সর সেট-আপ করতে এবং আপনার সেন্সরের তথ্য ইউনিটিতে স্থানান্তর করতে সক্ষম হবেন। আমরা এমন একটি ট্র্যাকও অন্তর্ভুক্ত করেছি যার উপর দিয়ে আপনি যাত্রা করতে পারেন এবং আপনার নতুন সেট-আপ পরীক্ষা করতে পারেন। আপনি যদি অবদান রাখতে আগ্রহী হন তবে আপনি আমাদের গিটহাব চেকআউট করতে পারেন।

ধাপ 1: উপকরণ

উপকরণ
উপকরণ

আপনার প্রয়োজনীয় সামগ্রীর তালিকা কিছুটা পরিবর্তিত হতে পারে; জন্য

উদাহরণস্বরূপ, আপনার বাইকের আকার আপনার প্রয়োজনীয় জাম্পার তারের দৈর্ঘ্য নির্ধারণ করবে কিন্তু এখানে আপনার প্রয়োজনীয় প্রধান অংশগুলি রয়েছে। আপনি সম্ভবত AliExpress এর মতো ওয়েবসাইটে প্রতিটি অংশের জন্য সস্তা দাম খুঁজে পেতে পারেন কিন্তু শিপিংয়ের জন্য 6 মাস অপেক্ষা করা সবসময় একটি বিকল্প নয় তাই সামান্য বেশি ব্যয়বহুল যন্ত্রাংশ ব্যবহার করা তাই অনুমানটি তির্যক হয় না।

1 x Arduino ন্যানো ($ 22.00)

1 x মিনি ব্রেডবোর্ড ($ 1.33/ইউনিট)

1 x 220 ওহম প্রতিরোধক ($ 1.00/কিট)

1 x 10K পোটেন্টিওমিটার ($ 1.80/ইউনিট)

1 এক্স হল সেন্সর ($ 0.96)

20 সেমি x 6 মিমি 3 ডি প্রিন্টার টাইমিং বেল্ট ($ 3.33)

1 কিট x বিভিন্ন দৈর্ঘ্যের M3 স্ক্রু এবং বোল্ট ($ 6.82)

1 এক্স সাইকেল স্পিডোমিটার চুম্বক ($ 0.98)

আমরা 3D মুদ্রিত অংশগুলির সাথে উপরের উপাদানটি মাউন্ট করেছি। আমরা যে ফাইলগুলি ব্যবহার করেছি তা নীচে তালিকাভুক্ত করা হয়েছে এবং সেগুলি এই বিভাগের শুরুতে চিত্রের মতো একই কনভেনশনের সাথে সংখ্যাযুক্ত। সমস্ত ফাইল থিংভার্সে পাওয়া যাবে। আপনি সেগুলিকে যেমন ব্যবহার করতে পারেন কিন্তু নিশ্চিত করুন যে আমরা যে মাত্রাগুলি ব্যবহার করেছি তা আপনার বাইকের সাথে মেলে।

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: পড়া এবং ইউনিটিতে ডেটা স্থানান্তর

পড়া এবং ইউনিটিতে ডেটা স্থানান্তর
পড়া এবং ইউনিটিতে ডেটা স্থানান্তর

Arduino এবং ইউনিটি কোড একত্রিত করার জন্য কাজ করবে, বাইকের সেন্সর থেকে ডেটা স্থানান্তর এবং প্রক্রিয়া করুন। Ityক্য সিরিয়ালের মাধ্যমে একটি স্ট্রিং পাঠিয়ে Arduino থেকে মূল্য অনুরোধ করবে এবং অনুরোধ করা মানগুলির সাথে Arduino সাড়া দেওয়ার জন্য অপেক্ষা করবে।

প্রথমে, আমরা লাইব্রেরি সিরিয়াল কমান্ড দিয়ে Arduino প্রস্তুত করি যা একটি ফাংশনের সাথে একটি অনুরোধ স্ট্রিং যুক্ত করে ইউনিটির অনুরোধগুলি পরিচালনা করতে ব্যবহৃত হয়। এই লাইব্রেরির জন্য একটি মৌলিক সেটআপ অনুসরণ করা যেতে পারে;

#অন্তর্ভুক্ত করুন "SerialCommand.h"

সিরিয়ালকম্যান্ড এসসিএমডি; অকার্যকর সেটআপ () {sCmd.addCommand ("TRIGG", TriggHanlder); Serial.begin (9600); } void loop () {while (Serial.available ()> 0) {sCmd.readSerial (); }} অকার্যকর TriggHandler () { /*পড়ুন এবং সেন্সরগুলি এখানে প্রেরণ করুন* /}

TriggHandler ফাংশন SCMD বস্তুর সাথে সংযুক্ত। যদি সিরিয়ালটি একটি স্ট্রিং পায় যা সংযুক্ত কমান্ডের সাথে মেলে (এই ক্ষেত্রে TRIGG), ফাংশনটি TriggHandler চালানো হয়।

আমরা সাইকেলের প্রতি মিনিটে ঘূর্ণন পরিমাপ করার জন্য স্টিয়ারিং দিক এবং একটি হল সেন্সর পরিমাপ করতে পোটেন্টিওমিটার ব্যবহার করি। আরডুইনো থেকে বিল্ড-ইন ফাংশন ব্যবহার করে পটেন্টিওমিটারের রিডিংগুলি সহজেই তৈরি করা যায়। TriggHandler ফাংশনটি নিম্নলিখিত পরিবর্তনের সাথে সিরিয়ালে মান মুদ্রণ করতে পারে।

অকার্যকর TriggHandler () {

/*Potentiometer এর মান পড়া*/ Serial.println (analogRead (ANALOGPIN)); }

আমরা দরকারী পরিমাপ করার আগে হল সেন্সরটি একটু বেশি সেট আপ করা আছে। পোটেন্টিওমিটারের বিপরীতে, হল সেন্সরের তাত্ক্ষণিক মান খুব বেশি কার্যকর নয়। যেহেতু চাকাটির গতি পরিমাপ করার চেষ্টা করছিল, তাই ট্রিগারগুলির মধ্যে সময়টিই আগ্রহী ছিল।

আরডুইনো কোডে ব্যবহৃত প্রতিটি ফাংশন সময় নেয় এবং যদি ভুল সময়ে হল সেন্সরের সাথে চুম্বক লাইন থাকে তবে পরিমাপটি দেরিতে হতে পারে বা পুরোপুরি খারাপ অবস্থায় এড়িয়ে যেতে পারে। এটি স্পষ্টতই খারাপ কারণ Arduino একটি গতি রিপোর্ট করতে পারে যা চাকার প্রকৃত গতির চেয়ে অনেক আলাদা।

এটি এড়ানোর জন্য, আমরা Arduinos এর একটি বৈশিষ্ট্য ব্যবহার করি যার নাম সংযুক্তি বাধা যা আমাদের একটি ফাংশন ট্রিগার করতে দেয় যখনই একটি নির্দিষ্ট ডিজিটাল পিন একটি ক্রমবর্ধমান সংকেত দিয়ে ট্রিগার হয়। ফাংশন rpm_fun সেটআপ কোডে কোডের একক লাইন যুক্ত করে একটি বাধা যুক্ত করা হয়।

অকার্যকর সেটআপ(){

sCmd.addCommand ("TRIGG", TriggHanlder); attachInterrupt (0, rpm_fun, RISING); Serial.begin (9600); } // ফাংশন rpm_fun গতি গণনা করতে ব্যবহৃত হয় এবং এটিকে সংজ্ঞায়িত করা হয়; স্বাক্ষরবিহীন দীর্ঘ lastRevolTime = 0; স্বাক্ষরবিহীন দীর্ঘ বিদ্রোহ গতি = 0; অকার্যকর rpm_fun () {স্বাক্ষরবিহীন দীর্ঘ revolTime = মিলিস (); স্বাক্ষরবিহীন দীর্ঘ ডেল্টাটাইম = revolTime - lastRevolTime; /*revolSpeed হল Arduino কোডে প্রেরিত মান* / revolSpeed = 20000 / deltaTime; lastRevolTime = revolTime; } TriggHandler অনুরোধ করার পর বাকি তথ্য প্রেরণ করতে পারে। অকার্যকর TriggHanlder () { /*potentiometer এর মান পড়া* / Serial.println (analogRead (ANALOGPIN)); Serial.println (revolSpeed); }

আমাদের কাছে এখন সমস্ত বিল্ডিং ব্লক রয়েছে যা Arduino কোড তৈরিতে ব্যবহার করা যেতে পারে যা সিরিয়ালের মাধ্যমে ডেটা স্থানান্তর করবে যখন ইউনিটি একটি অনুরোধ করবে। আপনি যদি সম্পূর্ণ কোডের একটি কপি পেতে চান, আপনি আমাদের গিটহাব থেকে এটি ডাউনলোড করতে পারেন। কোডটি সঠিকভাবে সেট-আপ করা হয়েছে কিনা তা পরীক্ষা করার জন্য, আপনি TRIGG পাঠাতে সিরিয়াল মনিটর ব্যবহার করতে পারেন; নিশ্চিত করুন যে আপনি ক্যারিজ রিটার্নের শেষ লাইন সেট করেছেন। পরবর্তী অংশটি আমাদের ইউনিটি স্ক্রিপ্টগুলি কীভাবে আর্ডুইনো থেকে তথ্য অনুরোধ এবং গ্রহণ করতে পারে সেদিকে মনোনিবেশ করবে।

ধাপ 3: তথ্য গ্রহণ এবং প্রক্রিয়াকরণ

তথ্য গ্রহণ এবং প্রক্রিয়াকরণ
তথ্য গ্রহণ এবং প্রক্রিয়াকরণ

ইউনিটি একটি দুর্দান্ত সফ্টওয়্যার যা শখের জন্য বিনামূল্যে পাওয়া যায়

গেম তৈরিতে আগ্রহী; এটি একটি বড় সংখ্যক কার্যকারিতা নিয়ে আসে যা C# স্ক্রিপ্ট দিয়ে কী করা যায় তা সীমাবদ্ধ না করে থ্রেডিং বা GPU প্রোগ্রামিং (AKA শেডিং) এর মতো কিছু জিনিস সেট করার সময় সত্যিই হ্রাস করতে পারে। ইউনিটি এবং আরডুইনো মাইক্রোকন্ট্রোলারগুলিকে তুলনামূলকভাবে ছোট বাজেটের সাথে অনন্য ইন্টারেক্টিভ অভিজ্ঞতা তৈরি করতে ব্যবহার করা যেতে পারে।

এই নির্দেশনার ফোকাস হল ইউনিটি এবং আরডুইনো এর মধ্যে যোগাযোগ স্থাপন করতে সাহায্য করা যাতে আমরা ইউনিটির সাথে উপলব্ধ বেশিরভাগ বৈশিষ্ট্যগুলির মধ্যে খুব গভীরভাবে ডুব দেব না। Unityক্য এবং অবিশ্বাস্য সম্প্রদায়ের জন্য প্রচুর গ্রেট টিউটোরিয়াল রয়েছে যা ইউনিটি কীভাবে কাজ করে তা ব্যাখ্যা করে আরও ভাল কাজ করতে পারে। যাইহোক, তাদের জন্য একটি বিশেষ পুরস্কার রয়েছে যারা এই নির্দেশনার মাধ্যমে তাদের পথ পরিচালনা করতে পারে যা কি করা যেতে পারে তার সামান্য শোকেস হিসাবে কাজ করে। আপনি আমাদের Github এ ডাউনলোড করতে পারেন আমাদের প্রথম প্রচেষ্টা বাস্তবসম্মত বাইক পদার্থবিজ্ঞানের সাথে একটি ট্র্যাক তৈরির।

প্রথমে, আসুন সর্বনিম্ন সর্বনিম্ন মাধ্যমে যাই যা সিরিয়ালের মাধ্যমে একটি আরডুইনোর সাথে যোগাযোগ করার জন্য করা উচিত। এটি দ্রুত স্পষ্ট হয়ে যাবে যে এই কোডটি গেমপ্লের জন্য উপযুক্ত নয় কিন্তু প্রতিটি ধাপ অতিক্রম করা এবং সীমাবদ্ধতাগুলি কী তা শিখতে ভাল।

Ityক্যে, ArduinoReceive নামে একটি খালি GameObject এর সাথে একটি নতুন দৃশ্য তৈরি করুন যার সাথে ArduinoReceive নামে একটি C# স্ক্রিপ্টও সংযুক্ত করুন। এই স্ক্রিপ্টটি যেখানে আমরা সমস্ত কোড যুক্ত করব যা Arduino এর সাথে যোগাযোগ পরিচালনা করে।

আপনার কম্পিউটারের সিরিয়াল পোর্টগুলির সাথে যোগাযোগ করার আগে একটি লাইব্রেরি রয়েছে যা অ্যাক্সেস করা আবশ্যক; নির্দিষ্ট লাইব্রেরি ব্যবহার করার অনুমতি দিতে ityক্য সেট আপ করা আবশ্যক। Edit-> ProjectSerring-> Player এ যান এবং এপিআই কম্প্যাটিবিলিটি লেভেলের পাশে কনফিগারেশন সুইচ. NET 2.0 সাবসেট থেকে. NET 2.0 এ যান। এখন স্ক্রিপ্টের শীর্ষে নিম্নলিখিত কোড যোগ করুন;

System. IO. Ports ব্যবহার করে;

এটি আপনাকে সিরিয়ালপোর্ট ক্লাস অ্যাক্সেস করতে দেবে যা আপনি ArduinoReceive ক্লাসের একটি বস্তু হিসাবে সংজ্ঞায়িত করতে পারেন। অন্য স্ক্রিপ্ট থেকে কোন হস্তক্ষেপ এড়াতে এটি ব্যক্তিগত করুন।

ব্যক্তিগত SerialPort arduinoPort;

ArduinoPort অবজেক্টটি সঠিক পোর্ট নির্বাচন করে খোলা যেতে পারে (যেমন ইউএসবিতে আরডুইনো সংযুক্ত থাকে) এবং একটি বড রেট (অর্থাৎ যে গতিতে তথ্য পাঠানো হয়)। আপনি যদি নিশ্চিত না হন যে কোন পোর্টে Arduino প্লাগ করা আছে আপনি ডিভাইস ম্যানেজারে অথবা Arduino IDE খোলার মাধ্যমে খুঁজে পেতে পারেন। বড রেটের জন্য, বেশিরভাগ ডিভাইসে ডিফল্ট মান 9600, শুধু নিশ্চিত করুন যে আপনার Arduino কোডে এই মান আছে এবং এটি কাজ করা উচিত।

কোড এখন এই মত হওয়া উচিত;

System. Collections ব্যবহার করে;

System. Collections. Generic ব্যবহার করে; ইউনিটি ইঞ্জিন ব্যবহার করে; System. IO. Ports ব্যবহার করে; পাবলিক ক্লাস ArduinoReceive: MonoBehaviour {private SerialPort arduinoPort; // শুরুর অকার্যকর শুরুর জন্য এটি ব্যবহার করুন () {arduinoPort = new SerialPort ("COM5", 9600); arduinoPort. Open (); WriteToArduino ("TRIGG"); }}

আপনার COM নম্বরটি সম্ভবত ভিন্ন হবে। আপনি যদি MAC এ থাকেন, তাহলে আপনার COM নামের একটি নাম থাকতে পারে যা এই /dev/cu.wchusbserial1420 এর মত দেখায়। নিশ্চিত করুন যে বিভাগ 4 থেকে কোডটি আরডুইনোতে আপলোড করা হয়েছে এবং সিরিয়াল মনিটরটি এই বিভাগের বাকি অংশে বন্ধ রয়েছে এবং এই কোডটি সমস্যা ছাড়াই সংকলিত হয়।

আসুন এখন প্রতিটি ফ্রেমে আরডুইনোকে একটি অনুরোধ পাঠাই এবং ফলাফলগুলি কনসোল উইন্ডোতে লিখি। ArduinoReceive ক্লাসে WriteToArduino ফাংশন যোগ করুন। আগত নির্দেশনা সঠিকভাবে বিশ্লেষণ করতে Arduino কোডের জন্য ক্যারেজ রিটার্ন এবং নতুন লাইন প্রয়োজন।

ব্যক্তিগত অকার্যকর WritToArduino (স্ট্রিং বার্তা)

{বার্তা = বার্তা + "\ r / n"; arduinoPort. Write (বার্তা); arduinoPort. BaseStream. Flush (); }

এই ফাংশনটি তখন আপডেট লুপে বলা যেতে পারে।

অকার্যকর আপডেট ()

{WriteToArduino ("TRIGG"); ডিবাগ। লগ ("প্রথম মান:" + arduinoPort. ReadLine ()); ডিবাগ। লগ ("দ্বিতীয় মান:" + arduinoPort. ReadLine ()); }

উপরের কোডটি ন্যূনতম ন্যূনতম যা আপনাকে একটি Arduino থেকে ডেটা পড়তে হবে। আপনি যদি unityক্যের দ্বারা প্রদত্ত এফপিএসের প্রতি গভীর মনোযোগ দেন, তাহলে আপনার কর্মক্ষমতাতে উল্লেখযোগ্য হ্রাস দেখা উচিত। আমার ক্ষেত্রে, এটি প্রায় 90 FPS থেকে পড়া/লেখা ছাড়াই 20 FPS এ চলে যায়। যদি আপনার প্রকল্পের ঘন ঘন আপডেটের প্রয়োজন না হয় তবে এটি যথেষ্ট হতে পারে কিন্তু একটি ভিডিও গেমের জন্য, 20 FPS অনেক কম। মাল্টি থ্রেডিং ব্যবহার করে আপনি কীভাবে পারফরম্যান্স উন্নত করতে পারেন তা পরবর্তী বিভাগে অন্তর্ভুক্ত করা হবে।

ধাপ 4: ডেটা ট্রান্সফার অপ্টিমাইজ করা

পূর্ববর্তী বিভাগটি কীভাবে বেসিক সেট-আপ করতে হবে

Arduino এবং ইউনিটি প্রোগ্রামের মধ্যে যোগাযোগ। এই কোডের সাথে প্রধান সমস্যা হল কর্মক্ষমতা। এর বর্তমান বাস্তবায়নে, ইউনিটিকে আরডুইনো পাওয়ার, প্রক্রিয়া করার এবং অনুরোধের উত্তর দেওয়ার জন্য অপেক্ষা করতে হবে। সেই সময়কালে, ইউনিটি কোডটি অনুরোধ করার জন্য অপেক্ষা করতে হবে এবং অন্য কিছু করবে না। আমরা একটি থ্রেড তৈরি করে এই সমস্যার সমাধান করেছি যা অনুরোধগুলি পরিচালনা করবে এবং মূল থ্রেডে ভেরিয়েবল সংরক্ষণ করবে।

শুরু করার জন্য, আমাদের অবশ্যই যোগ করে থ্রেডিং লাইব্রেরি অন্তর্ভুক্ত করতে হবে;

System. Threading ব্যবহার করে;

এরপরে, আমরা থ্রেডগুলিতে যে ফাংশনটি শুরু করছি তা সেটআপ করি। AsynchronousReadFromArduino WrtieToArduino ফাংশন সহ Arduino কে অনুরোধ লিখে শুরু করে। রিডিং একটি ট্রাই-ক্যাচ ব্লকে আবদ্ধ, যদি রিড টাইম আউট হয়ে যায়, ভেরিয়েবলগুলি শূন্য থাকে এবং OnArduinoInfoReceive এর পরিবর্তে OnArduinoInfoFail ফাংশন বলা হয়।

পরবর্তী আমরা OnArduinoInfoFail এবং OnArduinoInfoReceive ফাংশন সংজ্ঞায়িত করি। এই নির্দেশের জন্য, আমরা ফলাফলগুলি কনসোলে মুদ্রণ করি কিন্তু আপনি ফলাফলগুলি আপনার প্রকল্পের জন্য প্রয়োজনীয় ভেরিয়েবলে সংরক্ষণ করতে পারেন।

ব্যক্তিগত অকার্যকর OnArduinoInfoFail ()

{ডিবাগ.লগ ("পড়া ব্যর্থ হয়েছে"); } ব্যক্তিগত অকার্যকর OnArduinoInfoReceived (স্ট্রিং ঘূর্ণন, স্ট্রিং গতি) {Debug. Log ("Readin Sucessfull"); ডিবাগ। লগ ("প্রথম মান:" + ঘূর্ণন); ডিবাগ। লগ ("দ্বিতীয় মান:" + গতি); }

শেষ ধাপ হল থ্রেড শুরু করা এবং বন্ধ করা যা Arduino থেকে মানগুলির অনুরোধ করবে। একটি নতুন শুরু করার আগে আমাদের নিশ্চিত করতে হবে যে শেষ থ্রেডটি তার শেষ কাজটি সম্পন্ন হয়েছে। অন্যথায়, একযোগে আরডুইনোতে একাধিক অনুরোধ করা যেতে পারে যা আরডুইনো/ইউনিটিকে বিভ্রান্ত করতে পারে এবং অনির্দেশ্য ফলাফল দিতে পারে।

ব্যক্তিগত থ্রেড activeThread = null;

void Update () {if (activeThread == null ||! activeThread. IsAlive) {activeThread = নতুন থ্রেড (AsynchronousReadFromArduino); activeThread. Start (); }}

যদি আপনি কোডের পারফরম্যান্সকে আমরা সেকশন 5 এ যেটি লিখেছি তার সাথে তুলনা করি, তাহলে পারফরম্যান্স উল্লেখযোগ্যভাবে উন্নত হওয়া উচিত।

ব্যক্তিগত অকার্যকর OnArduinoInfoFail ()

{ডিবাগ.লগ ("পড়া ব্যর্থ হয়েছে"); }

ধাপ 5: পরবর্তী কোথায়?

পরবর্তী কোথায়?
পরবর্তী কোথায়?

আমরা একটি ডেমো প্রস্তুত করেছি যা আপনি আমাদের Github (https://github.com/AlexandreDoucet/InfinityBike) এ ডাউনলোড করতে পারেন, কোড এবং গেমটি ডাউনলোড করুন এবং আমাদের ট্র্যাকের মধ্য দিয়ে যাত্রা করুন। এটি একটি দ্রুত ব্যায়ামের জন্য প্রস্তুত করা হয়েছে এবং আমরা আশা করি এটি আপনাকে যা তৈরি করতে পারে তার স্বাদ দিতে পারে যদি আপনি এই নির্দেশনা দিয়ে আমরা যা শিখিয়েছি তা ব্যবহার করে।

ক্রেডিট

প্রকল্পের অবদানকারীরা

আলেকজান্দ্রে ডাউসেট (_Doucet_)

ম্যাক্সিম বউড্রেউ (এমএক্সবউড)

বাহ্যিক সম্পদ [ইউনিটি গেম ইঞ্জিন] (https://unity3d.com)

অ্যালান জুকনির টিউটোরিয়ালটি পড়ার পরে এই প্রকল্পটি শুরু হয়েছিল "কিভাবে একতার সাথে আরডুইনোকে সংহত করা যায়" (https://www.alanzucconi.com/2015/10/07/how-to-int…)

Arduino থেকে অনুরোধ SerialCommand লাইব্রেরি ব্যবহার করে পরিচালনা করা হয় (https://github.com/kroimon/Arduino-SerialCommand)

প্রস্তাবিত: