সুচিপত্র:

ম্যাজিকবিট থেকে সেলফ ব্যালেন্সিং রোবট: 6 টি ধাপ
ম্যাজিকবিট থেকে সেলফ ব্যালেন্সিং রোবট: 6 টি ধাপ

ভিডিও: ম্যাজিকবিট থেকে সেলফ ব্যালেন্সিং রোবট: 6 টি ধাপ

ভিডিও: ম্যাজিকবিট থেকে সেলফ ব্যালেন্সিং রোবট: 6 টি ধাপ
ভিডিও: মনের মানুষের এই 3 দিনের স্বীকারোক্তি🤔অজানা এই পথ😍তবুও থাকার শপথ🌞SOULMATE💏Love Oracle🧚PartnerLoveMsg💕 2024, জুলাই
Anonim

এই টিউটোরিয়ালটি দেখায় কিভাবে ম্যাজিকবিট ডেভ বোর্ড ব্যবহার করে একটি স্ব -ভারসাম্যপূর্ণ রোবট তৈরি করা যায়। আমরা এই প্রকল্পে ডেভেলপমেন্ট বোর্ড হিসেবে ম্যাজিকবিট ব্যবহার করছি যা ESP32 এর উপর ভিত্তি করে। অতএব যে কোন ESP32 উন্নয়ন বোর্ড এই প্রকল্পে ব্যবহার করা যেতে পারে।

সরবরাহ:

  • ম্যাজিকবিট
  • দ্বৈত এইচ-ব্রিজ L298 মোটর ড্রাইভার
  • লিনিয়ার রেগুলেটর (7805)
  • Lipo 7.4V 700mah ব্যাটারি
  • নিষ্ক্রিয় পরিমাপ ইউনিট (IMU) (স্বাধীনতা 6 ডিগ্রী)
  • গিয়ার মোটর 3V-6V ডিসি

ধাপ 1: গল্প

গল্প
গল্প
গল্প
গল্প

হে বন্ধুরা, আজ এই টিউটোরিয়ালে আমরা একটু জটিল বিষয় সম্পর্কে জানব। এটি Arduino IDE এর সাথে Magicbit ব্যবহার করে স্ব -ভারসাম্যপূর্ণ রোবট সম্পর্কে। সুতরাং শুরু করা যাক।

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

ধাপ 2: তত্ত্ব এবং পদ্ধতি

তত্ত্ব এবং পদ্ধতি
তত্ত্ব এবং পদ্ধতি

রোবটের ভারসাম্য বজায় রাখার জন্য, প্রথমে আমরা কিছু সেন্সর থেকে ডাটা পাই যাতে রোবট এঙ্গেল থেকে উল্লম্ব সমতল পরিমাপ করা যায়। সেই উদ্দেশ্যে আমরা MPU6050 ব্যবহার করেছি। সেন্সর থেকে ডেটা পাওয়ার পর আমরা টিল্ট থেকে উল্লম্ব সমতল গণনা করি। যদি রোবট সোজা এবং সুষম অবস্থানে থাকে, তাহলে কাত কোণ শূন্য। যদি না হয়, তাহলে কাত কোণটি ধনাত্মক বা negativeণাত্মক মান। যদি রোবট সামনের দিকে কাত হয়ে থাকে, তাহলে রোবটকে সামনের দিকে যেতে হবে। এছাড়াও যদি রোবটটি উল্টো দিকে কাত হয়ে থাকে তাহলে রোবটকে উল্টো দিকে যেতে হবে। যদি এই কাত কোণটি বেশি হয় তবে প্রতিক্রিয়া গতি উচ্চ হওয়া উচিত। তদ্বিপরীত কাত কোণ কম তারপর প্রতিক্রিয়া গতি কম হওয়া উচিত। এই প্রক্রিয়াটি নিয়ন্ত্রণ করতে আমরা PID নামক নির্দিষ্ট উপপাদ্য ব্যবহার করেছি। পিআইডি একটি নিয়ন্ত্রণ ব্যবস্থা যা অনেক প্রক্রিয়া নিয়ন্ত্রণ করতে ব্যবহৃত হয়। পিআইডি মানে 3 টি প্রক্রিয়া।

  • P- আনুপাতিক
  • আমি- অবিচ্ছেদ্য
  • D- ডেরিভেটিভ

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

প্রথমটি হল সংখ্যাগত লাভ থেকে গুণের ত্রুটি। এই লাভকে সাধারণত Kp বলা হয়।

পি = ত্রুটি*কেপি

দ্বিতীয়টি হল টাইম ডোমেইনে ত্রুটির অবিচ্ছেদ্য অংশ তৈরি করা এবং কিছু লাভ থেকে এটিকে গুণ করা। এই লাভ কি নামে পরিচিত

আমি = ইন্টিগ্রাল (ত্রুটি)*কি

তৃতীয়টি হল টাইম ডোমেইনে ত্রুটির উৎপত্তি এবং এটিকে কিছু পরিমাণ লাভ দ্বারা গুণ করা। এই লাভ কেডি বলা হয়

D = (d (error)/dt)*kd

উপরের ক্রিয়াকলাপগুলি যুক্ত করার পরে আমরা আমাদের চূড়ান্ত আউটপুট পাই

আউটপুট = পি+আই+ডি

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

www.arrow.com/en/research-and-events/articles/pid-controller-basics-and-tutorial-pid-implementation-in-arduino

পিআইডি ফাংশনের আউটপুট 0-255 পরিসীমা (8 বিট পিডব্লিউএম রেজোলিউশন) সীমাবদ্ধ এবং এটি মোটরকে পিডব্লিউএম সংকেত হিসাবে খাওয়াবে।

ধাপ 3: হার্ডওয়্যার সেটআপ

হার্ডওয়্যার সেটআপ
হার্ডওয়্যার সেটআপ

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

যখন আমরা সার্কিট সম্পর্কে আলোচনা করি তখন এটি 7.4V লাইপো ব্যাটারি দ্বারা চালিত। ম্যাজিকবিট পাওয়ার করার জন্য 5V ব্যবহার করেছে। অতএব আমরা ব্যাটারি ভোল্টেজ 5V তে নিয়ন্ত্রণ করতে 7805 রেগুলেটর ব্যবহার করেছি। ম্যাজিকবিটের পরবর্তী সংস্করণগুলিতে সেই নিয়ন্ত্রকের প্রয়োজন নেই। কারণ এটি 12V পর্যন্ত শক্তি দেয়। আমরা মোটর চালকের জন্য সরাসরি 7.4V সরবরাহ করি।

নীচের চিত্র অনুযায়ী সমস্ত উপাদান সংযুক্ত করুন।

ধাপ 4: সফটওয়্যার সেটআপ

কোডে আমরা PID আউটপুট গণনার জন্য PID লাইব্রেরি ব্যবহার করেছি।

এটি ডাউনলোড করতে নিচের লিংকে যান।

www.arduinolibraries.info/libraries/pid

এর সর্বশেষ সংস্করণটি ডাউনলোড করুন।

ভাল সেন্সর রিডিং পেতে আমরা DMP লাইব্রেরি ব্যবহার করেছি। ডিএমপি মানে ডিজিটাল মোশন প্রসেস। এটি MPU6050 এর অন্তর্নির্মিত বৈশিষ্ট্য। এই চিপে সমন্বিত গতি প্রক্রিয়া ইউনিট রয়েছে। তাই এটি পড়া এবং বিশ্লেষণ লাগে। এটি মাইক্রোকন্ট্রোলারে শব্দহীন নির্ভুল আউটপুট উৎপন্ন করার পরে (এই ক্ষেত্রে ম্যাজিকবিট (ESP32))। কিন্তু মাইক্রোকন্ট্রোলার সাইডে অনেকগুলি কাজ রয়েছে যা সেই রিডিংগুলি গ্রহণ করে এবং কোণটি গণনা করে। তাই সহজভাবে আমরা MPU6050 DMP লাইব্রেরি ব্যবহার করেছি। নিচের লিঙ্কে goint দ্বারা ডাউনলোড করুন।

github.com/ElectronicCats/mpu6050

লাইব্রেরিগুলি ইনস্টল করতে, Arduino মেনুতে সরঞ্জামগুলিতে যান-> লাইব্রেরি অন্তর্ভুক্ত করুন-> add.zip লাইব্রেরি এবং আপনার ডাউনলোড করা লাইব্রেরি ফাইলটি নির্বাচন করুন।

কোডে আপনাকে সঠিকভাবে সেটপয়েন্ট এঙ্গেল পরিবর্তন করতে হবে। PID ধ্রুব মানগুলি রোবট থেকে রোবট পর্যন্ত আলাদা। তাই টিউন করার ক্ষেত্রে, প্রথমে কি এবং কেডি মান শূন্য সেট করুন এবং তারপরে কেপি বাড়ান যতক্ষণ না আপনি ভাল প্রতিক্রিয়া গতি পান। আরো Kp আরো overshoots জন্য কারণ। তারপর Kd মান বাড়ান। এটি সর্বদা খুব কম পরিমাণে বাড়ান। এই মান সাধারণত অন্যান্য মানের তুলনায় কম। এখন কি বৃদ্ধি করুন যতক্ষণ না আপনার খুব ভাল স্থায়িত্ব থাকে।

সঠিক COM পোর্ট নির্বাচন করুন এবং বোর্ড টাইপ করুন। কোড আপলোড করুন। এখন আপনি আপনার DIY রোবটের সাথে খেলতে পারেন।

ধাপ 5: স্কিম্যাটিক্স

স্কিম্যাটিক্স
স্কিম্যাটিক্স

ধাপ 6: কোড

#অন্তর্ভুক্ত

#অন্তর্ভুক্ত "I2Cdev.h" #অন্তর্ভুক্ত "MPU6050_6Axis_MotionApps20.h" #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #অন্তর্ভুক্ত "Wire.h" #endif MPU6050 mpu; বুল dmpReady = মিথ্যা; // DMP init সফল হলে uint8_t mpuIntStatus সফল হয়; // MPU uint8_t devStatus থেকে প্রকৃত বাধা অবস্থা বাইট ধারণ করে; // প্রতিটি ডিভাইস অপারেশনের পর রিটার্ন স্ট্যাটাস (0 = সাফল্য,! 0 = ত্রুটি) uint16_t প্যাকেট সাইজ; // প্রত্যাশিত DMP প্যাকেটের আকার (ডিফল্ট 42 বাইট) uint16_t fifoCount; // FIFO uint8_t fifoBuffer এ বর্তমানে সমস্ত বাইটের সংখ্যা [64]; // FIFO স্টোরেজ বাফার Quaternion q; // [w, x, y, z] quaternion ধারক VectorFloat মাধ্যাকর্ষণ; // [x, y, z] মাধ্যাকর্ষণ ভেক্টর ফ্লোট ypr [3]; // [ইয়াও, পিচ, রোল] ইয়াও/পিচ/রোল কন্টেইনার এবং মাধ্যাকর্ষণ ভেক্টর ডবল মূল সেটপয়েন্ট = 172.5; ডবল সেটপয়েন্ট = মূল সেটপয়েন্ট; ডবল চলমান AngleOffset = 0.1; ডবল ইনপুট, আউটপুট; int moveState = 0; ডবল কেপি = 23; // সেট পি প্রথম ডাবল কেডি = 0.8; // এই মানটি সাধারণত ছোট ডাবল কি = 300; // এই মানটি ভাল স্থিতিশীলতার জন্য উচ্চ হওয়া উচিত পিআইডি পিড (এবং ইনপুট, এবং আউটপুট, এবং সেটপয়েন্ট, কেপি, কি, কেডি, সরাসরি); // pid মোটর ড্রাইভ int motL2 = 2; // 4 পিন শুরু int motR1 = 27; int motR2 = 4; volatile bool mpuInterrupt = মিথ্যা; // নির্দেশ করে যে এমপিইউ ইন্টারাপ্ট পিন উচ্চ অকার্যকর হয়েছে কিনা dmpDataReady () {mpuInterrupt = true; } অকার্যকর সেটআপ () {ledcSetup (0, 20000, 8); // pwm setup ledcSetup (1, 20000, 8); ledcSetup (2, 20000, 8); ledcSetup (3, 20000, 8); ledcAttachPin (motL1, 0); // মোটর এর pinmode ledcAttachPin (motL2, 1); ledcAttachPin (motR1, 2); ledcAttachPin (motR2, 3); // I2C বাসে যোগ দিন (I2Cdev লাইব্রেরি এটি স্বয়ংক্রিয়ভাবে করে না) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400kHz I2C ঘড়ি। সংকলন করতে সমস্যা হলে এই লাইনে মন্তব্য করুন #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif Serial.println (F ("I2C ডিভাইস শুরু করা …")); পিনমোড (14, ইনপুট); // সিরিয়াল যোগাযোগ শুরু করুন // (115200 নির্বাচিত কারণ এটি টিপট ডেমো আউটপুটের জন্য প্রয়োজনীয়, কিন্তু এটি // সত্যিই আপনার প্রকল্পের উপর নির্ভর করে) সিরিয়াল.বিগিন (9600); যখন (! সিরিয়াল); // লিওনার্দো গণনার জন্য অপেক্ষা করুন, অন্যরা অবিলম্বে চালিয়ে যান // ডিভাইস সিরিয়াল.প্রিন্টলন শুরু করুন (F ("I2C ডিভাইসগুলি শুরু করা …")); mpu.initialize (); // সংযোগ যাচাই করুন Serial.println (F ("ডিভাইস সংযোগ পরীক্ষা করা হচ্ছে …")); Serial.println (mpu.testConnection ()? F ("MPU6050 সংযোগ সফল"): F ("MPU6050 সংযোগ ব্যর্থ")); // DMP Serial.println লোড এবং কনফিগার করুন (F ("DMP আরম্ভ করছে …")); devStatus = mpu.dmpInitialize (); // এখানে আপনার নিজের গাইরো অফসেট সরবরাহ করুন, ন্যূনতম সংবেদনশীলতার জন্য স্কেল করা mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); // আমার পরীক্ষা চিপের জন্য 1688 ফ্যাক্টরি ডিফল্ট // নিশ্চিত করুন যে এটি কাজ করেছে (যদি 0 হয় তবে ফেরত দেয়) যদি (devStatus == 0) {// ডিএমপি চালু করুন, এখন এটি সিরিয়াল প্রস্তুত। ")); mpu.setDMPEnabled (সত্য); // Arduino ইন্টারাপ্ট ডিটেকশন Serial.println (F) attachInterrupt (14, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // আমাদের ডিএমপি রেডি ফ্ল্যাগ সেট করুন যাতে প্রধান লুপ () ফাংশন জানে যে এটি ব্যবহার করা ঠিক আছে Serial.println (F ("ডিএমপি প্রস্তুত! dmpReady = সত্য; // পরবর্তী তুলনা প্যাকেটের জন্য প্রত্যাশিত DMP প্যাকেটের আকার পান সাইজ = mpu.dmpGetFIFOPacketSize (); // সেটআপ PID pid. SetMode (স্বয়ংক্রিয়); pid. SetSampleTime (10); pid. SetOutputLimits (-255, 255); } অন্যথায় {// ভুল! // 1 = প্রাথমিক মেমরি লোড ব্যর্থ হয়েছে // 2 = ডিএমপি কনফিগারেশন আপডেট ব্যর্থ হয়েছে // (যদি এটি ভেঙে যাচ্ছে, সাধারণত কোডটি 1 হবে) মুদ্রণ (devStatus); Serial.println (F (")")); }} void loop () {// যদি প্রোগ্রামিং ব্যর্থ হয়, (! dmpReady) রিটার্ন হলে কিছু করার চেষ্টা করবেন না; // এমপিইউ ইন্টারাপ্ট বা অতিরিক্ত প্যাকেটের জন্য অপেক্ষা করুন (! আউটপুট); } // বাধা পতাকা পুনরায় সেট করুন এবং INT_STATUS বাইট mpuInterrupt = মিথ্যা পান; mpuIntStatus = mpu.getIntStatus (); // বর্তমান FIFO গণনা পান fifoCount = mpu.getFIFOCount (); // ওভারফ্লো চেক করুন (আমাদের কোডটি খুব অদক্ষ না হলে এটি কখনই ঘটবে না) যদি ((mpuIntStatus & 0x10) || Serial.println (F ("FIFO overflow!")); // অন্যথায়, ডিএমপি ডেটা প্রস্তুত বাধা চেক করুন (এটি ঘন ঘন হওয়া উচিত)} অন্যথায় যদি (mpuIntStatus এবং 0x02) {// সঠিক উপলব্ধ ডেটা দৈর্ঘ্যের জন্য অপেক্ষা করুন, খুব ছোট অপেক্ষা করা উচিত (ফিফোকাউন্ট 1 প্যাকেট উপলব্ধ // (এটি আমাদেরকে অবিলম্বে আরো বাধা না দিয়ে আরও পড়তে দিন) মুদ্রণ ("ypr / t");; সিরিয়াল.প্রিন্ট ("\ t"); Serial.println (ypr [2] * 180/M_PI); L1, L2, R1, R2; যদি (PWM> = 0) {// এগিয়ে দিক L2 = 0; L1 = abs (PWM); R2 = 0; R1 = abs (PWM); যদি (L1> = 255) L1 = R1 = 255;}} অন্য {// পিছনের দিক L1 = 0; L2 = abs (PWM); R1 = 0; R2 = abs (PWM); যদি (L2> = 255) {L2 = R2 = 255; }} // মোটর ড্রাইভ ledcWrite (0, L1); ledcWrite (1, L2); ledcWrite (2, R1*0.97); // 0.97 স্পিড ফ্যাক্ট অথবা, কারণ ডান মোটরের বাম মোটরের তুলনায় উচ্চ গতি আছে, তাই আমরা মোটর গতি সমান LEDcWrite (3, R2*0.97) না হওয়া পর্যন্ত এটি হ্রাস করি;

}

প্রস্তাবিত: