جدول المحتويات:

استخدام Arduino Uno لوضع XYZ لـ 6 ذراع روبوتية DOF: 4 خطوات
استخدام Arduino Uno لوضع XYZ لـ 6 ذراع روبوتية DOF: 4 خطوات

فيديو: استخدام Arduino Uno لوضع XYZ لـ 6 ذراع روبوتية DOF: 4 خطوات

فيديو: استخدام Arduino Uno لوضع XYZ لـ 6 ذراع روبوتية DOF: 4 خطوات
فيديو: 03 شرح لبوردة التحكم الرئيسية CNC 3018 PRO 2024, شهر نوفمبر
Anonim
Image
Image

يدور هذا المشروع حول تنفيذ رسم Arduino قصير وسهل نسبيًا لتوفير موضع حركي عكسي XYZ. لقد قمت ببناء 6 ذراع آلية مؤازرة ولكن عندما يتعلق الأمر بالعثور على برنامج لتشغيله ، لم يكن هناك الكثير باستثناء البرامج المخصصة التي تعمل على دروع مؤازرة مخصصة مثل SSC-32 (U) أو البرامج والتطبيقات الأخرى التي كانت معقدة التركيب والتواصل مع الذراع. ثم عثرت على "الحركية المعكوسة للذراع الروبوتية" الأكثر تميزًا لأوليغ مازوروف على Arduino حيث قام بتطبيق علم الحركة العكسي في رسم تخطيطي بسيط من Arduino.

لقد أجريت تعديلين لتكييف الكود الخاص به:

1. لقد استخدمت مكتبة VarSpeedServo بدلاً من مكتبة درع المؤازرة المخصصة الخاصة به لأنه يمكنني بعد ذلك التحكم في سرعة الماكينات ولن أضطر إلى استخدام درع المؤازرة الذي استخدمه. بالنسبة لأي شخص يفكر في تشغيل الكود المقدم هنا ، أوصي باستخدام مكتبة VarSpeedServo هذه ، بدلاً من مكتبة servo.h ، بحيث يمكنك إبطاء حركة ذراعك الآلية أثناء التطوير أو قد تجد أن الذراع ستدخلها بشكل غير متوقع الوجه أو ما هو أسوأ لأنه سيتحرك بأقصى سرعة مؤازرة.

2. أستخدم درع مستشعر / مؤازر بسيط لتوصيل الماكينات بـ Arduino Uno ولكنها لا تتطلب مكتبة مؤازرة خاصة لأنها تستخدم فقط دبابيس Arduino. يكلف بضعة دولارات فقط ولكنه غير مطلوب. إنه يجعل اتصالًا نظيفًا لطيفًا بين الماكينات إلى Arduino. ولن أعود أبدًا إلى الماكينات الصلبة إلى Arduino Uno الآن. إذا كنت تستخدم درع المستشعر / المؤازرة هذا ، فأنت بحاجة إلى إجراء تعديل طفيف واحد سأوضحه أدناه.

يعمل الكود بشكل رائع ويسمح لك بتشغيل الذراع باستخدام وظيفة واحدة تمرر فيها معلمات x و y و x والسرعة. على سبيل المثال:

set_arm (0 ، 240 ، 100 ، 0 ، 20) ؛ // المعلمات هي (x ، y ، z ، زاوية القابض ، سرعة المؤازرة)

تأخير (3000) ؛ // التأخير مطلوب للسماح بوقت ذراع للانتقال إلى هذا الموقع

لا يمكن أن يكون أبسط. سوف أقوم بتضمين الرسم أدناه.

فيديو Oleg هنا: التحكم في الذراع الآلية باستخدام Arduino و USB Mouse

برنامج Oleg الأصلي ، والأوصاف ، والموارد: Oleg's Inverse Kinematics لـ Arduino Uno

لا أفهم كل الرياضيات وراء الروتين ولكن الشيء الجميل هو أنك لست مضطرًا لاستخدام الكود. أتمنى أن تجربها.

الخطوة 1: تعديلات الأجهزة

تعديلات الأجهزة
تعديلات الأجهزة

1. الشيء الوحيد المطلوب هو أن يتحول المؤازر الخاص بك في الاتجاهات المتوقعة مما قد يتطلب منك عكس تركيب الماكينات الخاصة بك فعليًا. انتقل إلى هذه الصفحة لمشاهدة اتجاه المؤازرة المتوقع لأجهزة القاعدة والكتف والكوع والمعصم:

2. إذا كنت تستخدم درع المستشعر الذي أستخدمه ، فأنت بحاجة إلى القيام بشيء واحد له: ثني الدبوس الذي يصل 5 فولت من الدرع إلى Arduino Uno بعيدًا عن الطريق حتى لا يتصل بلوحة Uno. تريد استخدام الجهد الخارجي على الدرع لتشغيل الماكينات الخاصة بك فقط ، وليس Arduino Uno أو قد تدمر Uno ، وأنا أعلم أنني أحرقت لوحين من Uno عندما كان الجهد الخارجي 6 فولت بدلاً من 5. وهذا يسمح لك لاستخدام أعلى من 5 فولت لتشغيل الماكينات الخاصة بك ، ولكن إذا كان جهدك الخارجي أعلى من 5 فولت ، فلا تقم بتوصيل أي مستشعرات 5 فولت بالدرع وإلا سيتم قليها.

الخطوة 2: قم بتنزيل مكتبة VarSpeedServo

تحتاج إلى استخدام هذه المكتبة التي تحل محل مكتبة أجهزة arduino القياسية لأنها تسمح لك بتمرير سرعة المؤازرة إلى بيان الكتابة المؤازرة. تقع المكتبة هنا:

مكتبة VarSpeedServo

يمكنك فقط استخدام الزر المضغوط وتنزيل الملف المضغوط ثم تثبيته باستخدام Arduino IDE. بمجرد تثبيت الأمر في برنامجك سيبدو كما يلي: servo.write (100، 20)؛

المعلمة الأولى هي الزاوية والثانية هي سرعة المؤازرة من 0 إلى 255 (السرعة الكاملة).

الخطوة 3: قم بتشغيل هذا الرسم

هنا هو برنامج المنافسة. تحتاج إلى تعديل بعض المعلمات لأبعاد ذراعك الآلية:

1. أطوال BASE_HGT و HUMERUS و ULNA و GRIPPER بالمليمترات.

2. أدخل أرقام دبوس المؤازرة الخاصة بك

3. أدخل المؤازرة min و max في عبارات الإرفاق.

4. ثم جرب أمر set_arm () البسيط ثم وظائف zero_x () والخط () والدائرة () للاختبار. تأكد من أن سرعة المؤازرة منخفضة في المرة الأولى التي تقوم فيها بتشغيل هذه الوظائف لمنع إتلاف ذراعك وذراعك.

حظا طيبا وفقك الله.

# تضمين VarSpeedServo.h

/ * التحكم المؤازر لذراع AL5D * /

/ * أبعاد الذراع (مم) * /

#define BASE_HGT 90 // ارتفاع القاعدة

#define HUMERUS 100 // الكتف إلى الكوع "عظم"

#define ULNA 135 // الكوع إلى الرسغ "عظم"

#define GRIPPER 200 // القابض (بما في ذلك آلية تدوير المعصم الثقيلة) الطول"

#define ftl (x) ((x)> = 0؟ (long) ((x) +0.5):(long) ((x) -0.5)) // تعويم للتحويل الطويل

/ * أسماء / أرقام المؤازرة *

* المؤازرة الأساسية HS-485HB * /

#define BAS_SERVO 4

/ * جهاز الكتف HS-5745-MG * /

# تعريف SHL_SERVO 5

/ * مرفق الكوع HS-5745-MG * /

#define ELB_SERVO 6

/ * معزز المعصم HS-645MG * /

#define WRI_SERVO 7

/ * مضاعفات تدوير المعصم HS-485HB * /

#define WRO_SERVO 8

/ * القابض المؤازر HS-422 * /

#define GRI_SERVO 9

/ * حسابات مسبقة * /

تعويم hum_sq = HUMERUS * HUMERUS ؛

تعويم uln_sq = ULNA * ULNA ؛

عدد مضاعفات السرعة = 10 ؛

// المؤازرة ServoShield ؛ // كائن ServoShield

VarSpeedServo servo1 و servo2 و servo3 و servo4 و servo5 و servo6 ؛

int loopCounter = 0 ؛

عرض النبض int = 6.6 ؛

دقيقة دقيقة إلى درجة ؛

الإعداد باطل()

{

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_park () ؛

تأخير (4000) ؛

Serial.begin (9600) ؛

Serial.println ("ابدأ") ؛

}

حلقة فارغة()

{

loopCounter + = 1 ؛

// set_arm (-300 ، 0 ، 100 ، 0 ، 10) ؛ //

// تأخير (7000) ؛

// zero_x () ؛

//خط()؛

//دائرة()؛

تأخير (4000) ؛

إذا (loopCounter> 1) {

servo_park () ؛

// set_arm (0 ، 0 ، 0 ، 0 ، 10) ؛ // منتزه

تأخير (5000) ؛

خروج (0) ؛ } // pause program - اضغط على reset للمتابعة

// خروج (0) ؛

}

/ * روتين تموضع الذراع باستخدام علم الحركة المعكوس * /

/ * z ارتفاع ، y المسافة من مركز القاعدة إلى الخارج ، x جانب إلى جانب. يمكن أن تكون y ، z موجبة فقط * /

// void set_arm (uint16_t x، uint16_t y، uint16_t z، uint16_t grip_angle)

set_arm باطلة (float x ، float y ، float z ، float grip_angle_d ، int servoSpeed)

{

تعويم grip_angle_r = راديان (grip_angle_d) ؛ // زاوية القبضة بالتقدير الدائري لاستخدامها في العمليات الحسابية

/ * زاوية القاعدة والمسافة الشعاعية من إحداثيات x و y * /

تعويم bas_angle_r = atan2 (x، y) ؛

تعويم rdist = sqrt ((x * x) + (y * y)) ؛

/ * rdist هو تنسيق y للذراع * /

ص = rdist ؛

/ * تم حساب تعويضات المقبض بناءً على زاوية القبضة * /

تعويم grip_off_z = (sin (grip_angle_r)) * GRIPPER ؛

تعويم grip_off_y = (cos (grip_angle_r)) * GRIPPER ؛

/ * وضع المعصم * /

تعويم wrist_z = (z - grip_off_z) - BASE_HGT ؛

تعويم wrist_y = y - grip_off_y ؛

/ * مسافة الكتف إلى المعصم (AKA sw) * /

float s_w = (wrist_z * wrist_z) + (wrist_y * wrist_y) ؛

تعويم s_w_sqrt = sqrt (s_w) ؛

/ * s_w زاوية الأرض * /

float a1 = atan2 (wrist_z، wrist_y) ؛

/ * زاوية 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) ؛

/ * زاوية الكوع * /

تعويم elb_angle_r = أكوس ((hum_sq + uln_sq - s_w) / (2 * HUMERUS * ULNA)) ؛

تعويم elb_angle_d = درجات (elb_angle_r) ؛

تعويم elb_angle_dn = - (180.0 - elb_angle_d) ؛

/ * زاوية المعصم * /

تعويم wri_angle_d = (grip_angle_d - elb_angle_dn) - shl_angle_d ؛

/ * نبضات مؤازرة * /

تعويم bas_servopulse = 1500.0 - ((بالدرجات (bas_angle_r)) * pulseWidth) ؛

تعويم shl_servopulse = 1500.0 + ((shl_angle_d - 90.0) * عرض النبض) ؛

تعويم elb_servopulse = 1500.0 - ((elb_angle_d - 90.0) * عرض النبض) ؛

// تعويم wri_servopulse = 1500 + (wri_angle_d * pulseWidth) ؛

// تعويم wri_servopulse = 1500 + (wri_angle_d * pulseWidth) ؛

float wri_servopulse = 1500 - (wri_angle_d * pulseWidth) ؛ // تم تحديثه في 2018/2/11 بواسطة jimrd - لقد غيرت علامة الجمع إلى ناقص - لست متأكدًا من كيفية عمل هذا الرمز لأي شخص من قبل. يمكن أن يكون مؤازرة الكوع مثبتة بزاوية 0 درجة لأسفل بدلاً من أعلى.

/ * تعيين الماكينات * /

//servos.setposition(BAS_SERVO، ftl (bas_servopulse)) ؛

microsecondsToDegrees = الخريطة (ftl (bas_servopulse) ، 544 ، 2400 ، 0 ، 180) ؛

servo1.write (microsecondsToDegrees ، servoSpeed) ؛ // استخدم هذه الوظيفة بحيث يمكنك ضبط سرعة المؤازرة //

//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) ؛

}

/ * نقل الماكينات إلى موضع الانتظار * /

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) ؛

مؤازرة 6.write (80 ، 10) ؛

إرجاع؛

}

باطل zero_x ()

{

لـ (yaxis مزدوج = 250.0 ؛ yaxis <400.0 ؛ yaxis + = 1) {

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

set_arm (0 ، yaxis ، 200.0 ، 0 ، 10) ؛

تأخير (10) ؛

}

لـ (yaxis مزدوج = 400.0 ؛ yaxis> 250.0 ؛ yaxis - = 1) {

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) ؛

}

}

دائرة باطلة ()

{

#define RADIUS 50.0

// زاوية تعويم = 0 ؛

تعويم zaxis ، yaxis ؛

من أجل (زاوية الطفو = 0.0 ؛ الزاوية <360.0 ؛ الزاوية + = 1.0) {

yaxis = RADIUS * sin (راديان (زاوية)) + 300 ؛

zaxis = RADIUS * cos (راديان (زاوية)) + 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 (): يشرح موقع Oleg Mazurov كل شيء أو يوفر روابط لمزيد من المعلومات: https://www.circuitsathome.com/mcu/robotic-arm-inv …

3. هل هناك أي فحص لحالة الحدود؟ لا. عندما يتم تمرير ذراعي الروبوتية بتنسيق xyz غير صالح ، فإنه يقوم بهذا النوع المضحك من حركة التقوس مثل تمدد القط. أعتقد أن أوليغ يقوم ببعض التدقيق في أحدث برنامجه الذي يستخدم USB لبرمجة حركات الذراع. شاهد مقطع الفيديو الخاص به واربطه بأحدث رمز له.

4. يجب تنظيف الكود ويمكن التخلص من الشفرة بالميكرو ثانية.

موصى به: