সুচিপত্র:

6 DOF রোবোটিক আর্মের XYZ পজিশনিং এর জন্য Arduino Uno ব্যবহার করা: 4 টি ধাপ
6 DOF রোবোটিক আর্মের XYZ পজিশনিং এর জন্য Arduino Uno ব্যবহার করা: 4 টি ধাপ

ভিডিও: 6 DOF রোবোটিক আর্মের XYZ পজিশনিং এর জন্য Arduino Uno ব্যবহার করা: 4 টি ধাপ

ভিডিও: 6 DOF রোবোটিক আর্মের XYZ পজিশনিং এর জন্য Arduino Uno ব্যবহার করা: 4 টি ধাপ
ভিডিও: Joint configuration systems of Robot 2024, ডিসেম্বর
Anonim
Image
Image

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

আমি তার কোড মানিয়ে নিতে দুটি পরিবর্তন করেছি:

1. আমি তার কাস্টম সার্ভো শিল্ড লাইব্রেরির জায়গায় VarSpeedServo লাইব্রেরি ব্যবহার করেছি কারণ আমি তখন সার্ভিসের গতি নিয়ন্ত্রণ করতে পারতাম এবং আমাকে তার ব্যবহৃত সার্ভো শিল্ড ব্যবহার করতে হতো না। এখানে প্রদত্ত কোডটি চালানোর বিষয়ে বিবেচনা করার জন্য আমি সুপারিশ করি যে আপনি servo.h লাইব্রেরির পরিবর্তে এই VarSpeedServo লাইব্রেরি ব্যবহার করুন, যাতে আপনি উন্নয়নের সময় আপনার রোবোটিক আর্মের গতি কমিয়ে দিতে পারেন অথবা আপনি দেখতে পারেন যে বাহুটি অপ্রত্যাশিতভাবে আপনাকে ঠেলে দেবে মুখ বা খারাপ কারণ এটি সম্পূর্ণ সার্ভো গতিতে চলবে।

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

কোডটি দুর্দান্ত কাজ করে এবং আপনাকে একটি একক ফাংশন ব্যবহার করে বাহু পরিচালনা করতে দেয় যেখানে আপনি x, y, x এবং গতি পরামিতিগুলি পাস করেন। উদাহরণ স্বরূপ:

set_arm (0, 240, 100, 0, 20); // প্যারামিটার হল (x, y, z, gripper angle, servo speed)

বিলম্ব (3000); // এই স্থানে আর্ম টাইম সরানোর জন্য বিলম্ব প্রয়োজন

সহজ হতে পারিনি। আমি নীচে স্কেচ অন্তর্ভুক্ত করব।

ওলেগের ভিডিও এখানে: আরডুইনো এবং ইউএসবি মাউস দিয়ে রোবোটিক আর্ম নিয়ন্ত্রণ করা

ওলেগের মূল প্রোগ্রাম, বিবরণ এবং সম্পদ: আরডুইনো ইউনোর জন্য ওলেগের ইনভার্স কিনেমেটিক্স

আমি রুটিনের পিছনে সমস্ত গণিত বুঝতে পারি না কিন্তু চমৎকার জিনিস হল যে আপনাকে কোডটি ব্যবহার করতে হবে না। আশা করি চেষ্টা করে দেখবেন।

ধাপ 1: হার্ডওয়্যার পরিবর্তন

হার্ডওয়্যার পরিবর্তন
হার্ডওয়্যার পরিবর্তন

1. শুধুমাত্র যে জিনিসটি প্রয়োজন তা হল আপনার সার্ভো প্রত্যাশিত দিকনির্দেশে পরিণত হয় যা আপনাকে আপনার সার্ভিসের মাউন্টকে শারীরিকভাবে বিপরীত করতে পারে। বেস, কাঁধ, কনুই এবং কব্জির সার্ভোসের জন্য প্রত্যাশিত সার্ভো দিক দেখতে এই পৃষ্ঠায় যান:

2. যদি আপনি যে সেন্সর ieldালটি ব্যবহার করেন তা ব্যবহার করলে আপনাকে এটির একটি কাজ করতে হবে: vাল থেকে 5v সংযোগকারী পিনটিকে আরডুইনো ইউনো থেকে বের করে দিন যাতে এটি ইউনো বোর্ডের সাথে সংযুক্ত না হয়। আপনি yourালের বাইরের ভোল্টেজ ব্যবহার করতে চান শুধুমাত্র আপনার সার্ভিসগুলিকে পাওয়ার জন্য, আরডুইনো ইউনো নয় বা এটি ইউনোকে ধ্বংস করতে পারে, আমি জানি যখন আমি দুটি ইউনো বোর্ড জ্বালিয়েছিলাম যখন আমার বাহ্যিক ভোল্টেজ 5 এর পরিবর্তে 6 ভোল্ট ছিল। এটি আপনাকে অনুমতি দেয় আপনার সার্ভিসগুলিকে পাওয়ার করার জন্য 5v এর বেশি ব্যবহার করতে হবে কিন্তু যদি আপনার বাহ্যিক ভোল্টেজ 5 ভোল্টের বেশি হয় তাহলে 5 ভোল্টের সেন্সরগুলিকে ieldালের সাথে সংযুক্ত করবেন না অথবা সেগুলো ভাজা হয়ে যাবে।

ধাপ 2: VarSpeedServo লাইব্রেরি ডাউনলোড করুন

আপনাকে এই লাইব্রেরিটি ব্যবহার করতে হবে যা স্ট্যান্ডার্ড আরডুইনো সার্ভো লাইব্রেরিকে প্রতিস্থাপন করে কারণ এটি আপনাকে সার্ভো রাইটমেন্ট স্টেটমেন্টে সার্ভো স্পীড দিতে দেয়। গ্রন্থাগারটি এখানে অবস্থিত:

VarSpeedServo লাইব্রেরি

আপনি কেবল জিপ বোতামটি ব্যবহার করতে পারেন, জিপ ফাইলটি ডাউনলোড করতে পারেন এবং তারপরে এটি আরডুইনো আইডিই দিয়ে ইনস্টল করতে পারেন। একবার আপনার প্রোগ্রামে কমান্ডটি ইনস্টল করা হবে: servo.write (100, 20);

প্রথম প্যারামিটার হল কোণ এবং দ্বিতীয়টি হল সার্ভোর গতি 0 থেকে 255 (পূর্ণ গতি)।

ধাপ 3: এই স্কেচটি চালান

এখানে প্রতিযোগিতা প্রোগ্রাম। আপনার রোবোটিক আর্ম ডাইমেনশনের জন্য আপনাকে কয়েকটি পরামিতি পরিবর্তন করতে হবে:

1. BASE_HGT, HUMERUS, ULNA, GRIPPER দৈর্ঘ্য মিলিমিটারে।

2. আপনার servo পিন নম্বর ইনপুট করুন

3. সংযুক্তি বিবৃতিতে সর্বনিম্ন এবং সর্বাধিক ইনপুট করুন।

4. তারপর একটি সাধারণ set_arm () কমান্ড চেষ্টা করুন এবং তারপর পরীক্ষার জন্য zero_x (), line () এবং circle () ফাংশন। আপনার বাহু এবং আপনার নিজের হাতের ক্ষতি রোধ করার জন্য প্রথমবার এই ফাংশনগুলি চালানোর সময় নিশ্চিত করুন যে আপনার সার্ভো গতি কম।

শুভকামনা রইল।

#VarSpeedServo.h অন্তর্ভুক্ত করুন

/ * AL5D বাহুর জন্য Servo নিয়ন্ত্রণ */

/ * বাহুর মাত্রা (মিমি) */

#BASE_HGT 90 // বেস উচ্চতা নির্ধারণ করুন

#হিউমারাস 100 নির্ধারণ করুন // কাঁধ থেকে কনুই "হাড়"

#ULNA 135 সংজ্ঞায়িত করুন // কনুই থেকে কব্জি "হাড়"

#সংজ্ঞায়িত করুন GRIPPER 200 // গ্রিপার (ভারী দায়িত্ব কব্জি ঘোরানোর প্রক্রিয়া সহ) দৈর্ঘ্য"

#define ftl (x) ((x)> = 0? (long) ((x) +0.5):(long) ((x) -0.5)) // float to long conversion

/ * সার্ভো নাম/সংখ্যা *

* বেস সার্ভো HS-485HB */

#BAS_SERVO সংজ্ঞায়িত করুন 4

/ * শোল্ডার সার্ভো HS-5745-MG */

#সংজ্ঞায়িত করুন SHL_SERVO 5

/ * কনুই সার্ভো HS-5745-MG */

#ELB_SERVO সংজ্ঞায়িত করুন 6

/ * কব্জি servo HS-645MG */

#WRI_SERVO সংজ্ঞায়িত করুন 7

/ * কব্জি ঘোরানো servo HS-485HB */

#WRO_SERVO সংজ্ঞায়িত করুন 8

/ * Gripper servo HS-422 */

#GRI_SERVO সংজ্ঞায়িত করুন 9

/ * প্রাক গণনা */

float hum_sq = HUMERUS*HUMERUS;

float uln_sq = ULNA*ULNA;

int servoSPeed = 10;

// ServoShield servos; // ServoShield বস্তু

VarSpeedServo servo1, servo2, servo3, servo4, servo5, servo6;

int loopCounter = 0;

int pulseWidth = 6.6;

int microsecondsToDegrees;

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

{

servo1.attach (BAS_SERVO, 544, 2400);

servo2.attach (SHL_SERVO, 544, 2400);

servo3.attach (ELB_SERVO, 544, 2400);

servo4.attach (WRI_SERVO, 544, 2400);

servo5.attach (WRO_SERVO, 544, 2400);

servo6.attach (GRI_SERVO, 544, 2400);

বিলম্ব (5500);

//servos.start (); // servo ieldাল শুরু করুন

servo_park ();

বিলম্ব (4000);

Serial.begin (9600);

Serial.println ("স্টার্ট");

}

অকার্যকর লুপ ()

{

loopCounter += 1;

// সেট_আর্ম (-300, 0, 100, 0, 10); //

// বিলম্ব (7000);

// শূন্য_এক্স ();

// লাইন ();

// বৃত্ত ();

বিলম্ব (4000);

যদি (loopCounter> 1) {

servo_park ();

// সেট_আর্ম (0, 0, 0, 0, 10); // পার্ক

বিলম্ব (5000);

প্রস্থান (0); } // বিরাম প্রোগ্রাম - চালিয়ে যেতে রিসেট চাপুন

// প্রস্থান (0);

}

/ * বিপরীত গতিবিদ্যা ব্যবহার করে আর্ম পজিশনিং রুটিন */

/* z হল উচ্চতা, y হল বেস সেন্টার থেকে দূরত্ব, x পাশের পাশে। y, z শুধুমাত্র ইতিবাচক হতে পারে */

// অকার্যকর সেট_আর্ম (uint16_t x, uint16_t y, uint16_t z, uint16_t grip_angle)

void set_arm (float x, float y, float z, float grip_angle_d, int servoSpeed)

{

ভাসা grip_angle_r = রেডিয়ান (grip_angle_d); // গণনায় ব্যবহারের জন্য রেডিয়ানে গ্রিপ এঙ্গেল

/ * বেস কোণ এবং x থেকে রেডিয়াল দূরত্ব, y স্থানাঙ্ক */

float bas_angle_r = atan2 (x, y);

float rdist = sqrt ((x * x) + (y * y));

/ * rdist হল বাহুর জন্য y সমন্বয় */

y = rdist;

/ * গ্রিপ অফসেট গ্রিপ এঙ্গেলের উপর ভিত্তি করে গণনা করা হয় */

float grip_off_z = (sin (grip_angle_r)) * GRIPPER;

ভাসা grip_off_y = (cos (grip_angle_r)) * GRIPPER;

/ * কব্জি অবস্থান */

ভাসা wrist_z = (z - grip_off_z) - BASE_HGT;

ভাসা কব্জি_ y = y - grip_off_y;

/ * কাঁধ থেকে কব্জির দূরত্ব (AKA sw) */

ভাসা s_w = (কব্জি_জ * কব্জি_জ) + (কব্জি_ওয়াই * কব্জি_ওয়াই);

ভাসা s_w_sqrt = sqrt (s_w);

/ * s_w স্থল থেকে কোণ */

ভাসমান a1 = atan2 (কব্জি_জেড, কব্জি_ওয়াই);

/ * s_w কোণ থেকে হিউমারাস */

float a2 = acos (((hum_sq - uln_sq) + s_w) / (2 * HUMERUS * s_w_sqrt));

/ * কাঁধের কোণ */

ভাসমান shl_angle_r = a1 + a2;

ভাসমান shl_angle_d = ডিগ্রী (shl_angle_r);

/ * কনুই কোণ */

float elb_angle_r = acos ((hum_sq + uln_sq - s_w) / (2 * HUMERUS * ULNA));

ভাসা elb_angle_d = ডিগ্রী (elb_angle_r);

float elb_angle_dn = - (180.0 - elb_angle_d);

/ * কব্জি কোণ */

ভাসা wri_angle_d = (grip_angle_d - elb_angle_dn) - shl_angle_d;

/ * সার্ভ ডাল */

float bas_servopulse = 1500.0 - ((degree (bas_angle_r)) * pulseWidth);

float shl_servopulse = 1500.0 + ((shl_angle_d - 90.0) * pulseWidth);

float elb_servopulse = 1500.0 - ((elb_angle_d - 90.0) * pulseWidth);

// float wri_servopulse = 1500 + (wri_angle_d * pulseWidth);

// float wri_servopulse = 1500 + (wri_angle_d * pulseWidth);

float wri_servopulse = 1500 - (wri_angle_d * pulseWidth); // jimrd দ্বারা 2018/2/11 আপডেট করা হয়েছে - আমি প্লাসকে একটি বিয়োগে পরিবর্তন করেছি - নিশ্চিত নই যে এই কোডটি আগে কারও জন্য কীভাবে কাজ করেছিল। হতে পারে যে কনুই সার্ভোটি 0 ডিগ্রী দিয়ে মাউন্ট করা হয়েছিল বরং উপরে।

/ * সেট সার্ভিস */

//servos.setposition(BAS_SERVO, ftl (bas_servopulse));

microsecondsToDegrees = মানচিত্র (ftl (bas_servopulse), 544, 2400, 0, 180);

servo1.write (microsecondsToDegrees, servoSpeed); // এই ফাংশন ব্যবহার করুন যাতে আপনি servo গতি সেট করতে পারেন //

//servos.setposition(SHL_SERVO, ftl (shl_servopulse));

microsecondsToDegrees = মানচিত্র (ftl (shl_servopulse), 544, 2400, 0, 180);

servo2.write (microsecondsToDegrees, servoSpeed);

//servos.setposition(ELB_SERVO, ftl (elb_servopulse));

microsecondsToDegrees = মানচিত্র (ftl (elb_servopulse), 544, 2400, 0, 180);

servo3.write (microsecondsToDegrees, servoSpeed);

//servos.setposition(WRI_SERVO, ftl (wri_servopulse));

microsecondsToDegrees = মানচিত্র (ftl (wri_servopulse), 544, 2400, 0, 180);

servo4.write (microsecondsToDegrees, servoSpeed);

}

/ * পার্কিং অবস্থানে servos সরান */

অকার্যকর servo_park ()

{

//servos.setposition(BAS_SERVO, 1500);

servo1.write (90, 10);

//servos.setposition(SHL_SERVO, 2100);

servo2.write (90, 10);

//servos.setposition(ELB_SERVO, 2100);

servo3.write (90, 10);

//servos.setposition(WRI_SERVO, 1800);

servo4.write (90, 10);

//servos.setposition(WRO_SERVO, 600);

servo5.write (90, 10);

//servos.setposition(GRI_SERVO, 900);

servo6.write (80, 10);

প্রত্যাবর্তন;

}

শূন্য শূন্য_এক্স ()

{

জন্য

Serial.print ("yaxis =:"); Serial.println (yaxis);

set_arm (0, yaxis, 200.0, 0, 10);

বিলম্ব (10);

}

জন্য

set_arm (0, yaxis, 200.0, 0, 10);

বিলম্ব (10);

}

}

/ * একটি সরল রেখায় হাত সরায় */

অকার্যকর লাইন ()

{

জন্য (ডাবল xaxis = -100.0; xaxis <100.0; xaxis += 0.5) {

set_arm (xaxis, 250, 120, 0, 10);

বিলম্ব (10);

}

জন্য (float xaxis = 100.0; xaxis> -100.0; xaxis -= 0.5) {

set_arm (xaxis, 250, 120, 0, 10);

বিলম্ব (10);

}

}

অকার্যকর বৃত্ত ()

{

#রেডিয়াস 50.0 সংজ্ঞায়িত করুন

// ভাসমান কোণ = 0;

ফ্লোট জ্যাক্সিস, ইয়াক্সিস;

জন্য (ভাসমান কোণ = 0.0; কোণ <360.0; কোণ += 1.0) {

yaxis = RADIUS * sin (radians (angle)) + 300;

জ্যাক্সিস = রেডিয়াস * কোস (রেডিয়ান (কোণ)) + 200;

set_arm (0, yaxis, zaxis, 0, 50);

বিলম্ব (10);

}

}

ধাপ 4: ঘটনা, সমস্যা এবং অনুরূপ …

ঘটনা, সমস্যা এবং অনুরূপ …
ঘটনা, সমস্যা এবং অনুরূপ …

1. যখন আমি বৃত্ত () সাবরুটিন চালাই তখন আমার রোবট একটি বৃত্তের চেয়ে উপবৃত্তাকার আকৃতিতে বেশি চলাচল করে। আমি তাদের মধ্যে একটি পরীক্ষা করেছি এবং 1500 মাইক্রোসেকেন্ড 90 ডিগ্রির মতো নয়। একটি সমাধান খুঁজে বের করার জন্য এটি কাজ করবে। অ্যালগরিদমের সাথে কিছু ভুল আছে তা বিশ্বাস করবেন না বরং আমার সেটিংসের সাথে। 2018/2/11 আপডেট করুন - সবেমাত্র আবিষ্কৃত হয়েছে এটি মূল কোডে ত্রুটির কারণে। আমি দেখতে পাচ্ছি না কিভাবে তার প্রোগ্রাম এটি ব্যবহার করে স্থির কোড ব্যবহার করে: float wri_servopulse = 1500 - (wri_angle_d * pulseWidth); (মূল কোড যোগ করা হয়েছিল)

2. set_arm () ফাংশন কিভাবে কাজ করে সে সম্পর্কে আমি আরও তথ্য কোথায় পেতে পারি: ওলেগ মাজুরভের ওয়েবসাইট সবকিছু ব্যাখ্যা করে বা আরও তথ্যের জন্য লিঙ্ক প্রদান করে:

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

4. কোড পরিষ্কার করা প্রয়োজন এবং মাইক্রোসেকেন্ড কোডটি দূর করা যেতে পারে।

প্রস্তাবিত: