بناء سيارة روبوتية تتجنب العوائق باستخدام أردوينو، ودرع محرك L293D، ومحرك سيرفو، ومستشعر فوق صوتي

يُوضح لك هذا الدليل كيفية بناء سيارة روبوتية تتجنب العوائق خطوة بخطوة. هل ترغب في بناء سيارة روبوتية ذاتية القيادة تتجنب العوائق من تلقاء نفسها؟ في هذا الدليل التعليمي خطوة بخطوة، ستبني سيارة ذاتية القيادة بالكامل. سيارة روبوتية تتجنب العوائق باستخدام أردوينو, ، أن لوحة حماية المحرك L293D, ، أن محرك سيرفو SG90, و مستشعر الموجات فوق الصوتية HC-SR04. يقوم الروبوت بمسح محيطه باستمرار باستخدام مستشعر الموجات فوق الصوتية المثبت على محرك مؤازر، ويكتشف العوائق في طريقه، ويتجه تلقائيًا حولها.

بشكل عام، يُعد مشروع سيارة الروبوت هذا، المصمم باستخدام أردوينو لتجنب العوائق، طريقة عملية ممتازة لتعلم التحكم في المحركات، وتحديد موضع المؤازرة، ودمج أجهزة الاستشعار، والتنقل الذاتي الأساسي. كما أنه يجمع بين مفاهيم من دروس OmArTronics السابقة حول أساسيات برمجة أردوينو, التحكم في محرك سيرفو, استشعار المسافة بالموجات فوق الصوتية, ، و نظام تحكم في محركات التيار المستمر باستخدام مشغلات المحركات. في النهاية، سيكون لديك روبوت عملي لتجنب العوائق قمت ببنائه بنفسك من الصفر.

ما ستتعلمه

  • كيف يكتشف مستشعر الموجات فوق الصوتية HC-SR04 العوائق عن طريق قياس المسافة
  • كيف يقوم محرك سيرفو بمسح مستشعر الموجات فوق الصوتية لمسح البيئة يمينًا ويسارًا
  • كيف تقوم وحدة التحكم في المحرك L293D بتشغيل محركين تيار مستمر للحركة الأمامية والخلفية والانعطاف
  • كيف يحدد كود أردوينو متى يتوقف، ويعكس اتجاهه، ويختار اتجاهًا جديدًا
  • كيفية تجميع هيكل الروبوت بالكامل مع طاقة البطارية والأسلاك وقواعد التثبيت المطبوعة ثلاثية الأبعاد
  • كيفية تحميل واختبار وضبط كود تجنب العوائق

كيف تعمل سيارة الروبوت المتجنبة للعوائق

قبل البدء بالبناء، من المفيد أولاً فهم كيفية عمل جميع الأجزاء معًا. يستخدم الروبوت حلقة استشعار-تفكير-فعل بسيطة لكنها فعالة للتنقل حول العوائق.

مستشعر الموجات فوق الصوتية (HC-SR04) - عيون الروبوت

ال مستشعر الموجات فوق الصوتية HC-SR04 يرسل الروبوت أولاً نبضة فوق صوتية قصيرة، ثم يستقبل الصدى المرتدّ من الأجسام. يقيس متحكم أردوينو الزمن بين الإرسال والاستقبال، ثم يحسب المسافة إلى أقرب عائق. تتم هذه العملية عدة مرات في الثانية أثناء حركة الروبوت.

محرك سيرفو (SG90) - الماسح الضوئي

بشكل أساسي، يتم تركيب مستشعر الموجات فوق الصوتية على محرك سيرفو SG90. أثناء تحرك الروبوت للأمام، يقوم المحرك بتحريك المستشعر يمينًا ويسارًا بزاوية تتراوح بين 30° و150°، مما يمنحه رؤية واسعة للمسار أمامه. عند اكتشاف عائق قريب، يقوم المحرك بتدوير المستشعر إلى أقصى اليسار (175°) ثم إلى أقصى اليمين (5°) لقياس المسافة على كل جانب وتحديد أيهما يوفر مساحة أكبر.

واقي المحرك L293D - القوة

ال لوحة حماية المحرك L293D تُركّب هذه الوحدة فوق لوحة أردوينو وتتحكم بمحركين كهربائيين يعملان بالتيار المستمر. وتتحكم في اتجاه (للأمام أو للخلف) وسرعته (عبر تعديل عرض النبضة) لكل محرك على حدة. ومن خلال تشغيل المحركين الأيمن والأيسر في اتجاهين مختلفين، يستطيع الروبوت الدوران في مكانه.

منطق اتخاذ القرار - الدماغ

يُشغّل الأردوينو حلقةً متواصلة: قياس المسافة، اتخاذ القرار، ثم التنفيذ. إذا كان الطريق أمام الروبوت خاليًا (أكثر من 40 سم)، فإنه يتقدم للأمام بسرعة ثابتة مع المسح. وعندما يقترب العائق (بين 15 سم و40 سم)، يُبطئ الروبوت سرعته تدريجيًا. وعندما تقل المسافة عن 15 سم، يتوقف الروبوت، وينظر يمينًا ويسارًا، ثم ينعطف نحو الجانب الأكثر انفتاحًا. أما إذا كان كلا الجانبين مسدودًا (طريق مسدود)، فإن الروبوت يتراجع أولًا، ثم يمسح الطريق مرة أخرى ويختار اتجاهًا جديدًا.

المكونات المطلوبة (قائمة المواد)

إليك كل ما تحتاجه لبناء سيارة روبوتية تتجنب العوائق باستخدام أردوينو. علاوة على ذلك، فإن معظم هذه المكونات متوفرة بكثرة وغير مكلفة.

عنصرالكميةمطلوب / اختياريغايةملحوظات
أردوينو أونو1مطلوبوحدة التحكم الدقيقة الرئيسية — تشغل رمز تجنب العوائقأي لوحة متوافقة مع أردوينو أونو تعمل
واقي المحرك L293D1مطلوبيقوم بتشغيل والتحكم في محركي التيار المستمرلأنه يتصل مباشرة بلوحة أردوينو أونو
محركات التيار المستمر (3-6 فولت)2مطلوبعجلات القيادة اليسرى واليمنىمحركات التيار المستمر القياسية للهواة
محرك سيرفو (SG90)1مطلوبيقوم المستشعر فوق الصوتي بمسح المنطقة يمينًا ويسارًا للبحث عن العوائقأي محرك سيرفو صغير بوزن 9 غرامات سيفي بالغرض
مستشعر الموجات فوق الصوتية (HC-SR04)1مطلوبيقيس المسافة إلى العوائق باستخدام نبضات فوق صوتيةوحدة ذات 4 دبابيس: VCC، Trig، Echo، GND
أسلاك توصيلعديدمطلوبجميع التوصيلات الكهربائية بين المكوناتمن الذكور إلى الذكور ومن الذكور إلى الإناث
بطاريات قابلة لإعادة الشحن من نوع AA (1.5 فولت)8مطلوبمصدر الطاقة للمحركات ولوحة أردوينو8 × 1.5 فولت = 12 فولت إجمالي. تقبل لوحة المحرك جهدًا يتراوح بين 5 و12 فولت وتُشغّل الأردوينو مباشرةً.
حوامل البطاريات (4×AA)2مطلوبقم بتثبيت البطاريات وتوصيلها على التواليموصلة على التوالي لإنتاج 12 فولت
مفتاح تبديل1مطلوبمفتاح التشغيل/الإيقاف الرئيسيعلى خط واحد مع سلك البطارية الموجب
هيكل الروبوت1مطلوبإطار لتثبيت جميع المكوناتمنصة مصنوعة من الأكريليك أو الطباعة ثلاثية الأبعاد
عجلات2مطلوبقم بتوصيله بمحركات التيار المستمر لتحريكهاختر مقاس عمود المحرك المناسب.
عجلة الدعم (العجلات الدوارة)1مطلوبنقطة اتصال ثالثة لتحقيق الاستقرارعجلة دوارة أو عجلة محورية
البراغي والصواميل والفواصلتشكيلة متنوعةمطلوبالتجميع الميكانيكيتُعد براغي M3 شائعة الاستخدام في أردوينو والهياكل
حوامل مطبوعة بتقنية الطباعة ثلاثية الأبعادتعيينخياريحوامل مخصصة لمحرك سيرفو، ومستشعر فوق صوتي، ولوحة أردوينويمكن استبدالها بالغراء الساخن أو أربطة الكابلات أو الأقواس

دليل التجميع خطوة بخطوة

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

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

ثبّت حاملي بطاريات AA الأربعة (4×AA) في الجزء السفلي أو الخلفي من هيكل الروبوت باستخدام البراغي والصواميل. قم بتلحيم أسلاك خرج الحاملين على التوالي (القطب الموجب لأحد الحاملين بالقطب السالب للآخر) بحيث يتم توصيل جميع البطاريات الثمانية على التوالي، مما ينتج عنه جهد إجمالي يبلغ حوالي 12 فولت.

الخطوة الثانية: تركيب مفتاح الطاقة

قم بتلحيم مفتاح تبديل على خط السلك الموجب القادم من سلسلة البطارية. ثبّت المفتاح في مكان يسهل الوصول إليه على الهيكل لتتمكن من تشغيل الروبوت وإيقافه بسرعة وسهولة.

الخطوة 3: قم بتوصيل محركات التيار المستمر

قم بتلحيم الأسلاك على طرفي كل محرك تيار مستمر. قم بتركيب محرك واحد على الجانب الأيسر وآخر على الجانب الأيمن من الهيكل باستخدام البراغي أو الصواميل أو أقواس تثبيت المحرك.

الخطوة الرابعة: تجهيز حامل أردوينو

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

الخطوة 5: تركيب لوحة أردوينو ولوحة المحرك

ثبّت قاعدة التثبيت المطبوعة ثلاثية الأبعاد (أو الفواصل) على الهيكل. ثم ضع لوحة أردوينو أونو على قاعدة التثبيت وثبّتها بالبراغي. بعد ذلك، وصّل لوحة محرك L293D بلوحة أردوينو بحرص، مع التأكد من محاذاة جميع دبابيس التوصيل بشكل صحيح.

الخطوة 6: تركيب محرك المؤازرة

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

الخطوة 7: تركيب مستشعر الموجات فوق الصوتية

الآن، أدخل مستشعر الموجات فوق الصوتية HC-SR04 في الحامل المطبوع ثلاثي الأبعاد (أو قم بتثبيته باستخدام الغراء الساخن). ثبّت الحامل على ذراع المحرك المؤازر باستخدام برغي صغير بحيث يدور المستشعر مع المحرك المؤازر.

الخطوة 8: تركيب عجلة الدعم

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

الخطوة 9: تركيب عجلات القيادة

اضغط على العجلات على محاور محرك التيار المستمر من كلا الجانبين. وتأكد أيضاً من تثبيتها بإحكام ودورانها بحرية دون احتكاكها بالهيكل.

توصيل المكونات

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

Wiring diagram for Arduino obstacle avoiding robot car showing connections between Arduino motor shield, HC-SR04 ultrasonic sensor, SG90 servo motor, two DC motors, and battery pack
مخطط توصيل كامل - أردوينو مع لوحة محرك L293D، ومستشعر الموجات فوق الصوتية HC-SR04، ومحرك سيرفو SG90، ومحركات التيار المستمر، ومصدر طاقة البطارية

توصيلات محرك التيار المستمر

محركطرف حماية المحرك
سلك محرك التيار المستمر الأيسر 1أ−
السلك الأيسر لمحرك التيار المستمر 2ممتاز
سلك محرك التيار المستمر الأيمن 1ب−
سلك محرك التيار المستمر الأيمن 2ب+

توصيلات محرك المؤازرة

سلك المؤازرةيتصل بـ
إشارة (برتقالي/أصفر)المنفذ الرقمي رقم 5 في أردوينو (على موصل لوحة المحرك)
VCC (أحمر)دبوس 5 فولت على لوحة المحرك
GND (بني/أسود)دبوس التأريض (GND) على لوحة المحرك

مهم: قم بتوصيل سلك الطاقة الخاص بالمحرك المؤازر بـ 5 فولت دبوس على غطاء المحرك،, لا دبوس 3.3 فولت. يتطلب محرك SG90 المؤازر 5 فولت ليعمل بكفاءة. استخدام 3.3 فولت سيؤدي إلى اهتزاز وحركة ضعيفة.

توصيلات مستشعر الموجات فوق الصوتية (HC-SR04)

دبوس HC-SR04يتصل بـ
VCC5 فولت على لوحة حماية المحرك
علم حساب المثلثاتمنفذ أردوينو الرقمي 7
صدىمنفذ أردوينو الرقمي 6
أرضيGND على لوحة المحرك

توصيلات مصدر الطاقة

سلك البطارية / المفتاحيتصل بـ
موجب (من مخرج المفتاح)غطاء المحرك / طرف الطاقة (+)
السالب (أرضي البطارية)طرف التأريض / طرف الطاقة (-) لغطاء المحرك

ستقوم لوحة التحكم بمحرك L293D بتنظيم الطاقة لأردوينو (عبر منفذ Vin)، لذا لن تحتاج إلى كابل USB منفصل بمجرد توصيل البطاريات. لذلك، تأكد دائمًا من جميع التوصيلات قبل إدخال البطاريات، لأن عكس القطبية قد يُتلف المكونات.

أدخل البطاريات

الآن، ضع جميع البطاريات الثمانية القابلة لإعادة الشحن من نوع AA في أماكنها المخصصة. ولكن لا تقم بتشغيل المفتاح بعد، سنقوم بتحميل الكود أولاً.

كود أردوينو لسيارة الروبوت التي تتجنب العوائق

فيما يلي، ستجد برنامج Arduino الكامل الذي يتحكم في سيارة الروبوت التي تتجنب العوائق. قم بتحميل هذا الكود إلى لوحة Arduino Uno الخاصة بك باستخدام بيئة تطوير Arduino المتكاملة (IDE). تأكد من أن لديك محرك سيرفو تم تثبيت المكتبة (تأتي مثبتة مسبقًا مع بيئة تطوير Arduino).

/**
 * 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;
}
    

شرح الكود

دعونا نستعرض كل قسم من أقسام الكود حتى تفهم ما يفعله كل جزء وتتمكن من تعديله بثقة.

تخصيصات الدبابيس

أولًا، في أعلى الرسم التخطيطي، نحدد منافذ أردوينو المتصلة بكل مكون. على سبيل المثال، يستخدم المحرك A (يسار) المنافذ 12 (الاتجاه)، و3 (السرعة/PWM)، و9 (الفرامل). بينما يستخدم المحرك B (يمين) المنافذ 13، و11، و8. يتم توصيل إشارة تشغيل مستشعر الموجات فوق الصوتية بالمنفذ 7، وإشارة الصدى بالمنفذ 6، وإشارة المؤازرة بالمنفذ 5. يتم تحديد أرقام هذه المنافذ بواسطة لوحة درع المحرك L293D، وهي ليست عشوائية.

قياس المسافة

ال قياس المسافة() تقوم الدالة أولاً بإرسال نبضة مدتها 10 ميكروثانية على دبوس التشغيل، ثم تنتظر صدى النبضة. بعد ذلك، تحسب المسافة بالسنتيمترات باستخدام الصيغة التالية: المسافة = (المدة / 2) / 29.1. القسمة على 2 تأخذ في الاعتبار الرحلة ذهابًا وإيابًا للموجة الصوتية، و29.1 هو العدد التقريبي للميكروثانية لكل سنتيمتر للصوت في الهواء.

التحكم في المحرك

ال motorTurn() تقوم الدالة المساعدة أساسًا بتحديد اتجاه وسرعة محرك واحد. فهي تُفعّل دبوس الاتجاه إما عاليًا (للأمام) أو منخفضًا (للخلف)، وتُحدد السرعة عبر analogWrite() (0–255)، ويحرر الفرامل. بالإضافة إلى ذلك، يستخدم غطاء المحرك دبابيس فرامل منفصلة - لذا فإن ضبط الفرامل على مستوى عالٍ يوقف المحرك فورًا.

اكتشاف العوائق وتقليل السرعة

داخل المبنى الرئيسي حلقة(), يقيس الروبوت المسافة أمامه في كل دورة، لأن هذا ضروري للتنقل في الوقت الفعلي. على سبيل المثال، إذا كانت المسافة بين 15 سم و40 سم، فإن الروبوت لا يتوقف، بل يقلل سرعته تدريجيًا باستخدام رسم خريطة() كلما اقترب العائق، تباطأت حركة الروبوت. وهذا يخلق تباطؤًا سلسًا وطبيعيًا بدلًا من التوقف المفاجئ.

منطق المسح الضوئي لليسار / اليمين

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

سلوك عكسي مسدود

إذا كانت المسافة بين الجانبين الأيمن والأيسر أقل من 15 سم، فإن الروبوت يكون في طريق مسدود. لذلك، يتراجع لمدة 500 مللي ثانية، ثم يتوقف، ثم يعيد المسح بزوايا مختلفة قليلاً (30° و150°) لإعادة التقييم. هذا يمنح الروبوت فرصة للخروج من الزوايا الضيقة وإيجاد مسار هروب جديد.

حركة المؤازرة أثناء القيادة العادية

عندما يكون الطريق أمام الروبوت خاليًا (مسافة تزيد عن 40 سم)، يتحرك الروبوت للأمام بسرعة ثابتة بينما يقوم المحرك المؤازر بمسح مستشعر الموجات فوق الصوتية باستمرار بين 30° و150° بزيادات قدرها 10°. يتيح هذا المسح الواسع للروبوت اكتشاف العوائق القادمة من الجوانب، وليس فقط من الأمام مباشرة. وبالمثل، ينعكس اتجاه المسح في كل مرة يصل فيها إلى زاوية حدية.

التحميل والاختبار والمراقبة

  1. قم بتوصيل أردوينو بجهاز الكمبيوتر الخاص بك عبر منفذ USB، ثم افتح بيئة تطوير Arduino IDE.
  2. ثم قم بتحميل الرسم التخطيطي أعلاه إلى أردوينو أونو.
  3. بعد ذلك، افصل كابل USB, أدخل البطاريات، ثم قم بتشغيل مفتاح الطاقة.
  4. راقب السلوك: وعلى وجه التحديد، يجب على الروبوت أن يتقدم للأمام، ثم يبطئ سرعته عند اقترابه من عائق، ويتوقف، ويمسح يسارًا ويمينًا، ثم ينعطف نحو المسار الأكثر وضوحًا.
  5. إذا انعطف الروبوت في الاتجاه الخاطئ، فقم بتبديل السلكين الموجودين على طرف محرك واحد (A+ و A−، أو B+ و B−) لعكس اتجاه ذلك المحرك.

كيفية ضبط الروبوت

يختلف كل هيكل ومحرك وسطح روبوت عن الآخر. فيما يلي القيم الرئيسية في الكود التي يمكنك تعديلها لضبط سلوك سيارة الروبوت الخاصة بك لتجنب العوائق بدقة.

المعلمةالقيمة الافتراضيةما الذي يتحكم فيهنصيحة لضبط المحرك
عتبة العائق (بعيدة)40 سمالمسافة التي يبدأ عندها الروبوت بالتباطؤقم بزيادة القيمة للحصول على استجابة أسرع؛ وقم بتقليلها إذا توقف الروبوت مبكرًا جدًا.
عتبة العائق (قريب)15 سمالمسافة التي يتوقف عندها الروبوت ويقوم بالمسحقم بزيادة القيمة إذا تعطل الروبوت قبل التوقف؛ وقللها لتحسين دقة الملاحة.
للأمام سريع100 (PWM)سرعة الإبحار عندما يكون الطريق خالياًالنطاق 0-255. كلما زادت القيمة، زادت السرعة ولكن يصعب إيقافها في الوقت المناسب.
سرعة الدوران128 (PWM)السرعة أثناء الانعطاف يسارًا/يمينًاقم بزيادة القيمة إذا لم يُكمل الروبوت الدوران؛ وقللها على الأسطح الزلقة
مدة التشغيل500 مللي ثانيةكم من الوقت يستغرق الروبوت للدوران قبل التوقف؟قم بزيادة الزيادة لتوسيع نطاق الانعطافات؛ وقم بتقليلها لإجراء تعديلات طفيفة
مدة عكسية500 مللي ثانيةكم من الوقت يستغرق الروبوت للرجوع للخلف في طريق مسدود؟قم بزيادة القيمة إذا لم يتراجع الروبوت مسافة كافية
نطاق المسح المؤازر30°–150°نطاق المسح أثناء القيادة للأمامنطاق أوسع = كشف جانبي أفضل ولكن عمليات مسح أبطأ
خطوة فحص المؤازرة10°زيادة الزاوية لكل دورة حلقةحجم أصغر = مسح أكثر سلاسة ولكن تغطية أبطأ
تأخير مسح المؤازرة40 مللي ثانيةتوقف مؤقتًا بين خطوات المؤازرة أثناء المسحقلل السرعة لمسح أسرع؛ وزدها إذا كان المحرك يرتجف

فهم لوحة محرك أردوينو L293D

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

L293D Arduino motor shield board layout showing motor terminals, power terminals, and control pin labels
لوحة محرك L293D — أطراف المحرك (A+، A−، B+، B−)، مدخل الطاقة (Vin، GND)، ودبابيس التحكم

الميزات الرئيسية

  • أولاً، يتحكم في ما يصل إلى محركين تيار مستمر (أو محرك متدرج واحد) بشكل مستقل
  • علاوة على ذلك، فهو يتحمل تيارًا مستمرًا يصل إلى 2 أمبير لكل قناة محرك
  • بالإضافة إلى ذلك، فهو يدعم تقنية تعديل عرض النبضة (PWM) للتحكم السلس في السرعة.
  • وأخيرًا، يوفر دبابيس فرامل مخصصة للتوقف الفوري.
L293D motor shield mounted on Arduino Uno with DC motor wires connected to screw terminals
لوحة محرك L293D مثبتة على لوحة أردوينو أونو - أسلاك المحرك متصلة بأطراف التوصيل اللولبية

مرجع دبابيس لوحة حماية المحرك

وظيفةدبوس المحرك أدبوس المحرك B
اتجاه1213
السرعة (PWM)311
الفرامل98

للحصول على شرح أعمق حول محركات القيادة وكيفية عمل جسور H، راجع البرنامج التعليمي الكامل: التحكم في محركات التيار المستمر باستخدام جسر H المزدوج L298N ودرع محرك أردوينو.

استكشاف الأخطاء وإصلاحها في المشاكل الشائعة

إذا لم تتصرف سيارتك الروبوتية التي تتجنب العوائق كما هو متوقع، فقم بمعالجة هذه المشكلات الشائعة قبل افتراض وجود عيب في الأجهزة.

المشاكل الشائعة وحلولها

مشكلةالسبب المحتملحل
الروبوت لا يتحرك على الإطلاقانقطاع التيار الكهربائي، أو أسلاك مفكوكة، أو عدم تحرير الفراملأولاً، تحقق من مفتاح الطاقة، وجهد البطارية (يجب أن يكون حوالي 12 فولت)، وتأكد من توصيلات أطراف المحرك. تأكد من تحميل البرنامج بدون أخطاء.
محرك واحد فقط يعملأحد المحركات غير موصول، أو سلك مقطوعبدلاً من ذلك، قم بتبديل أسلاك المحرك العامل إلى الطرف الآخر للاختبار. تحقق من وصلات اللحام على المحرك.
يتحرك الروبوت في اتجاه واحد فقطتم تبديل أسلاك المحرك أو توصيل دبابيس التوجيه بشكل غير صحيح.ببساطة قم بتبديل السلكين الموجودين على طرف المحرك الذي يعمل في الاتجاه الخاطئ (A+ و A−، أو B+ و B−).
يعطي مستشعر الموجات فوق الصوتية قراءات غير مستقرة أو معدومة.الأسلاك غير المحكمة، أو الدبابيس الخاطئة، أو وجود جسم قريب جدًا / بعيد جدًاأولاً، تأكد من توصيلات Trig (الطرف 7) وEcho (الطرف 6). يتراوح نطاق HC-SR04 تقريبًا من 2 سم إلى 400 سم. أضف تأخيرًا بسيطًا إذا كانت القراءات متذبذبة.

مشاكل في المستشعر والاتجاه والطاقة

مشكلةالسبب المحتملحل
اهتزازات أو ارتعاشات المحرك المؤازرطاقة غير كافية، أو محرك سيرفو متصل بجهد 3.3 فولت، أو خط طاقة به ضوضاءأولاً، تأكد من توصيل مصدر طاقة المحرك المؤازر بجهد 5 فولت (وليس 3.3 فولت). ثم، أضف مكثفًا بسعة 100 ميكروفاراد عبر خطوط طاقة المحرك المؤازر لتنعيم التيار.
الروبوت ينعطف في الاتجاه الخاطئتم تبديل المحركين الأيمن والأيسربدلاً من ذلك، قم بتبديل توصيلات المحرك على اللوحة (قم بنقل أسلاك المحرك A إلى أطراف المحرك B والعكس صحيح)، أو قم بتبديل تعيينات دبابيس الاتجاه في الكود.
يتفاعل الروبوت متأخراً ويصطدم بالعوائقعتبة المسافة منخفضة للغاية، أو تأخيرات التعليمات البرمجية طويلة للغايةلذلك، قم بزيادة عتبة المسافة البعيدة (على سبيل المثال، من 40 سم إلى 50 سم) وقلل التأخيرات غير الضرورية في الحلقة.
تستنزف البطاريات بسرعة كبيرةالمحركات التي تسحب تيارًا عاليًا، أو البطاريات غير المشحونة بالكاملأولاً، استخدم بطاريات NiMH مشحونة حديثاً. ثانياً، قلل سرعة المحرك إن أمكن. تأكد من عدم وجود أي احتكاك ميكانيكي على العجلات.
تتم إعادة ضبط أردوينو عند بدء تشغيل المحركاتانخفاض الجهد الناتج عن سحب التيار من المحركبدلاً من ذلك، استخدم حزمة بطارية منفصلة أو أضف مكثفًا كبيرًا (470-1000 ميكروفاراد) عبر أطراف طاقة درع المحرك.
الروبوت يدور في دوائركلا المحركين يدوران في اتجاهين متعاكسين، أو أحد المحركين لا يدورأولاً، تحقق من تعيينات دبابيس الاتجاه، ثم اختبر كل محرك على حدة باستخدام رسم تخطيطي بسيط قبل تشغيل الكود الكامل.

الأسئلة الشائعة

ما هي السيارة الروبوتية التي تتجنب العوائق؟

باختصار، السيارة الروبوتية التي تتجنب العوائق هي مركبة صغيرة ذاتية القيادة تستخدم أجهزة استشعار (عادةً ما تكون مستشعرًا فوق صوتيًا مثل HC-SR04) لاكتشاف الأجسام في طريقها وتغير اتجاهها تلقائيًا لتجنب الاصطدامات - كل ذلك بدون تحكم بشري.

هل يمكنني استخدام أردوينو نانو أو ميجا بدلاً من أردوينو أونو؟

باختصار، صُممت لوحة محرك L293D للتوصيل مباشرةً بموصل Arduino Uno. وهي متوافقة أيضًا مع Arduino Mega، ولكنها غير متوافقة مع Arduino Nano بدون محول. مع ذلك، إذا كنت ترغب في استخدام Nano، ففكر في استخدام شريحة L293D مستقلة أو وحدة L298N بدلاً من ذلك. راجع قسمنا شرح استخدام محرك L298N لنهج بديل.

هل يمكنني استخدام وحدة تحكم المحرك L298N بدلاً من لوحة حماية المحرك L293D؟

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

كيف يقيس مستشعر الموجات فوق الصوتية HC-SR04 المسافة؟

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

لماذا يقوم المحرك المؤازر بتحريك مستشعر الموجات فوق الصوتية يمينًا ويسارًا؟

بدون محرك مؤازر، لا يستطيع المستشعر الأمامي الثابت سوى رصد العوائق الموجودة أمامه مباشرةً. في المقابل، عند تركيب المستشعر على محرك مؤازر يتحرك بزاوية تتراوح بين 30° و150°، يحصل الروبوت بالتالي على مجال رؤية أوسع بكثير، ويستطيع رصد العوائق القادمة من الجوانب قبل أن تصبح أمامه مباشرةً.

ما هو الجهد الكهربائي والبطاريات التي يجب أن أستخدمها؟

في هذا المشروع، نستخدم 8 بطاريات AA قابلة للشحن موصولة على التوالي لتوفير جهد 12 فولت تقريبًا. بالإضافة إلى ذلك، تقبل لوحة التحكم L293D جهدًا يتراوح بين 5 و12 فولت كمدخل طاقة، وتنظم الطاقة اللازمة للوحة أردوينو. كبديل، يمكنك استخدام بطارية ليثيوم بوليمر ثنائية أو ثلاثية الخلايا (7.4 - 11.1 فولت) طالما بقي الجهد ضمن النطاق المحدد للوحة التحكم.

هل أحتاج إلى حوامل مطبوعة بتقنية الطباعة ثلاثية الأبعاد؟

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

كيف يمكنني تغيير سرعة الروبوت؟

يتم التحكم في سرعة المحرك بواسطة قيمة PWM التي يتم تمريرها إلى analogWrite(). في الكود، تم ضبط سرعة السير الأمامية على 100 وسرعة الانعطاف على 128 (من أصل 255 كحد أقصى). لذا، قم بزيادة هذه القيم لزيادة السرعة، أو خفضها لحركة أبطأ وأكثر تحكمًا.

ماذا أفعل إذا استمر الروبوت في الاصطدام بالجدران؟

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

هل يمكنني إضافة المزيد من أجهزة الاستشعار إلى هذا الروبوت؟

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

المشاريع والموارد التالية الموصى بها

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

خاتمة

في الختام، لقد نجحتم في بناء سيارة روبوتية تتجنب العوائق باستخدام أردوينو، ولوحة تحكم المحرك L293D، ومحرك سيرفو، ومستشعر الموجات فوق الصوتية HC-SR04. وخلال هذه العملية، تعلمتم أيضًا كيفية توصيل محركات التيار المستمر، وتوصيل وقراءة مستشعر المسافة بالموجات فوق الصوتية، والتحكم في محرك السيرفو للمسح، وكتابة منطق الملاحة الذاتية. باختصار، يجمع هذا المشروع المهارات الأساسية في علم الروبوتات: استشعار البيئة، واتخاذ القرارات، والتحكم في المحركات.

من هنا، على سبيل المثال، يمكنك توسيع نطاق الروبوت بإضافة مستشعرات إضافية، أو إضافة تحكم لاسلكي، أو تحسين خوارزمية تجنب العوائق للبيئات الأكثر تعقيدًا. في النهاية، كل تحسين تُجريه يُقرّبك خطوةً نحو مشاريع روبوتية أكثر تقدمًا. نتمنى لك بناءً موفقًا!

رأي واحد حول “Building an Obstacle-Avoiding Robot Car with Arduino, L293D Motor Shield, Servo Motor, and Ultrasonic Sensor”

أضف تعليق