You are currently viewing Building an Obstacle-Avoiding Robot Car with Arduino, L293D Motor Shield, Servo Motor, and Ultrasonic Sensor
An Arduino-based robot car equipped with a servo motor and ultrasonic sensor.

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

في هذا الدليل، سنقوم ببناء سيارة تتجنب العوائق باستخدام أردوينو. يتضمن هذا المشروع استخدام درع محرك 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 هو مشروع ممتاز لفهم التحكم في المحركات ومحركات السيرفو ودمج المستشعرات. يمكن توسيع هذا المشروع بإضافة المزيد من المستشعرات أو بتمديد خوارزمية تجنب العقبات لتحقيق تنقل أكثر تعقيدًا. باتباع هذه الخطوات واستخدام الكود المقدم، يمكنك بنجاح إنشاء سيارة روبوت قادرة على التنقل في بيئتها وتجنب العقبات.

omartronics

مرحبًا بكم في OmArTronics، مركز عشاق التكنولوجيا والعقول المبدعة! اسمي عمر، مؤسس هذا الموقع الإلكتروني وقناة اليوتيوب، وأنا مهندس شغوف ذو خلفية في الهندسة الكهربائية والميكانيكية، وأتابع حاليًا دراسة الماجستير في الميكاترونيكس في ألمانيا.

اترك تعليقاً