fbpx

اللحام الآلي بواسطة الروبوت

متطلبات كتابة وصفة – MATE Arab ROV’19 Competition
فبراير 4, 2019
متطلبات عمل مشروع لمسابقة الProduct Design
فبراير 26, 2019

اللحام الآلي بواسطة الروبوت

مشكلة أتمتة المهام الدقيقة واحدة من الموضوعات البحثية الهامة. وتسمى الروبوتات التي تقوم بهذه المهمة باسم Robot Manipulation.

توجد عادة مثل هذه الروبوتات في خطوط الإنتاج في صناعة السيارات والإلكترونيات أو بيئات العمل المختلفة التي تكون بها درجات الحرارة المرتفعة و المواد المشعه ، إلخ.

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

اللحام الألي

يوضح هذا المشروع كيفية لحام القطع الإلكترونية في لوحات الـ PCB باستخدام الذراع الروبوتية بإحداثيات أماكن القطع على اللوحة.

الفكرة :

أتت فكرة هذا المشروع في ذهني بمحض الصدفة أثناء بحثي لعمل حصر عن قدرات الأذرع الآليه و استخداماتها في مجال التصنيع، فوجدت أن قليل من الصناع من خاضوا هذه التجربة وهي بناء روبوت قادر على اللحام تماماً كما نشاهد في المصانع التي تعمل بنظام الأتمتة Automation.

ومما جعل الفكرة قابلة للتنفيذ أن لدي خبرة مسبقة في بناء مشاريع مشابهة، ولكن هذا هو المشروع الأصعب من وجهه نظري.
وقبل البدء في التنفيذ يجب مشاهدة العديد والعديد من المشاريع في نفس المجال، كما رأيت تصاميم عديدة و رأي معظم الصناع ذوي الخبرة بعد مراسلتهم.

يتطلب تصميم لوحة الـ PCB و وضع القطع الإلكترونية عليها بطريقة أوتوماتيكية حساب بعض المعادلات الرياضية مسبقاٌ لأخذها في الإعتبار عند تصميم برامج المحاكاة والتحكم الذي يقوم بتحريك الذراع بزوايا معينة قادرة على توصيل طرف الذراع (كاوية اللحام) إلى القطع الإلكترونية بزاوية معينه لعدد ثواني معين، ومن ثم الانتقال لنقطه أخرى و هكذا.

ومن بعض هذه الأمور التي تمثل عناصر المعادلة هي:

  • المسافة بين الذراع الآلي و القطعة
  • مساحة اللوحة
  • وزن الذراع
  • عزم دوران المحركات
  • مواضع القطع الإلكترونية

و بناء على ذلك يتم تعريف زوايا التحريك  (التي يتم فيها تعريف حالة الجهاز الطرفي (كاوية اللحام) والمساحة الخاصة (التي يتم فيها تحديد تكوين نقط اللحام ).

كما تم بناء عدد من النماذج الأوليه لتصحيح معدلات الخطأ  أثناء التشغيل و إنشاء معادلات رياضية ذات نتائج واضحة في كل مرة يتم فيها تحريك الذراع، وتم تسمية هذه النماذج:

– النماذج الهندسية المباشرة التي تعبر عن حالة الجهاز الطرفي اعتمادًا على تكوين الآلية (كاوية اللحام).

عزم الدوران + وزن القطعة

– النماذج الحركية المباشرة والعكوسة التي تعبر عن سرعة الجهاز الطرفي في وظيفة السرعة المفصلية والعكس.

سرعة المحرك في الوصول للقطع الإلكترونية والمدة المستغرقة لعملية اللحام

– النماذج الديناميكية التي تحدد معادلات حركة الروبوت، والتي تسمح بتأسيس العلاقة بين عزم الدوران أو القوى التي تقوم بها المحركات والمواقع والتسارع في المفاصل.

وفي النهاية يتم ترجمة ذلك برمجياً لتحديد المهام المختلفة لمطالبات الروبوت لتكون قادرة على وضع الجهاز النهائي فيما يتعلق بمرجع معين. في الواقع:

– يتم تعريف معلومات التحفيز (من S.M.A) بشكل عام في المعايير المتعلقة بالمواد الصلبة المختلفة للروبوت

– غالباً ما يتم تحديد الموضع الذي يتم الوصول إليه في مرجع مرتبط بقاعدة الروبوت،

– يمكن تعريف الكائن المراد إغراقه في مرجع متحرك مستقل عن الروبوت.

المكونات الإلكترونية المستخدمة في المشروع

1. Stepper Motor 28BYJ-48 With Driver Module ULN2003

2. Arduino Uno R3

3. MG-90S Micro Metal Gear Servo Motor

4. I2C SERIAL LCD 1602 MODULE

5. Breadboard

6. Jumper wires

7. Step down Module

8. Micro servo motor metal gear

9. Nema 17 stepper motor

الأدوات المستخدمة في المشروع

  1. Laser Cut Machines
  2. كاوية لحام
  3. Rotary tool
  4. Screws 3mm
  5. Spacers 

التصميم

اعتمدت في البداية أن يكون هذا المشروع ذا طابع احترافي و أن يكون مستوحى من عدة تصميمات قائمة بالفعل، واستخدمت برنامج جوجل سكتش أب.

صُمم الذراع لكي يحمل كاوية لحام خفيفة الوزن وتعمل بالUSB، تقوم بلحام قطع إلكترونية بلوحة PCB، يتم تعريف مكانها مسبقاً ببرنامج للتحكم بإحداثيات خاصة X,Y,Z

ومن ثم يقوم برنامج التحكم بتوجية الذراع للحام كل قطعة في مكانها

يمكنك مشاهدة فيديوا التصميم من هنا

الخطوة الأولى: التشغيل والتركيب

أثناء العمل على المشروع واجهت بعض العقبات..

1. التحريك الدقيق لكاوية اللحام
الحل: استخدام محركات خطوية بدلاً من محركات السيرفو و ذلك لدقتها والتحكم الدقيق بزوايا التحريك

2. وزن الذراع وكاوية اللحام
الحل: استخدام محركان يعملان في اتجاه واحد لرفع عزم القوة


3. خامات المشروع المصنوعة من الأكريلك و التي تولد احتكاك أثناء التحريك
الحل: صناعة تروس لتقوية المحركات يتم تركيبها على محرك خطوي كبير nema17


أخيرا تم حل المشكلة باستخدام المحرك الكبير، وذلك لأن الاحتكاك بين سطحين من البلاستيك من الجانب العلوي فالأن نستطيع ضبط دوران كامل الذراع بنسبة مئوية. وكذلك تحديد الحد الأقصى لموضع الدوران بحيث ألا يتم الدوران 360 درجة لوجود الأسلاك وهذا ما سيتم شرحة في خطوة الكود .

4. الفولت


لوحة الأردوينو يمكن تشغيلها من خلال كابل USB ولكن بهذه الطريقة يتم امداد اللوحة بـ5 فولت فقط، ولتشغيل كامل الذراع نحتاج من 7 إلى 12 فولت لتكفي كل المحركات الخطوية المركبة.. ولكنها تختلف من نوع لأخر
حيث أن المحرك نيما 17 يعمل على 12 فولت
في حين ان المحرك الخطوي العادي يعمل على 5 الي7 فولت فقط

وللحل، تم تركيب قطعة إلكترونية قادرة على تقليل التيار الثابت بأي مقدار لتغدية كافة القطع كل بما يناسبه

الخطوة الثانية: تعديل التصاميم

تم تعديل التصميم أكثر من مرة لكي يتوافق مع حجم كاوية اللحام و توجيهها بالصورة الصحيحة التي تناسب موضع القطع الإلكترونية فتم تشغيل الجزء الأمامي من الذراع على محرك سيرفو


وأثناء اختبار محرك سيرفو نجح في تدوير الوزن 180 درجة بشكل صحيح لأن عزم الدوران العالي يعني أن الآلية قادرة على التعامل مع الأحمال الثقيلة. حيث يعتمد مقدار قوة الدوران القصوى للمحرك على عوامل التصميم و هي – جهد الإمداد الفولت ، وسرعة الدوران ، إلخ.

الخطوة الثالثة: شاشة العرض


من الجيد تركيب شاشة عرض قادرة على كتابة الخطوات كنوع من التنبية، ولذلك تم تركيب شاشة LCD 16*8 تقوم بكتابة ما يحدث و زوايا وخطوات العمل.

الخطوة الرابعة: كاوية اللحام


من المعروف أن درجة حرارة كاوية اللحام يصل إلى 300 درجة مئوية، لذلك يجب أخذ الحذر عند عملية التحريك لكي لا يصدم المجسم. ولذلك تم حل المشكلة باستخدام الكود ووضع حدود للتحريك من خلال دوال معينة

التكلفة الشاملة للمشروع

1. 100 جنية للقطعة = Stepper Motor 28BYJ-48 With Driver Module ULN2003

2. 60 جنية = Arduino Uno R3

3. 150جنية = MG-90S Micro Metal Gear Servo Motor

4. 75 جنية = I2C SERIAL LCD 1602 MODULE

5. 10 جنيهات = Breadboard

6. 20 جنية = Jumper wires

7. 25 جنية = Step down Module

8. 60 جنية = Micro servo motor metal gear

9. 250 جنية = Nema 17 Stepper motor

 

أماكن شراء المكونات المستخدمة

مواقع البيع أونلاين : ebay.comaliexpress.comsouq.com 
#include "AccelStepper.h"

// AccelStepper Setup
AccelStepper stepperX(1, 2, 3); // 1 = Easy Driver interface
// UNO Pin 2 connected to STEP pin of Easy Driver
// UNO Pin 3 connected to DIR pin of Easy Driver

AccelStepper stepperZ(1, 5, 6); // 1 = Easy Driver interface
// UNO Pin 5 connected to STEP pin of Easy Driver
// UNO Pin 6 connected to DIR pin of Easy Driver

AccelStepper stepperY(7, 8, 9); // 1 = Easy Driver interface
// UNO Pin 5 connected to STEP pin of Easy Driver
// UNO Pin 6 connected to DIR pin of Easy Driver

// Stepper Travel Variables
long TravelX; // Used to store the X value entered in the Serial Monitor
long TravelZ; // Used to store the Z value entered in the Serial Monitor
long TravelY; // Used to store the Y value entered in the Serial Monitor

int move_finished=1; // Used to check if move is completed

void setup() {

Serial.begin(9600); // Start the Serial monitor with speed of 9600 Bauds

// Print out Instructions on the Serial Monitor at Start
Serial.println(“Enter Travel distance seperated by a comma: X,Z “);
Serial.print(“Enter Move Values Now: “);

// Set Max Speed and Acceleration of each Steppers
stepperX.setMaxSpeed(500.0); // Set Max Speed of X axis
stepperX.setAcceleration(500.0); // Acceleration of X axis

stepperZ.setMaxSpeed(250.0); // Set Max Speed of Z axis slower for rotation
stepperZ.setAcceleration(250.0); // Acceleration of Z axis

stepperY.setMaxSpeed(250.0); // Set Max Speed of Y axis slower for rotation
stepperY.setAcceleration(250.0); // Acceleration of Y axis
}

void loop() {

while (Serial.available()>0) { // Check if values are available in the Serial Buffer

move_finished=0; // Set variable for checking move of the Steppers

TravelX= Serial.parseInt(); // Put First numeric value from buffer in TravelX variable
Serial.print(TravelX);
Serial.print(” X Travel , “);

TravelZ= Serial.parseInt(); // Put Second numeric value from buffer in TravelZ variable
Serial.print(TravelZ);
Serial.print(” Z Travel , “);

TravelY= Serial.parseInt(); // Put Second numeric value from buffer in TravelY variable
Serial.print(TravelY);
Serial.println(” Y Travel “);

stepperX.moveTo(TravelX); // Set new move position for X Stepper
stepperZ.moveTo(TravelZ); // Set new move position for Z Stepper
stepperY.moveTo(TravelY); // Set new move position for Z Stepper

delay(1000); // Wait 1 seconds before moving the Steppers
Serial.print(“Moving Steppers into position…”);
}

// Check if the Steppers have reached desired position
if ((stepperX.distanceToGo() != 0) || (stepperZ.distanceToGo() !=0) || (stepperY.distanceToGo() != 0)) {

stepperX.run(); // Move Stepper X into position
stepperZ.run(); // Move Stepper Z into position
stepperY.run(); // Move Stepper y into position

}

// If move is completed display message on Serial Monitor
if ((move_finished == 0) && (stepperX.distanceToGo() == 0) && (stepperZ.distanceToGo() == 0) && (stepperY.distanceToGo() == 0)) {
Serial.println(“COMPLETED!”);
Serial.println(“”);
Serial.println(“Enter Next Move Values (0,0,0 for reset): “); // Get ready for new Serial monitor values
move_finished=1; // Reset move variable
}
}

X