في هذا الدليل، سنقوم ببناء سيارة تتجنب العوائق باستخدام أردوينو. يتضمن هذا المشروع استخدام درع محرك L293D، ومحرك سيرفو، ومستشعر الموجات فوق الصوتية. ستقوم سيارة الروبوت بمسح محيطها باستمرار باستخدام مستشعر الموجات فوق الصوتية المثبت على محرك سيرفو. إذا تم اكتشاف عائق، ستغير السيارة اتجاهها لتجنب العائق. هذا المشروع القائم على أردوينو هو وسيلة ممتازة لتعلم التحكم في المحركات ومحركات السيرفو ودمج المستشعرات. علاوة على ذلك، فإنه يعد تطبيقًا عمليًا لجميع الدروس السابقة حول المتحكمات الدقيقة Arduino, محركات السيرفو, أجهزة الاستشعار بالموجات فوق الصوتيةو التحكم في محرك التيار المستمر.
المكونات المطلوبة:
- أردوينو أونو
- درع محرك L293D
- 2 محرك تيار مستمر
- Servo Motor (SG90)
- مستشعر الموجات فوق الصوتية (HC-SR04)
- أسلاك التوصيل
- استخدام 8 بطاريات AA قابلة لإعادة الشحن (1.5 فولت لكل واحدة). سنستخدم 8 بطاريات AA قابلة لإعادة الشحن متصلة على التوالي، والتي توفر 1.5 فولت * 8 = 12 فولت. يمكن تشغيل درع الأردوينو بجهد من 5 إلى 12 فولت، وسيتم تزويد الأردوينو بالطاقة مباشرة من هذا المصدر.
- حوامل بطاريات لأربع بطاريات AA لكل واحدة
- مفتاح كهربائي
- هيكل لتركيب المكونات
- العجلات
- براغي وصواميل
- حاملات مطبوعة ثلاثية الأبعاد لمحرك السيرفو والمستشعر فوق الصوتي
دليل خطوة بخطوة لبناء سيارة روبوت تتجنب العوائق
الخطوة 1: تجميع حاملات البطاريات
تركيب حاملات البطاريات:
- قم بتركيب حاملات البطاريات على هيكل الروبوت باستخدام المسامير والصواميل.
- قم بلحام كابلات الحاملين بالتسلسل، بحيث تكون البطاريات الثماني متصلة في تكوين تسلسلي، مما ينتج عنه مجموع 12 فولت.
الخطوة 2: تركيب المفتاح
أضف المفتاح:
- قم بلحام أحد طرفي المفتاح بالطرف الموجب لسلسلة البطاريات.
- ثبت المفتاح على الهيكل في مكان يسهل الوصول إليه.
الخطوة 3: تحضير محركات التيار المستمر
قم بتثبيت محركات التيار المستمر:
- قم بلحام الأسلاك بأطراف محركات التيار المستمر.
- قم بتركيب محركي التيار المستمر على الجانبين الأيسر والأيمن من الهيكل باستخدام البراغي والصواميل.
الخطوة 4: تحضير حامل الأردوينو
تحضير حامل الأردوينو المطبوع بتقنية الطباعة ثلاثية الأبعاد:
- سخّن المسامير اللولبية (inserts) باستخدام مكواة اللحام واضغطها في الفتحات المقابلة في الحامل المطبوع بتقنية الطباعة ثلاثية الأبعاد.
الخطوة 5: تثبيت حامل الأردوينو
تثبيت حامل الأردوينو:
- ثبت الحامل المطبوع بتقنية ثلاثية الأبعاد على الهيكل باستخدام البراغي.
- ضع المتحكم الدقيق Arduino على الحامل وثبته باستخدام البراغي.
- أدخل درع المحرك Arduino في المتحكم الدقيق Arduino، مع التأكد من محاذاة جميع الدبابيس بشكل صحيح.
الخطوة 6: تركيب محرك السيرفو
ثبت حامل محرك السيرفو:
- استخدم شريطًا مزدوج الجوانب لتثبيت حامل محرك السيرفو المطبوع بتقنية الطباعة ثلاثية الأبعاد على الهيكل.
- أدخل محرك السيرفو SG90 في الحامل وثبته بإحكام.
الخطوة 7: تثبيت مستشعر الموجات فوق الصوتية
ثبت مستشعر الموجات فوق الصوتية:
- أدخل مستشعر الموجات فوق الصوتية HC-SR04 في الحامل المطبوع بتقنية الطباعة ثلاثية الأبعاد.
- ثبت الحامل على المحرك السيرفو باستخدام البرغي.
الخطوة 8: تركيب العجلة الداعمة
تركيب العجلة الداعمة:
- تثبيت العجلة الداعمة على الهيكل باستخدام المسامير المناسبة.
الخطوة 9: تثبيت العجلات
تثبيت العجلات
- ثبت العجلات على المحركات التيار المستمر على الجانبين الأيسر والأيمن.
الخطوة 10: توصيل المكونات
قم بتوصيل المكونات:
- محركات التيار المستمر (DC): قم بتوصيل المحرك الأيسر إلى المحطات A- و A+ على درع المحرك، والمحرك الأيمن إلى المحطات B- و B+.
- محرك السيرفو: Connect the signal wire to pin 5 on the Arduino. Connect the VCC and GND to the (5V) 3,3V and GND pins on the motor shield.
- مستشعر الموجات فوق الصوتية: قم بتوصيل دبوس Trigger بالمنفذ 7 ودبوس Echo بالمنفذ 6 على لوحة Arduino. ثم قم بتوصيل سلكي VCC وGND إلى 5V وGND على درع المحرك.
- Power Supply: قم بتوصيل الطرف الموجب من المفتاح إلى الطرف المخصص للطاقة على درع المحرك. تأكد من توصيل الأرضي بشكل صحيح.
الخطوة 11: أدخل البطاريات
أدخل بطاريات AA:
- أدخل البطاريات في الحاملات، مع التأكد من أن البطاريات موضوعة بشكل صحيح لتحقيق الاتصال السلس وتوفير الطاقة اللازمة للنظام.
برمجة الأردوينو لسيارة روبوت تتجنب العوائق
إليك الكود الكامل للتحكم في سيارة تتجنب العوائق باستخدام أردوينو.يقوم الكود بتهيئة محرك السيرفو ومستشعر الموجات فوق الصوتية، ويتحكم في المحركات بناءً على المسافة إلى أقرب عائق.
/** * Author: Omar Draidrya * Date: 2024-06-18 * This code controls a robot with ultrasonic sensors and servo motors to avoid obstacles. */ #include <Servo.h> // Create a Servo object to control the servo motor Servo myservo; int pos = 0; // Variable to store the servo position // Define motor pins int directionA = 12; // Pin for direction of Motor A int speedA = 3; // Pin for speed of Motor A int brakeA = 9; // Pin for brake of Motor A int directionB = 13; // Pin for direction of Motor B int speedB = 11; // Pin for speed of Motor B int brakeB = 8; // Pin for brake of Motor B // Define ultrasonic sensor pins int trigger = 7; // Trigger pin int echo = 6; // Echo pin long duration = 0; // Variable to store the duration of the echo long distance = 0; // Variable to store the distance from the obstacle int currentAngle = 90; // Start with the sensor facing forward int scanDirection = 1; // 1 for right, -1 for left void setup() { // Attach the servo on pin 5 to the servo object myservo.attach(5); // Set the trigger pin as OUTPUT and the echo pin as INPUT pinMode(trigger, OUTPUT); pinMode(echo, INPUT); // Initialize Motor A pins pinMode(directionA, OUTPUT); pinMode(directionB, OUTPUT); pinMode(brakeA, OUTPUT); pinMode(brakeB, OUTPUT); // Apply brakes (stop the motors) digitalWrite(brakeA, HIGH); digitalWrite(brakeB, HIGH); // Set the servo to the center position initially myservo.write(90); delay(500); } void loop() { // Measure the distance to the nearest obstacle distance = measureDistance(); if (distance < 40) { // Gradually reduce speed as the obstacle approaches int speed = map(distance, 20, 40, 75, 128); motorTurn(directionA, speedA, HIGH, speed); motorTurn(directionB, speedB, HIGH, speed); if (distance < 15) { // Stop the motors digitalWrite(brakeA, HIGH); digitalWrite(brakeB, HIGH); delay(500); // Check surroundings int leftDistance = checkDirection(175); int rightDistance = checkDirection(5); // Determine if the robot is in a dead end if (leftDistance < 15 && rightDistance < 15) { // Move backward motorTurn(directionA, speedA, LOW, 128); motorTurn(directionB, speedB, LOW, 128); delay(500); // Apply brakes digitalWrite(brakeA, HIGH); digitalWrite(brakeB, HIGH); delay(500); // Scan again after moving back leftDistance = checkDirection(30); rightDistance = checkDirection(150); } // Determine the best direction to turn if (leftDistance > rightDistance) { // Turn left motorTurn(directionA, speedA, LOW, 128); motorTurn(directionB, speedB, HIGH, 128); } else { // Turn right motorTurn(directionA, speedA, HIGH, 128); motorTurn(directionB, speedB, LOW, 128); } delay(500); // Apply brakes digitalWrite(brakeA, HIGH); digitalWrite(brakeB, HIGH); delay(500); // Set the servo back to the center position myservo.write(90); delay(500); } } else { // Move forward at a reduced speed motorTurn(directionA, speedA, HIGH, 100); motorTurn(directionB, speedB, HIGH, 100); // Continuously scan left and right currentAngle += scanDirection * 10; if (currentAngle >= 150 || currentAngle <= 30) { scanDirection = -scanDirection; } myservo.write(currentAngle); delay(40); // Adjusted delay for more realistic servo movement } } // Function to set the direction and speed of motors void motorTurn(int directionPin, int speedPin, int direction, int speed) { digitalWrite(directionPin, direction); analogWrite(speedPin, speed); if (directionPin == directionA) { digitalWrite(brakeA, LOW); } else { digitalWrite(brakeB, LOW); } } // Function to measure the distance using the ultrasonic sensor int measureDistance() { digitalWrite(trigger, LOW); delayMicroseconds(2); digitalWrite(trigger, HIGH); delayMicroseconds(10); digitalWrite(trigger, LOW); duration = pulseIn(echo, HIGH); distance = (duration / 2) / 29.1; return distance; } // Function to check the distance in a specific direction int checkDirection(int angle) { myservo.write(angle); delay(500); // Give the servo time to move int measuredDistance = measureDistance(); return measuredDistance; }
شرح الكود
يقوم هذا الكود الخاص بأردوينو بالتحكم في روبوت مزود بمحركات تيار مستمر، ومحرك سيرفو، ومستشعر فوق صوتي للتنقل وتجنب العقبات.
المكونات وتكوين الدبابيس:
- محرك السيرفو: يتم التحكم بها عبر الدبوس 5.
- محركات التيار المستمر (DC): اتجاه وسرعة التحكم عبر الدبابيس 12، 3، 9 (المحرك A) و13، 11، 8 (المحرك B).
- مستشعر الموجات فوق الصوتية: دبابيس الـ Trigger وEcho متصلة بالدبابيس 7 و6 على التوالي.
دالة الإعداد:
- تهيئة المحرك السيرفو: تم توصيل محرك السيرفو بالدبوس 5 وضبطه على الوضع المركزي (90 درجة).
- أوضاع الدبابيس (Pin Modes): دبابيس اتجاه المحرك والفرامل تم تعيينها كمخارج، ودبابيس مستشعر الموجات فوق الصوتية تم تكوينها للإخراج (الزناد) والإدخال (الصدى).
- الحالة الأولية(Initial State): يتم فرملة المحركات لوقف الحركة.
دالة الحلقة (Loop Function):
- قياس المسافة (Distance Measurement): يقيس المستشعر بالموجات فوق الصوتية المسافة إلى أقرب عقبة.
- تجنب العوائق (Obstacle Avoidance):
- إذا تم اكتشاف عقبة على بعد أقل من 40 سم، يقلل الروبوت من سرعته بشكل متناسب كلما اقترب من العقبة.
- إذا كانت المسافة أقل من 15 سم، يتوقف الروبوت ويفحص المسافات إلى اليسار (175 درجة) واليمين (5 درجات).
- إذا كان هناك عوائق على كلا الجانبين ضمن 15 سم، يتحرك الروبوت إلى الخلف لفترة وجيزة ثم يعاود الفحص مرة أخرى.
- بناءً على المسافات التي تم مسحها، يقرر الروبوت الدوران إلى اليسار أو اليمين، أي الاتجاه الذي يحتوي على مساحة أكبر.
- بعد الدوران، يتم إعادة ضبط السيرفو إلى الوضع المركزي (90 درجة).
المسح المستمر (Continuous Scanning):
- عندما لا يتم اكتشاف عائق قريب، يتحرك الروبوت للأمام بينما يقوم المحرك السيرفو بمسح مستمر إلى اليسار واليمين بين 30 و150 درجة، مع تعديل اتجاه المسح ديناميكياً.
دوال المساعدة (Helper Functions):
- motorTurn: تتحكم في اتجاه وسرعة المحرك المحدد.
- measureDistance: تفعّل مستشعر الموجات فوق الصوتية وتحسب المسافة إلى العائق بناءً على زمن الصدى.
- checkDirection: تدوير محرك السيرفو إلى زاوية محددة، وقياس المسافة في هذا الاتجاه، وإرجاع المسافة المقاسة.
يضمن هذا الإعداد أن يتحرك الروبوت إلى الأمام، ويتجنب العوائق بشكل ديناميكي من خلال مسح بيئته، ويتخذ قراراته بناءً على المسافات المكتشفة للتنقل بفعالية.
الخطوات النهائية لتجميع واختبار سيارة روبوت تتجنب العوائق
- قم بتحميل الكود: حمل الكود إلى الأردوينو.
- تشغيل الروبوت: تأكد من توصيل جميع المكونات وتوصيل مصدر الطاقة الخارجي.
- راقب السلوك: يجب أن تتحرك السيارة إلى الأمام حتى يتم اكتشاف عائق، ثم تغير اتجاهها لتجنب العائق.
المزيد عن درع محرك اردوينو (Arduino Motor Shield)
يعمل درع المحرك Arduino Motor Shield على تبسيط التحكم في المحرك من خلال نهج التوصيل والتشغيل، مما يوفر واجهة سهلة لتوصيل محركات التيار المستمر إلى Arduino الخاص بك.
الميزات الرئيسية:
- يتحكم في محركي تيار مستمر أو محرك متدرج واحد
- يتعامل مع التيارات العالية (حتى 2 أمبير لكل قناة)
- يدعم PWM للتحكم في السرعة
الروابط:
- Motor Terminals (A+, A-, B+, B-): يتم التوصيل بأسلاك المحرك.
- Power Supply (Vin, GND): مصدر طاقة خارجي للمحركات.
- Control Pins (DIR A, DIR B, PWM A, PWM B): تحكم في اتجاه المحرك وسرعته.
الخاتمة
بناء سيارة لتفادي العوائق باستخدام الأردوينو ومحرك L293D هو مشروع ممتاز لفهم التحكم في المحركات ومحركات السيرفو ودمج المستشعرات. يمكن توسيع هذا المشروع بإضافة المزيد من المستشعرات أو بتمديد خوارزمية تجنب العقبات لتحقيق تنقل أكثر تعقيدًا. باتباع هذه الخطوات واستخدام الكود المقدم، يمكنك بنجاح إنشاء سيارة روبوت قادرة على التنقل في بيئتها وتجنب العقبات.