সুচিপত্র:
- ধাপ 1: IMU সেন্সর
- পদক্ষেপ 2: জিনিস সবসময় পরিষ্কার, সহজ নয়
- ধাপ 3: প্রাথমিক পরীক্ষা
- ধাপ 4: সমস্যা সমাধান
- ধাপ 5: সেন্সরের ডেটা পড়া
- ধাপ 6: আসুন রিডিং / ডেটাতে আরও খনন করি
- ধাপ 7: আমরা তাপমাত্রা এবং ত্বরণকে প্রভাবিত করতে সক্ষম
- ধাপ 8: অ্যাকসিলরোমিটার এবং জাইরোস্কোপ
- ধাপ 9: (অগ্রগতির কাজ) ম্যাগনেটোমিটার
ভিডিও: ওয়ালেস - DIY স্বায়ত্তশাসিত রোবট - পার্ট 5 - IMU যোগ করুন: 9 টি ধাপ
2024 লেখক: John Day | [email protected]. সর্বশেষ পরিবর্তিত: 2024-01-30 08:01
আমরা ওয়ালেসের সাথে এগিয়ে যাচ্ছি। ওয়ালেস নামটি এসেছে "ওয়াল-ই" এর মিশ্রণ থেকে, এবং একটি পূর্ববর্তী প্রকল্প (ভয়েস-রিকগনিশন) থেকে, এবং "এসপিক" ইউটিলিটি ব্যবহার করার সময়, এটি কিছুটা ব্রিটিশ শোনাচ্ছিল। এবং একজন ভ্যালেট বা বাটলারের মতো। এবং এটাই শেষ লক্ষ্য: এই প্রকল্পটি দরকারী কিছুতে পরিণত হওয়ার জন্য। এভাবে "ওয়ালেস"।
ওয়ালেস ঘুরে বেড়াতে পারে, সে আইআর দূরত্ব সেন্সর ব্যবহার করে বাধা এড়াতে পারে (সম্প্রতি, কোনভাবে তারা ভাজা (?) সময়, একটি MCP23017 সম্প্রসারণকারী সহ), এবং পরিশেষে, মোটর-কারেন্টের পরিবর্তনগুলি সনাক্ত করতে পারে যখন এটি কোন কিছুতে ধাক্কা খায়।
সেন্সর ছাড়াও, ওয়ালেস 100 টি চাল "মনে রাখে", এবং আন্দোলনের ইতিহাস ব্যবহার করে কিছু প্রাথমিক বিশ্লেষণ আছে।
ওয়ালেসের এখন পর্যন্ত লক্ষ্য হল কেবলমাত্র এগিয়ে যাওয়ার চেষ্টা করা, এবং কখন এটি কিছু পুনরাবৃত্ত প্যাটার্নে আটকে আছে (যেমন একটি কোণে) এবং সত্যিই এগিয়ে যাওয়া নয় তা জানা।
আমি আন্দোলন এবং নেভিগেশনের জন্য বেশ কয়েকটি পুনরাবৃত্তির মধ্য দিয়ে গিয়েছি, এবং ঘূর্ণনের সময় সামঞ্জস্যপূর্ণ মাথাব্যথা ছিল।
যেহেতু ওয়ালেস একটি ট্র্যাক করা রোবট, এবং আমি সফ্টওয়্যারে জিনিসগুলি সহজ রাখতে চেয়েছিলাম (পরবর্তীতে), যাতে আমি কেবল তাকে পিভট/জায়গায় ঘুরাতে পারি। সুতরাং, মোটরগুলিতে সমান কিন্তু বিপরীত শক্তি / কর্তব্য চক্র প্রয়োগ করুন।
এজেন্ট 390 রোবট প্ল্যাটফর্মের নকশার কারণে সমস্যার সম্মুখীন হয়েছে। ট্র্যাক বেল্টগুলি উভয় দিকে ঘষতে থাকে। এবং খারাপ, এক পক্ষ অন্য পক্ষের চেয়ে অনেক বেশি করে।
মেঝেতে এবং সোজা যেতে, এটি কোনও সমস্যা হয়নি। এটি গালিচা উপর প্রদর্শিত হয়। আমি ওয়ালেসকে কার্পেটিং থেকে দূরে রাখার সিদ্ধান্ত নিয়েছি, ট্র্যাকগুলি ভয়াবহ হয়ে উঠার পরে (তারা খুব সহজেই কাঁটা তুলে নেয়)।
আসল সমস্যা হল যখন মেঝেতে পিভট করা।
যদি আমার সফ্টওয়্যারটি একটি উচ্চ স্তরের শুল্ক চক্র প্রয়োগ করে, তবে এটি কমবেশি ধারাবাহিকভাবে পাল্টে যায়। যাইহোক, একটি কম দায়িত্ব চক্রের সময়, এটি আসলে বা নাও হতে পারে। অথবা এটি একটি বিট জন্য চালু এবং তারপর ধীর হতে পারে। পিভোটিং অ্যাকশনটি সফটওয়্যারের মাধ্যমে অনিয়ন্ত্রিত বলে মনে হয়, অথবা সবচেয়ে কঠিন।
নেভিগেশনের সময় সমস্যা দেখা দেয় এবং বাধা থেকে দূরে বা দূরে সরে যায়। এটি হয় খুব বুনোভাবে দুলতে পারে, অথবা এটি সত্যিই নড়াচড়া না করে খুব মিনিটের পরিবর্তন করার চেষ্টা করে আটকে যেতে পারে।
এবং তাই উপরের ব্যাখ্যা এই নির্দেশযোগ্য অনুপ্রাণিত।
প্রাথমিকভাবে, আমি মোশন-সেন্সিং ইউনিট (আইএমইউ) প্রবর্তন করতে বা বিলম্ব করতে চেয়েছিলাম, কারণ তারা A) জটিল, B) গোলমাল, C) ত্রুটিগুলি সময়ের সাথে পরিচয় করিয়ে দিতে পারে, এবং ইত্যাদি, ইত্যাদি। আমার চিন্তা ছিল হয়েছে যে আমরা ফ্লাইট টাইম-অফ-ফ্লাইট আইআর লেজার সেন্সরের সামনে ঝাঁপিয়ে পড়ে খুব ভালো করতে পারতাম। এবং আমরা পারতাম - লেজার ব্যবহার করে আমরা জানতে পারতাম রোবট ঘুরছে কি না, দূরত্বের পরিবর্তনগুলি ট্র্যাক করে।
প্রকৃতপক্ষে, আমরা শাব্দিক সেন্সরগুলির সাহায্যে এখন (সাজানোর) করতে পারি।
যাইহোক, এগুলি সবই একটি সহজ প্রশ্নের উত্তর দেওয়ার একটি খুব পরোক্ষ, জটিল উপায়: "আমরা কি ঘুরিয়েছি নাকি?"
আমার কাছে মনে হয়েছিল যে টিওএফ লেজার সেন্সর ব্যবহার করতে ঝাঁপিয়ে পড়া আমাকে সফটওয়্যারের পরবর্তী স্তরে নিয়ে যাবে; যথা, SLAM (যুগপৎ স্থানীয়করণ এবং ম্যাপিং)। আমি এখনও সেখানে যাওয়ার জন্য প্রস্তুত ছিলাম না।
স্তরগুলিতে একটি রোবট প্রকল্প করা একটি ভাল জিনিস, প্রথম (নিম্ন) স্তরগুলি সহজ এবং পরবর্তী (উপরের) স্তরগুলি আরও বিমূর্ত এবং আরও কঠিন সমস্যা মোকাবেলা করা।
স্তরগুলি এরকম কিছু ভাবা যেতে পারে:
- রোবট শারীরিক ফ্রেম / যান্ত্রিক কাঠামোগত ভিত্তি
- প্রাথমিক ড্রাইভ সিস্টেম (রাস্পবেরি, রোবোক্লা, মোটর, ক্যাবলিং, ইত্যাদি, মৌলিক সফ্টওয়্যার, কীবোর্ড-চালিত)
- সেন্সর সমর্থন করার জন্য অপরিহার্য সার্কিট্রি (দ্বি-নির্দেশমূলক ভোল্টেজ শিফটার, পোর্ট এক্সপেন্ডার, ই-স্টপ, বিদ্যুৎ বিতরণ ইত্যাদি)
- বাধা-পরিহার সেন্সর (শাব্দ, আইআর)
- অপরিহার্য, মৌলিক অবস্থান এবং আন্দোলন - সনাক্তকরণ (অ্যাকসিলরোমিটার, গাইরো, ম্যাগনেটোমিটার, মোটর এনকোডার, হুইল এনকোডার)
আপনি আপনার নিজের তালিকা নিয়ে আসতে পারেন। এই তালিকার পয়েন্টগুলি হল যে আপনি সম্ভবত এই ক্রমটি কম বা কম করতে হবে, এবং এটিও যে যদি আপনি প্রতিটি স্তরে কিছু সময় ব্যয় করেন যাতে প্রত্যেকটি একটি ভাল কার্যকরী অবস্থায় আসে, এটি আপনাকে পরে সাহায্য করবে কারণ বিষয়গুলি আরও জটিল হয়ে উঠবে।
উপরের তালিকাটি সফটওয়্যারের এই ধারণাগত স্তরে কমবেশি ম্যাপ করা যেতে পারে।
- SLAM (যুগপৎ স্থানীয়করণ এবং ম্যাপিং)
- চলাচলের নিয়ন্ত্রণ এবং সচেতনতা, ঘূর্ণন
- মৌলিক বাধা এড়ানো
- সেন্সর ডেটা নিয়ন্ত্রণ এবং সনাক্তকরণ
- অপরিহার্য আন্দোলন এগিয়ে, পিছনে, বাম এবং ডান, গতি বাড়ান, ধীর নিচে, থামুন
আপনি দেখতে পাচ্ছেন, এই তালিকার জন্য, প্রথম আইটেমগুলি হবে উপরের, আরো জটিল স্তর যা আরো বিমূর্ত সমস্যা এবং প্রশ্নগুলির সমাধান করে, যেমন "আমি কোথায়" এবং "আমি কোথায় যাচ্ছি", যখন পরবর্তী আইটেমগুলি হবে নিম্ন সফ্টওয়্যার স্তরগুলি "কিভাবে সেন্সর এ কথা বলতে/শুনতে হবে" বা "এই চাকাটি কীভাবে সরানো যায়" পরিচালনা করে।
এখন, আমি বলছি না যে যখন আপনি একটি স্তর থেকে শুরু করবেন, আপনি এটি সম্পন্ন করবেন এবং তারপর এটি পরবর্তী স্তরে থাকবে, আগের স্তরে ফিরে আসবেন না। একটি রোবট প্রকল্প অনেকটা আধুনিক, পুনরাবৃত্তিমূলক সফটওয়্যার ডেভেলপমেন্ট পদ্ধতি (চটপটে, SCRUM, ইত্যাদি) হতে পারে।
আমি শুধু প্রতিটি সময় নিতে বলছি। আপনাকে প্রতিটিতে কতটা করতে হবে তা ভারসাম্য বজায় রাখতে হবে এবং সিদ্ধান্ত নিতে হবে যে আপনি সময় এবং ঝামেলার একটি নির্দিষ্ট স্তরে কী চেষ্টা করছেন।
দুটি প্রতিযোগী ধারণা বা দিকনির্দেশের মধ্যে একটি নির্দিষ্ট "দ্বন্দ্ব" বা "উত্তেজনা" রয়েছে।
সমস্যাটি সমাধানের জন্য আমি যাকে "প্লাগ-এন-প্লে" বলব
অন্যটি হল DIY (এটি নিজে করুন)। এবং এই অন্য ধারণার জন্য এটি সেরা লেবেল নাও হতে পারে।
এখানে প্রত্যেকটির একটি উদাহরণ, আশা করি আপনি দুটি পছন্দগুলির মধ্যে উত্তেজনা বা দ্বন্দ্ব দেখতে পাবেন।
এই উদাহরণের জন্য, আসুন স্ল্যাম, বাধা-পরিহার, এবং অপরিহার্য মৌলিক আন্দোলনকে একসাথে সমাধান করার জন্য একটি সমস্যা হিসাবে দেখি।
- যদি আমরা প্লাগ-এন-প্লে রুটে যাওয়ার সিদ্ধান্ত নিই, আমরা অবিলম্বে (বাজেটের উপর নির্ভর করে) সেই টপ-মাউন্টেড রোটটিং লেজার, বা ডেপথ-অফ ফিল্ড ক্যামেরা, বা টিওএফ লেজার এবং আইএমইউ (এই বিষয়) নির্দেশযোগ্য)।
- অন্যদিকে, যদি আমরা দ্বিতীয় পথে যেতে চাই, আমরা কিছু অ্যাকোস্টিক সেন্সর বা আইআর সেন্সর, বা মোটেও সেন্সর থেকে প্রতিটি সম্ভাব্য তথ্য বের করার চেষ্টা করতে পারি - আমরা কেবল মোটর -কারেন্ট মনিটরিং (বাম্প) ব্যবহার করি
#1 বনাম #2 সম্পর্কে কি বলা যেতে পারে? একটি বিষয় হবে যে আমরা #2 করে অনেক কিছু শিখেছি। শুধুমাত্র অ্যাকোস্টিক সেন্সর নিয়ে কাজ করার সীমাবদ্ধতা আমাদের আরো অনেক বিষয় নিয়ে ভাবতে বাধ্য করে।
অন্যদিকে, যদি আমরা #2 এর মাধ্যমে জিনিসগুলি করার উপর খুব বেশি মনোনিবেশ করি, আমরা হয়তো সময় নষ্ট করছি, কারণ আমরা অ্যাকোস্টিক সেন্সর থেকে আমাদের চেয়ে বেশি চাইছি।
আরো একটি ধারণা বা ধারণা নিয়ে ভাবতে হবে: হার্ডওয়্যার এবং সফটওয়্যারের কোন মিশ্রণটি "কিভাবে" এর প্রশ্নের উত্তম উত্তর দেয় এবং সফটওয়্যারের কোন মিশ্রণ (এবং হার্ডওয়্যার?) "কি", "কখন", "কোথায়" এর প্রশ্নের উত্তর দেয় । কারণ "কিভাবে" সাধারণত একটি নিম্ন স্তরের প্রশ্ন যার উপর "কি", "কখন", এবং "কোথায়" নির্ভর করে উত্তর পেতে।
যাইহোক, উপরের সবগুলি কেবল চিন্তা করার মতো কিছু ছিল।
আমার ক্ষেত্রে, অনেক প্রচেষ্টার পর এবং ট্র্যাক-ঘর্ষণের সামঞ্জস্যপূর্ণ বিরক্তিকর সমস্যা থাকার এবং সামঞ্জস্যপূর্ণ নিয়ন্ত্রণ এবং চলাচল করতে অক্ষম, এটি অন্য কিছু করার সময়।
এইভাবে এই নির্দেশযোগ্য - একটি IMU।
লক্ষ্য হল যে যদি আইএমইউ বলে যে রোবটটি পিভট করছে না, আমরা ডিউটি চক্র বাড়াই। যদি আমরা খুব দ্রুত পিভট করছি, আমরা শুল্ক চক্র হ্রাস করি।
ধাপ 1: IMU সেন্সর
এবং তাই আমাদের পরবর্তী সেন্সরটি ওয়ালেসের সাথে যোগ করা হল আইএমইউ। কিছু গবেষণার পর, আমি একটি MPU6050 তে বসতি স্থাপন করছিলাম। কিন্তু তারপর এই সময়ে, MPU9050 (এবং এমনকি আরো সম্প্রতি, MPU9250) একটি আরও ভাল ধারণা মত মনে হয়েছিল।
আমার যাওয়ার উৎস হল আমাজন (মার্কিন যুক্তরাষ্ট্রে)। তাই আমি তাদের দুজনকে অর্ডার দিলাম।
আমি আসলে যা পেয়েছি (মনে হচ্ছে এর উপর কোন নিয়ন্ত্রণ নেই; যেটা আমি অ্যামাজন সম্পর্কে পছন্দ করি না) দুটি MPU92/65 ছিল। আমি পদবি সম্পর্কে কিছুটা বিস্মিত। ছবিগুলো দেখে নিন; এটি একটি "পরিবার" উপাধি বলে মনে হচ্ছে। যাই হোক না কেন, এটাই আমি আটকে আছি।
এটি যোগ করা খুব সহজ -সংযোগকারী ট্র্যাক সহ একটি প্রোটো বোর্ড পান, সেন্সরটি বোর্ডে সোল্ডার করুন, একটি 10 -পিন স্ক্রু টার্মিনাল ব্লক যুক্ত করুন (আমি পোলোলু থেকে খনি পেয়েছি)।
যেকোনো হস্তক্ষেপ কমানোর জন্য, আমি এই সেন্সরগুলিকে অন্য সবকিছু থেকে দূরে রাখার চেষ্টা করেছি।
এর অর্থ কিছু নাইলন বোল্ট/বাদাম ব্যবহার করা।
আমি I2C প্রোটোকল ব্যবহার করতে যাচ্ছি। আশা করি মোট তারের দৈর্ঘ্য খুব খারাপ হবে না।
মৌলিক সংযোগ এবং ভোল্টেজ-স্তর ইত্যাদি সম্পর্কে অন্যত্র প্রচুর তথ্য রয়েছে, তাই আমি এখানে এটি পুনরাবৃত্তি করব না।
পদক্ষেপ 2: জিনিস সবসময় পরিষ্কার, সহজ নয়
এই লেখায়, এই বিশেষ MPU-92/65 এর জন্য অনলাইনে অনেক কিছু আছে বলে মনে হয় না। যা পাওয়া যায়, বেশিরভাগ সেন্সরের মতোই, Arduino ব্যবহার করে উদাহরণ বলে মনে হয়।
আমি একটি পরিষ্কার-পরিচ্ছন্ন প্রক্রিয়া উপস্থাপন করে এই নির্দেশিকাগুলিকে কিছুটা আলাদা করার চেষ্টা করি, কারণ জিনিসগুলি সর্বদা সরাসরি কাজ করে না।
আমি মনে করি এই নির্দেশাবলী সোজা A-B-C এর চেয়ে ব্লগের অনুরূপ, 1-2-3 "এইভাবে আপনি এটি করেন"।
ধাপ 3: প্রাথমিক পরীক্ষা
আগের ধাপের ছবিগুলি থেকে, সেন্সরে যাওয়া লাল এবং কালো তারগুলি অবশ্যই VCC (5V) এবং GND। সবুজ এবং হলুদ তারগুলি হল I2C সংযোগ।
আপনি যদি অন্যান্য I2C প্রজেক্ট করে থাকেন, অথবা এই সিরিজগুলির সাথে অনুসরণ করে থাকেন, তাহলে আপনি ইতিমধ্যেই "i2cdetect" সম্পর্কে জানেন, এবং রাস্পবেরি নতুন সেন্সর দেখতে পারে কিনা তা জানার প্রথম ধাপ।
আপনি এই ধাপে ছবিগুলি থেকে দেখতে পাচ্ছেন, আমাদের প্রথম প্রচেষ্টা ব্যর্থ হয়েছিল। IMU প্রদর্শিত হয় না (ডিভাইস আইডি 0x68 হওয়া উচিত)।
যাইহোক, ভাল খবর হল যে I2C বাস চলছে। আমরা একটি ডিভাইস 0x20 দেখি এবং এটি MCP23017 পোর্ট এক্সপেন্ডার (বর্তমানে HCSR04 অ্যাকোস্টিক সেন্সরের জন্য দায়ী)।
ছবিতে এটি দেখতে সহজ নয়, কিন্তু আমি একই রঙের সবুজ এবং হলুদ তারের সাথে IMU থেকে MCP23017 এর সাথে সংযুক্ত করেছি (ছবিতে নীচের বাম দেখুন)
আমাদের কিছু সমস্যা সমাধান করতে হবে।
ধাপ 4: সমস্যা সমাধান
একটি ভোল্টমিটারে ধারাবাহিকতা সেটিং ব্যবহার করে (উচ্চ-স্বরের স্বরযুক্ত), আমি VCC (5V), GND, SDA এবং SCL সংযোগ পরীক্ষা করেছি। সেগুলো ভালো ছিল।
পরের চেষ্টা ছিল I2C বাস থেকে MCP23017 সংযোগ বিচ্ছিন্ন করার, বাসে শুধুমাত্র MPU-92/65 ছেড়ে। এটি ফলহীন প্রমাণিত - "i2cdetect" তারপর কোন ডিভাইস দেখায়নি।
সুতরাং, পরবর্তীতে, আমি টোটেম মেরু থেকে সেন্সরটি আনমাউন্ট করেছি এবং এটি সরাসরি 5V-3-V দ্বি-নির্দেশক বাসে পুনরায় ওয়্যার্ড করেছি; অর্থাৎ, সরাসরি রাস্পবেরিতে। (ছোট তার?)।
এবং ভয়েলা। এবার সাফল্য আছে। আমরা 0x68 "i2cdetect" ব্যবহার করে দেখছি।
কিন্তু আমরা এখনও জানি না কেন এই সময় এটি কাজ করেছে। এটা তারের দৈর্ঘ্য হতে পারে? আগের অবস্থান?
দ্রষ্টব্য: এটি ADO ভিত্তিক কিনা তা কোন পার্থক্য করেনি। এটি হতে পারে বোর্ডে পুলআপ এবং পুল-ডাউন প্রতিরোধক। FSYNC এর ক্ষেত্রেও একই কথা প্রযোজ্য হতে পারে।
পরবর্তী, আমি MCP23017 পুনরায় সংযুক্ত করেছি। তাই এখন আমাদের কাছে I2C বাসে দুটি ডিভাইস আছে। (ছবি দেখুন)। সফল, আমরা এখন 0x20 এবং 0x68 উভয়ই i2cdetect দিয়ে দেখি।
সমস্যা সমাধানের সময় যা ঘটেছিল তার মধ্যে ভিডিওগুলি আরও কিছুটা যায়।
ধাপ 5: সেন্সরের ডেটা পড়া
বিভিন্ন পন্থা
আমি সেন্সর থেকে দরকারী তথ্য পেতে একাধিক পন্থা অবলম্বন করার সিদ্ধান্ত নিয়েছি। এখানে তারা কোন ক্রমে নয়:
- কিছু মৌলিক প্রোগ্রামিং চেষ্টা করুন
- রেজিস্টারে কিছু অনলাইন ডকুমেন্টেশন দেখুন
- অন্যদের উদাহরণ এবং / অথবা কোড দেখুন
কেন এই পন্থা? কেন শুধু কিছু বিদ্যমান লাইব্রেরি বা কোড সন্ধান করবেন না?
কিছু ধারণা পরীক্ষা করে এবং চেষ্টা করে, আমরা কেবল এই বিশেষ সেন্সরটি সম্পর্কে কিছু জ্ঞান আরও ভালভাবে শোষণ করতে পারি, কিন্তু কিছু কৌশল, দক্ষতা এবং নতুন কিছু মোকাবেলা করার চিন্তা করার উপায় এবং এমন কিছু যা অনেক ডকুমেন্টেশন নাও পেতে পারে; এমন কিছু যা অনেক অজানা থাকতে পারে।
এছাড়াও, একবার আমরা যখন আমাদের নিজস্ব কিছু ধারণা নিয়ে খেলেছি এবং চেষ্টা করেছি এবং কিছু অন্তর্দৃষ্টি অর্জন করেছি, তখন আমরা অন্য কারো কোড বা লাইব্রেরির মূল্যায়ন করার জন্য আরও ভাল অবস্থানে আছি।
উদাহরণস্বরূপ, Github এ MPU9250 এর জন্য কিছু C ++ কোড দেখার পর, আমি বুঝতে পেরেছিলাম যে এটি আমাকে বাধাগুলি ব্যবহার করতে বাধ্য করছে, যা আমি এখনও করতে চাই না।
এছাড়াও, এটি ক্রমাঙ্কনের মতো অতিরিক্ত জিনিস নিয়ে আসে; আবার, এমন কিছু যা আমি এখনও আগ্রহী নই।
এটা হতে পারে যে সাধারণ প্রশ্নের উত্তর দেওয়ার জন্য আমাকে যা করতে হবে "রোবটটি হ্যাঁ বা না ঘুরছে" কেবল কিছু রেজিস্টার পড়ে খুব সহজভাবে উত্তর দেওয়া যেতে পারে।
নিবন্ধন
এই লেখায়, এই সেন্সরে খুব বেশি পাওয়া যাবে বলে মনে হয় না। প্রকৃতপক্ষে, যদি আপনি এই নির্দেশাবলীর সাথে আসা ছবিগুলি একবার দেখে নেন এবং প্রকৃত চিপগুলিতে শিলালিপিগুলি ঘনিষ্ঠভাবে দেখুন, এটি আমাকে অবাক করে তোলে যে এটি একটি নক-অফ নয়। আমি ইনভেনস থেকে যা দেখছি তা সম্পর্কিত করছি না। যাই হোক না কেন, আমি যে মডেলগুলি পেয়েছি তার জন্য রেজিস্টার-তথ্য দেখতে বেছে নিয়েছি: MPU-6050, এবং MPU-9250।
উভয় ক্ষেত্রে, উভয়ের জন্য নিম্নলিখিতটি একই। এবং প্রারম্ভিকদের জন্য, আমরা অনুমান করি যে এই MPU-92/65 এর ক্ষেত্রেও একই হবে।
59 থেকে 64 - অ্যাকসিলরোমিটার পরিমাপ
65, 66 - তাপমাত্রা পরিমাপ 67 থেকে 72 - জাইরোস্কোপ পরিমাপ 73 থেকে 96 - বাহ্যিক সেন্সর ডেটা
নোটের একটি আইটেম: MPU-6050 তে ম্যাগনেটোমিটার নেই বলে মনে হয়, যেখানে MPU-9250 (এবং আমরা এটিকেও ধরে নিই) এর একটি আছে।
রেজিস্টার-ডকুমেন্ট থেকে আরো কিছু আকর্ষণীয়, আশাকরি দরকারী তথ্য সংগ্রহ করা হয়েছে:
ম্যাগনেটোমিটার তথ্য:
ম্যাগনেটোমিটার আইডি: 0x48 নিবন্ধন 00 এর মাধ্যমে 09: 00H WIA 0 1 0 0 1 0 0 0 01H INFO INFO7 INFO6 INFO5 INFO4 INFO3 INFO2 INFO1 INFO0 02H ST1 0 0 0 0 0 DOR DRDY 03H HXL HX7 HX6 HX4 HX4 HX4 HX4 HXH HX15 HX14 HX13 HX12 HX11 HX10 HX9 HX8 05H HYL HY7 HY6 HY5 HY4 HY3 HY2 HY1 HY0 06H HYH HY15 HY14 HY13 HY12 HY11 HY10 HY9 HY8 07H HZH HZ HZ HZ HZ HZ HZ HZH ST2 0 0 0 BITM HOFL 0 0 0 প্রতিটি রেজিস্টারের মানে হল একটি ভাঙ্গন: HXL [7: 0]: X-axis পরিমাপের ডেটা 8bit HXH [15: 8]: X-axis পরিমাপের ডেটা 8bit HYL [7: 0]: Y- অক্ষ পরিমাপ তথ্য 8bit HYH কম [15: 8]: Y- অক্ষ পরিমাপ তথ্য উচ্চ 8bit HZL [7: 0]: Z- অক্ষ পরিমাপ তথ্য নিম্ন 8bit HZH [15: 8]: Z- অক্ষ পরিমাপ তথ্য অধিক 8 বিট
প্রোগ্রামিং
রেজিস্টার ডক্স থেকে আরেকটি তথ্য হল যে সেখানে প্রায় 100 বা তার বেশি নিবন্ধন ছিল বলে মনে হয়েছিল। সুতরাং একটি কৌশল হতে পারে একটি সহজ প্রোগ্রাম লিখতে যেটি ডিভাইসটি অ্যাক্সেস করে (0x68) এবং রেজিস্টারগুলির একটি সিরিজ তাদের অর্থের কোন প্রকার বিবেচনা না করেই পর্যায়ক্রমে পড়ার চেষ্টা করে, কেবল কোন ডেটা দেখা যায় তা দেখার জন্য।
এবং তারপর, একই কোড ব্যবহার করে পরপর পাস করুন এবং একটি পাস থেকে পরবর্তী পাসের ডেটা তুলনা করুন।
ধারণাটি হল যে আমরা সম্ভবত এমন কোনো রেজিস্টার মুছে ফেলতে পারি যার কোনো তথ্য নেই
তারপরে, আমরা কেবল যেগুলি পরিবর্তন করছি সেগুলিই দেখছি, একটি গড় ফাংশনে যোগ করুন যা সেই নিবন্ধের সর্বশেষ N পড়ার গড়, এটি দেখতে যে প্রকৃতপক্ষে সেই নিবন্ধটির জন্য একটি নির্দিষ্ট স্থির মান আছে কিনা। এটি ধরে নেবে যে আমরা সেন্সরটি খুব স্থির রেখেছি এবং একই অবস্থানে।
অবশেষে, আমরা সেন্সরের সাহায্যে আস্তে আস্তে জিনিসগুলি চেষ্টা করতে পারি, যেমন এটিকে টেনে আনা (অ্যাকসিলরোমিটার, গাইরো), বা এটিতে ফুঁ দেওয়া (তাপমাত্রা), বা এটিকে ঘোরানো (আগের দুটি প্লাস ম্যাগনেটোমিটার) এবং দেখুন এর মানগুলিতে কী প্রভাব রয়েছে।
আমি wiringPi লাইব্রেরি যতটা সম্ভব ব্যবহার করতে পছন্দ করি। এটি I2C এর জন্য সমর্থন করে।
প্রথম রান:
/********************************************************************************
* নির্মাণের জন্য: gcc first.test.mpu9265.c -o first.test.mpu9265 -lwiringPi * * চালানোর জন্য:, * এবং তারপর MPU9265 (অথবা যে 0x68 ঠিকানায় অন্য কোন MPU) থেকে ***************************************************** ****************************** {puts ("দেখা যাক MCP23017 @ 0x20 কি বলে:"); ত্রুটি = 0; int deviceId1 = 0x20; int fd1 = wiringPiI2CSetup (deviceId1); যদি (-1 == fd1) {fprintf (stderr, "wiringPi I2C ডিভাইস খুলতে পারছি না: %s / n", স্ট্রেটার (errno)); ফেরত 1; } এর জন্য (int reg = 0; reg <300; reg ++) {fprintf (stderr, "%d", wiringPiI2CReadReg8 (fd1, reg)); fflush (stderr); বিলম্ব (10); } রাখে (""); রাখে ("আসুন দেখি MPU9265 @ 0x20 কি বলে:"); ত্রুটি = 0; int deviceId2 = 0x68; int fd2 = wiringPiI2CSetup (deviceId2); যদি (-1 == fd2) {fprintf (stderr, "wiringPi I2C ডিভাইস খুলতে পারছি না: %s / n", স্ট্রেটার (errno)); ফেরত 1; } এর জন্য (int reg = 0; reg <300; reg ++) {fprintf (stderr, "%d", wiringPiI2CReadReg8 (fd2, reg)); fflush (stderr); বিলম্ব (10); } রাখে (""); রিটার্ন 0; }
দ্বিতীয় রান:
/********************************************************************************
* নির্মাণ করতে: gcc second.test.mpu9265.c -o second.test.mpu9265 -lwiringPi * * চালানোর জন্য: * * এটি একটি ফাইলে আউটপুট পাইপ (পুনirectনির্দেশিত) করার জন্য দরকারী করে তোলে, এবং তারপর * তুলনা করার জন্য বেশ কয়েকটি রান করা যেতে পারে। এটি কিছু রেজিস্টার কি গুরুত্বপূর্ণ, এবং ডেটা কিভাবে আচরণ করতে পারে সে সম্পর্কে কিছু অন্তর্দৃষ্টি দিতে পারে। ***************************************************** ******************************/ argv) {int deviceId = -1; if (0) {} else if (! strncmp (argv [1], "0x20", strlen ("0x20"))) {deviceId = 0x20; } অন্যথায় যদি (! strncmp (argv [1], "0x68", strlen ("0x68"))) {deviceId = 0x68; } অন্যথায় যদি (! strncmp (argv [1], "0x69", strlen ("0x69"))) {deviceId = 0x69; } puts ("দেখা যাক MPU9265 @ 0x20 কি বলে:"); ত্রুটি = 0; int fd = wiringPiI2CSetup (deviceId); যদি (-1 == fd) {fprintf (stderr, "wiringPi I2C ডিভাইস খুলতে পারছি না: %s / n", স্ট্রেটার (errno)); ফেরত 1; } এর জন্য (int reg = 0; reg <300; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); বিলম্ব (10); } রিটার্ন 0; }
তৃতীয় রান:
/********************************************************************************
* নির্মাণ করতে: gcc third.test.mpu9265.c -o third.test.mpu9265 -lwiringPi * * চালানোর জন্য: sudo./third.test.mpu9265 * * এই প্রোগ্রামটি দ্বিতীয়টির ফলাফল। এটি শুধুমাত্র * রেজিস্টার থেকে পড়ে যা এক রান এবং পরের মধ্যে পার্থক্য নির্দেশ করে।***************************************************** ******************************/ argv) {int deviceId = -1; if (0) {} else if (! strncmp (argv [1], "0x68", strlen ("0x68"))) {deviceId = 0x68; } অন্যথায় যদি (! strncmp (argv [1], "0x69", strlen ("0x69"))) {deviceId = 0x69; } puts ("দেখা যাক MPU9265 @ 0x20 কি বলে:"); ত্রুটি = 0; int fd = wiringPiI2CSetup (deviceId); যদি (-1 == fd) {fprintf (stderr, "wiringPi I2C ডিভাইস খুলতে পারছি না: %s / n", স্ট্রেটার (errno)); ফেরত 1; } এর জন্য (int reg = 61; reg <= 73; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); বিলম্ব (10); } এর জন্য (int reg = 111; reg <= 112; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); বিলম্ব (10); } এর জন্য (int reg = 189; reg <= 201; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); বিলম্ব (10); } এর জন্য (int reg = 239; reg <= 240; reg ++) {fprintf (stderr, "%d:%d / n", reg, wiringPiI2CReadReg8 (fd, reg)); fflush (stderr); বিলম্ব (10); } রিটার্ন 0; }
তাহলে আমরা এতদূর কি শিখলাম? রঙিন হাইলাইট করা ক্ষেত্রগুলির সাথে টেবিলের চিত্রটি নির্দেশ করে যে আউটপুট রেজিস্টারের প্রথম সেটগুলির সাথে মেলে বলে মনে হয়।
এখন পর্যন্ত ফলাফল নতুন প্রশ্ন তৈরি করতে পারে।
প্রশ্ন: "বাহ্যিক" গ্রুপের জন্য শুধুমাত্র একটি রেজিস্টার ফলাফল কেন?
প্রশ্ন: সেই সব অজানা রেজিস্টার কি "??????"
প্রশ্ন: যেহেতু প্রোগ্রামটি বিঘ্ন-চালিত নয়, তাই এটি কি খুব ধীর গতিতে ডেটা অনুরোধ করেছিল? খুব দ্রুত?
প্রশ্ন: আমরা কি সেন্সরের সাথে কাজ করে ফলাফলগুলি প্রভাবিত করতে পারি?
ধাপ 6: আসুন রিডিং / ডেটাতে আরও খনন করি
আমি মনে করি অন্য কোন কিছুর আগে পরবর্তী ধাপ হল প্রোগ্রামটি উন্নত করা:
- কত লুপ বিলম্ব (এমএস) নমনীয় হতে
- প্রতি রেজিস্টারে চলমান গড় দিতে কতগুলি রিডিংয়ের বিষয়ে নমনীয় হন
(আমাকে একটি ফাইল হিসাবে প্রোগ্রামটি সংযুক্ত করতে হয়েছিল
একটি 10ms লুপ এ, গড় জন্য শেষ 10 রিডিং ব্যবহার করে এখানে একটি রান:
sudo./fourth.test.mpu9265 0x68 10 10
61:255 0 255 0 255 0 255 0 0 0: 102 62:204 112 140 164 148 156 188 248 88 228: 167 63:189 188 189 187 189 188 188 188 188 189: 188 64: 60 40 16 96 208 132 116 252 172 36: 112 65: 7 7 7 7 7 7 7 7 7 7: 7 66:224 224 224 240 160 208 224 208 144 96: 195 67: 0 0 0 0 0 0 0 0 0 0: 0 68:215 228 226 228 203 221 239 208 214 187: 216 69: 0 255 0 255 255 0 255 0 0 0: 102 70:242 43 253 239 239 45 206 28 247 207: 174 71: 0 255 255 0 255 255 255 255 255 255: 204 72: 51 199 19 214 11 223 21 236 193 8: 117 73: 0 0 0 0 0 0 0 0 0 0: 0 111: 46 149 91 199 215 46 142 2 233 199: 132 112: 0 0 0 0 0 0 0 0 0 0: 0 189:255 0 255 0 255 0 0 255 0 255: 127 190: 76 36 240 36 100 0 164 164 152 244: 121 191:188 188 188 188 187 188 187 189 187 189: 187 192: 8 48 48 196 96 220 144 0 76 40: 87 193: 7 7 7 7 7 8 7 7 7 7: 7 194:208 224 144 240 176 240 224 208 240 224: 212 195: 0 0 0 0 0 0 0 0 0 0: 0 196:243 184 233 200 225 192 189 242 188 203: 209 197:255 0 0 0 255 0 255 0 0 255: 102 198:223 39 247 43 245 22 255 221 0 6: 130 199: 0 255 255 255 0 255 255 255 255 0: 178 200:231 225 251 1 252 20 211 216 218 16: 164 201: 0 0 0 0 0 0 0 0 0 0: 0 239: 21 138 196 87 26 89 16 245 187 144: 114 240: 0 0 0 0 0 0 0 0 0 0: 0
প্রথম, বাম দিকের কলাম হল রেজিস্টার নম্বর। তারপরে সেই নিবন্ধের জন্য শেষ 10 টি রিডিং আসুন। অবশেষে, শেষ কলামটি প্রতিটি সারির গড়।
মনে হচ্ছে রেজিস্টার 61, 69, 71, 189, 197, এবং 199 হয় শুধুমাত্র বাইনারি, অথবা প্রস্তুত / প্রস্তুত নয়, অথবা এগুলি 16-বিট মানের উচ্চ বাইট (নেতিবাচক?)।
অন্যান্য আকর্ষণীয় পর্যবেক্ষণ:
- নিবন্ধন 65, 193 - খুব স্থির এবং একই মান
- নিবন্ধন 63, 191 - খুব স্থির এবং একই মান
- রেজিস্টার 73, 112, 195, 201, 240 - সব শূন্য
আসুন এই পর্যবেক্ষণগুলি আগের থেকে বহু রঙের, হাইলাইট করা টেবিল চিত্রের সাথে সম্পর্কিত করি।
নিবন্ধন 65 - তাপমাত্রা
নিবন্ধন 193 - ??????
রেজিস্টার 63 - অ্যাকসিলরোমিটার
নিবন্ধন 191 - ??????
রেজিস্টার 73 - বাহ্যিক
112 নিবন্ধন করুন এবং - ??????
ঠিক আছে, আমাদের এখনও অজানা আছে, তবে, আমরা কিছু দরকারী শিখেছি।
রেজিস্টার 65 (তাপমাত্রা) এবং রেজিস্টার 63 (অ্যাকসিলরোমিটার) উভয়ই খুব স্থির ছিল। এটি এমন কিছু যা আমরা আশা করব। আমি সেন্সর স্পর্শ করিনি; এটি চলমান নয়, অন্য কোন আনুষঙ্গিক কম্পন ছাড়া, কারণ রোবটটি আমার কম্পিউটারের মতো একই টেবিলে বিশ্রাম নিচ্ছে।
এই প্রতিটি তাপমাত্রা/অ্যাকসিলরোমিটার রেজিস্টারের জন্য আমরা একটি আকর্ষণীয় পরীক্ষা করতে পারি। সেই পরীক্ষার জন্য, আমাদের প্রোগ্রামের আরেকটি সংস্করণ দরকার।
ধাপ 7: আমরা তাপমাত্রা এবং ত্বরণকে প্রভাবিত করতে সক্ষম
পূর্ববর্তী ধাপগুলোতে আমরা তাপমাত্রার জন্য কমপক্ষে একটি রেজিস্টার সংকুচিত করেছি এবং ত্বরণের জন্য একটি।
প্রোগ্রামের এই পরবর্তী সংস্করণ ("5th.test.mpu9265.c") এর সাথে, আমরা আসলে উভয় রেজিস্টারের জন্য একটি পরিবর্তন দেখতে পাচ্ছি। দয়া করে ভিডিওগুলো দেখুন।
আরো খনন
যদি আমরা ফিরে যাই এবং রেজিস্টারের তথ্যগুলি দেখি, আমরা দেখতে পাই যে:
- জাইরোস্কোপের জন্য তিনটি 16 বিট আউটপুট
- অ্যাকসিলরোমিটারের জন্য তিনটি 16 বিট আউটপুট
- ম্যাগনেটোমিটারের জন্য তিনটি 16 বিট আউটপুট
- তাপমাত্রার জন্য একটি 16 বিট আউটপুট
যাইহোক, আমাদের সহজ পরীক্ষা প্রোগ্রাম দ্বারা প্রাপ্ত ফলাফল সব একক 8 বিট আউটপুট ছিল। (একক নিবন্ধন)।
তাই আসুন একই পদ্ধতির আরও চেষ্টা করি, কিন্তু এইবার 8 এর পরিবর্তে 16 বিট পড়ছি।
আমরা সম্ভবত নীচের মত কিছু করতে যাচ্ছি। আসুন একটি উদাহরণ হিসাবে তাপমাত্রা ব্যবহার করি, যেহেতু এটি শুধুমাত্র একটি 16 বিট আউটপুট।
// ফাইল বর্ণনাকারী এফডি পান …
int tempRegHi = 65; int tempRegLo = 66; int hiByte = wiringPiI2CReadReg8 (fd, tempRegHi); int loByte = wiringPiI2CReadReg8 (fd, tempRegLo); int ফলাফল = হাইবাইট << 8; // 16 বিট মান ফলাফলের উপরের অংশে হাই অর্ডার 8 বিট রাখুন | = loByte; // এখন লো অর্ডারে 8 বিট যোগ করুন, একটি সম্পূর্ণ 16 বিট নম্বর পাওয়া যাচ্ছে // সেই সংখ্যাটি প্রিন্ট করুন অথবা আগে থেকে ডিসপ্লে হরাইজন্টাল গ্রাফিং ফাংশন ব্যবহার করুন
আমাদের আগের ধাপ থেকে আমরা দেখেছি যে রেজিস্টার 65 বেশ রক স্টেডি, যখন রেজিস্টার 66 খুব গোলমাল। যেহেতু 65 হল হাই অর্ডার বাইট, এবং 66 লো অর্ডার বাইট, এটি বোধগম্য।
পড়ার জন্য, আমরা রেজিস্টার 65 এর ডেটা যেমন আছে তেমন নিতে পারি, কিন্তু আমরা রেজিস্টার 66 এর মান গড়তে পারি।
অথবা আমরা শুধু পুরো ফলাফলের গড় করতে পারি।
এই অংশের জন্য শেষ ভিডিওটি দেখুন; এটি সম্পূর্ণ 16 বিট তাপমাত্রা মান পড়ার প্রদর্শন করে। কোড হল "6th.test.mpu9265.c"
ধাপ 8: অ্যাকসিলরোমিটার এবং জাইরোস্কোপ
এই বিভাগের ভিডিওগুলি এক্সেলরোমিটার এবং জাইরোস্কোপ থেকে আউটপুট দেখায়, একটি পরীক্ষা প্রোগ্রাম "7th.test.mpu9265.c" ব্যবহার করে। এই কোডটি 1, 2 বা 3 পরপর বাইট-পেয়ার (হাই এবং লো বাইট) পড়তে পারে এবং মানগুলিকে একক 16 বিট ভ্যালুতে রূপান্তর করতে পারে। এইভাবে, আমরা যে কোনও একক অক্ষ পড়তে পারি, অথবা আমরা তাদের দুটিকে একসাথে পড়তে পারি (এবং এটি পরিবর্তনের সমষ্টি), অথবা আমরা তিনটিই পড়তে পারি (এবং এটি পরিবর্তনের সমষ্টি)।
পুনরাবৃত্তি করার জন্য, এই পর্যায়ের জন্য, এই নির্দেশের জন্য, আমি শুধু একটি সহজ প্রশ্নের উত্তর খুঁজছি: "রোবটটি কি ঘুরছে/পিভট?"। আমি কোন সুনির্দিষ্ট মান খুঁজছি না, যেমন, এটি 90 ডিগ্রী ঘোরানো। এটি পরে আসবে যখন আমরা SLAM করতে পারব, কিন্তু সহজ বাধা-পরিহার এবং এলোমেলো চলাফেরার জন্য এটির প্রয়োজন নেই।
ধাপ 9: (অগ্রগতির কাজ) ম্যাগনেটোমিটার
i2cdetect টুল ব্যবহার করার সময়, MPU9265 টেবিলে 0x68 হিসাবে দেখায়:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
IMU- এর ম্যাগনেটোমিটার অংশ থেকে পড়ার জন্য অতিরিক্ত পদক্ষেপ প্রয়োজন।
ইনভেনসেন্স নিবন্ধন পিডিএফ ডক থেকে:
রেজিস্টার 37 থেকে 39 - I2C স্লেভ 0 কন্ট্রোল
- রেজিস্টার 37 - I2C_SLV0_ADDR
- রেজিস্টার 38 - I2C_SLV0_REG
- রেজিস্টার 39 - I2C_SLV0_CTRL
প্রস্তাবিত:
ব্লুটুথ মডিউল এবং স্বায়ত্তশাসিত রোবট মুভমেন্ট ব্যবহার করে ভয়েস দ্বারা নিয়ন্ত্রিত দূরত্ব, দিকনির্দেশনা এবং আবর্তনের ডিগ্রী (পূর্ব, পশ্চিম, উত্তর, দক্ষিণ) সহ আরডুইনো রোবট: 6 ধাপ
ব্লুটুথ মডিউল এবং স্বায়ত্তশাসিত রোবট মুভমেন্ট ব্যবহার করে ভয়েস দ্বারা নিয়ন্ত্রিত দূরত্ব, দিক এবং আবর্তনের ডিগ্রী (পূর্ব, পশ্চিম, উত্তর, দক্ষিণ) সহ আরডুইনো রোবট। , বাম, ডান, পূর্ব, পশ্চিম, উত্তর, দক্ষিণ) ভয়েস কমান্ড ব্যবহার করে সেন্টিমিটারে দূরত্ব প্রয়োজন। রোবটকে স্বয়ংক্রিয়ভাবেও সরানো যায়
ওয়ালেস স্বায়ত্তশাসিত রোবট - পর্ব 4 - IR দূরত্ব এবং "Amp" সেন্সর যোগ করুন: 6 টি ধাপ
ওয়ালেস স্বায়ত্তশাসিত রোবট - পর্ব 4 - IR দূরত্ব এবং "Amp" সেন্সর যোগ করুন: হ্যালো, আজ আমরা ওয়ালেসের ক্ষমতা উন্নত করার পরবর্তী পর্ব শুরু করি। বিশেষ করে, আমরা ইনফ্রারেড দূরত্ব সেন্সর ব্যবহার করে বাধাগুলি সনাক্ত এবং এড়ানোর ক্ষমতা উন্নত করার চেষ্টা করছি, এবং রোবোক্লো মোটর-নিয়ন্ত্রকের অ্যাবিলির সুবিধাও গ্রহণ করছি
লেদারম্যান ট্রেডের জন্য দরকারী মোড (ভাল ফিট, বিট যোগ করুন, বাদাম চালক রূপান্তর করুন): 14 টি ধাপ (ছবি সহ)
লেদারম্যান ট্রেডের জন্য দরকারী মোড (ভাল ফিট, বিট যোগ করুন, বাদাম চালক রূপান্তর করুন): এই ইন্সটাকটেবল লেদারম্যান ট্রেড মোডিফিকেশন #1- এ 3 টি পরিবর্তন করে - আপনার কব্জি মোডফিকেশন #2 এ আরও ভাল ফিট পাওয়া - বিট ক্যারিয়ার এবং ড্রাইভার মোডফিকেশন হিসাবে আপনার চলার ব্যবহার # 3 - একটি বাদাম ড্রাইভারকে একটি ছোট আকারে রূপান্তর করা
IRobot ব্যবহার করে কিভাবে একটি স্বায়ত্তশাসিত বাস্কেটবল প্লেয়িং রোবট তৈরি করা যায় বেস হিসাবে তৈরি করুন: 7 টি ধাপ (ছবি সহ)
কিভাবে একটি স্বায়ত্তশাসিত বাস্কেটবল প্লেয়িং রোবট তৈরি করা যায় একটি IRobot ব্যবহার করে একটি বেস হিসেবে তৈরি করুন: iRobot তৈরি চ্যালেঞ্জের জন্য এটি আমার প্রবেশ। আমার জন্য এই পুরো প্রক্রিয়ার সবচেয়ে কঠিন অংশটি রোবটটি কী করতে চলেছে তা নির্ধারণ করা ছিল। আমি তৈরি করার শীতল বৈশিষ্ট্যগুলি প্রদর্শন করতে চেয়েছিলাম, কিছু রোবো ফ্লেয়ার যুক্ত করার সময়। আমার সবটুকু
নাম পরিবর্তন করুন এবং আপনার থাম্বড্রাইভে একটি আইকন যোগ করুন: 4 টি ধাপ
নাম পরিবর্তন করুন এবং আপনার থাম্বড্রাইভে একটি আইকন যোগ করুন: একটি নতুন আইকন এবং নাম বরাদ্দ করার জন্য আপনার থাম্বড্রাইভের জন্য একটি সহজ অটোরুন ফাইল লিখুন