Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Arduino
150 min
Share

بناء روبوت ذكى ذاتى القيادة يتجنب الحواجز

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

Project Video

Overview

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

Getting the Items

Arduino Uno R3 (Voltaat Version)
Get Item
Ultrasonic Sensor (HC-SR04)
Get Item
SG90 Servo -Positional Rotation
Get Item
2Amp 7V-30V L298N Motor Driver / Stepper Driver (2 Channels)
Get Item
4 Wheel Arduino Car Kit
Get Item
Half-size Breadboard
Get Item
3×18650 Battery Holder
Get Item
Lithium ion 3.7 V 3800mah rechargeable battery – 18650
Get Item
Jumper Wires - Male to Male (40 Pack)
Get Item
Jumper Wires – Male to Female (40 Pack)
Get Item

Steps

فى البداية, قم بتجميع السيارة ذات الاربع عجلات, يمكنك رؤية كيفية تجميعها من خلال الفيديو التالى :

Wiring it Up

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

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

التوصيلات من قائد المحركاتL298N  الى لوحة التجارب :

•  منفذ ال 5 فولت من قائد المحركات ← المنافذ الموجبة بلوحة التجارب

•  منفذ الجراوند من قائد المحركات ← المنافذ السالبة بلوحة التجارب

التوصيلات من الاردوينو الى لوحة التجارب :

•  منفذ ال 5 فولت ← المنافذ الموجبة بلوحة التجارب

•  منفذ الجراوند ← المنافذ السالبة بلوحة التجارب

التوصيلات من  حساس الموجات فوق الصوتية   :

•  منفذ ال VCC  للحساس ← المنافذ الموجبة بلوحة التجارب

•  منفذ ال GND للحساس ←المنافذ السالبة بلوحة التجارب

•  منفذ ال  TRIG← منفذ رقم  10فى لوحةالاردوينو

•  منفذ ال Echo ← منفذ رقم 11فى لوحة الاردوينو

التوصيلات من محرك السيرفو :

•  المنفذ الموجب لمحرك السيرفو ← المنافذ الموجبة بلوحة التجارب

•  المنفذ السالب لمحرك السيرفو ← المنافذ السالبة بلوحة التجارب

•  منفذ الاشارة لمحرك السيرفو ← منفذ رقم  12فى لوحةالاردوينو

التوصيلات من قائد المحركات :

• المنفذ ENA ← المنفذ رقم 3 فى لوحة الاردوينو

• المنفذ IN1 ← المنفذ رقم 4 فى لوحة الاردوينو

• المنفذ IN2 ← المنفذ رقم 2 فى لوحة الاردوينو

• المنفذ IN3 ← المنفذ رقم 1 فى لوحة الاردوينو

• المنفذ IN4 ← المنفذ رقم 0 فى لوحة الاردوينو

• المنفذ ENB ← المنفذ رقم 5 فى لوحة الاردوينو

التوصيلات من المحركات اليمنى:

• احد اطراف المحرك الأول الأيمن ← احد اطراف المحرك الثانى الأيمن  ← المنفذ OUT1 فى قائد المحركات

• الطرف الاخر للمحرك الأول الأيمن ← الطرف الاخر للمحرك الثانى الأيمن ← المنفذ OUT2 فى قائد المحركات

التوصيلات من المحركات اليسرى:

• احد اطراف المحرك الأول الأيسر ← احد اطراف المحرك الثانى الأيسر  ← المنفذ OUT3 فى قائد المحركات

• الطرف الاخر للمحرك الأول الأيسر ← الطرف الاخر للمحرك الثانى الأيسر ← المنفذ OUT4 فى قائد المحركات

التوصيلات من البطارية الى قائد المحركات :

• الطرف الموجب للبطارية  ← منفذ ال+12 بقائد المحركات

• الطرف الجراوند البطارية ← منفذ الجراوند بقائد المحركات

Coding

/*

Voltaat learn (https://www.voltaat.com)

The function of this code is to make the robot avoid obstacles in front of it. When an obstacle

is detected within 30 cm, the robot measures the distance to its right and left using an

ultrasonic sensor mounted on a servo motor. The robot then moves in the direction where

no obstacles are found.

Connections from the Arduino to the breadboard:

• Arduino 5v pin → breadboard 5v line

• Arduino GND pin → breadboard GND line

The connections from the L298N motor driver to the breadboard:

• 5V pin from the motor driver → breadboard 5v line

• GND pin from the motor driver → breadboard GND line

Connections from the servo motor:

• Servo GND pin → Arduino GND pin

• Servo VCC pin → Arduino VCC pin

• Servo signal pin → Arduino pin 12

Connections from the ultrasonic sensor:

• ultrasonic sensor VCC pin → Breadboard 5V line

• ultrasonic sensor GND pin → Breadboard ground line

• ultrasonic sensor Trig pin → Arduino pin 10

• ultrasonic sensor Echo pin → Arduino pin 11

Connections from the l298n motor driver :

• ENABLE A pin → Arduino pin 3

• Input1 pin → Arduino pin 4

• Input2 pin → Arduino pin 2

• Input3 pin → Arduino pin 1

• Input4 pin → Arduino pin 0

• ENABLE B pin → Arduino pin 5

The connections from the right motors:

• One terminal of the first right motor → One terminal of the second right motor → OUT1 port in the motor driver

• The other terminal of the first right motor → The other terminal of the second right motor → OUT2 port in the motor driver

The connections from the left motors:

• One terminal of the first left motor → One terminal of the second left motor → OUT3 port in the motor driver

• The other terminal of the first left motor → The other terminal of the second left motor → OUT4 port in the motor driver

The connections from the battery input to the motor driver:

• Positive terminal of the battery input → +12V port on the motor driver

• Ground terminal of the battery input → Ground (GND) port on the motor driver

*/

#include <Servo.h>         // Include library to control the servo motor

#include <NewPing.h>        // Include library to interface with the ultrasonic sensor

// Pin definitions

#define SERVO_PIN 12                // Pin connected to the servo motor

#define ULTRASONIC_SENSOR_TRIG 10    // Pin for the ultrasonic sensor trigger

#define ULTRASONIC_SENSOR_ECHO 11    // Pin for the ultrasonic sensor echo

#define MAX_REGULAR_MOTOR_SPEED 75   // Maximum speed for regular motor movement

#define MAX_MOTOR_ADJUST_SPEED 150   // Maximum speed when adjusting motor direction

#define DISTANCE_TO_CHECK 40         // Distance threshold (cm) to trigger object detection

// Right motor pin assignments

int enableRightMotor = 5;            // Pin to control the speed of the right motor

int rightMotorPin1 = 1;              // Pin 1 for controlling right motor direction

int rightMotorPin2 = 0;              // Pin 2 for controlling right motor direction

// Left motor pin assignments

int enableLeftMotor = 3;             // Pin to control the speed of the left motor

int leftMotorPin1 = 2;               // Pin 1 for controlling left motor direction

int leftMotorPin2 = 4;               // Pin 2 for controlling left motor direction

// Initialize ultrasonic sensor with trigger and echo pins, and a max distance of 400 cm

NewPing mySensor(ULTRASONIC_SENSOR_TRIG, ULTRASONIC_SENSOR_ECHO, 400);

Servo myServo;  // Create a servo object

void setup() {

  // Configure motor control pins as output

  pinMode(enableRightMotor, OUTPUT);

  pinMode(rightMotorPin1, OUTPUT);

  pinMode(rightMotorPin2, OUTPUT);

 

  pinMode(enableLeftMotor, OUTPUT);

  pinMode(leftMotorPin1, OUTPUT);

  pinMode(leftMotorPin2, OUTPUT);

  // Attach the servo to its designated pin and set its position to center (90 degrees)

  myServo.attach(SERVO_PIN);

  myServo.write(90);

  // Stop both motors initially

  rotateMotor(0, 0);  

}

void loop() {

  // Measure the distance to an object using the ultrasonic sensor (in cm)

  int distance = mySensor.ping_cm();

  // If an object is detected within 40 cm, adjust motor movement

  if (distance > 0 && distance < DISTANCE_TO_CHECK) {

    // Stop motors to avoid collision

    rotateMotor(0, 0);

    delay(500);  

   

    // Reverse motors to back away from the object

    rotateMotor(-MAX_MOTOR_ADJUST_SPEED, -MAX_MOTOR_ADJUST_SPEED);        

    delay(200);

   

    // Stop motors again after reversing

    rotateMotor(0, 0);

    delay(500);

   

    // Rotate servo to the left (180 degrees) to check distance on the left side

    myServo.write(180);

    delay(500);

    int distanceLeft = mySensor.ping_cm();    // Read distance from left side

   

    // Rotate servo to the right (0 degrees) to check distance on the right side

    myServo.write(0);    

    delay(500);    

    int distanceRight = mySensor.ping_cm();   // Read distance from right side

    // Return servo to center (90 degrees)

    myServo.write(90);

    delay(500);        

   

    // Adjust motor direction based on left and right side distances

    if (distanceLeft == 0) {

      // If no distance is measured on the left, rotate right

      rotateMotor(MAX_MOTOR_ADJUST_SPEED, -MAX_MOTOR_ADJUST_SPEED);

      delay(200);

    }

    else if (distanceRight == 0) {

      // If no distance is measured on the right, rotate left

      rotateMotor(-MAX_MOTOR_ADJUST_SPEED, MAX_MOTOR_ADJUST_SPEED);

      delay(200);

    }

    else if (distanceLeft >= distanceRight) {

      // If left side has more space or is equal, rotate right

      rotateMotor(MAX_MOTOR_ADJUST_SPEED, -MAX_MOTOR_ADJUST_SPEED);

      delay(200);

    }

    else {

      // If right side has more space, rotate left

      rotateMotor(-MAX_MOTOR_ADJUST_SPEED, MAX_MOTOR_ADJUST_SPEED);

      delay(200);      

    }

    // Stop motors after adjustment

    rotateMotor(0, 0);    

    delay(200);    

  }

  else {

    // If no object is detected within the threshold, continue moving forward

    rotateMotor(MAX_REGULAR_MOTOR_SPEED, MAX_REGULAR_MOTOR_SPEED);

  }

}

// Function to rotate motors at specified speeds

// Positive speed values make the motor move forward, negative values make it move backward

void rotateMotor(int rightMotorSpeed, int leftMotorSpeed) {

  // Control the right motor direction based on the speed sign

  if (rightMotorSpeed < 0) {

    digitalWrite(rightMotorPin1, LOW);

    digitalWrite(rightMotorPin2, HIGH);    

  }

  else if (rightMotorSpeed >= 0) {

    digitalWrite(rightMotorPin1, HIGH);

    digitalWrite(rightMotorPin2, LOW);      

  }

  // Control the left motor direction based on the speed sign

  if (leftMotorSpeed < 0) {

    digitalWrite(leftMotorPin1, LOW);

    digitalWrite(leftMotorPin2, HIGH);    

  }

  else if (leftMotorSpeed >= 0) {

    digitalWrite(leftMotorPin1, HIGH);

    digitalWrite(leftMotorPin2, LOW);      

  }

  // Set the speed of the motors using PWM (Pulse Width Modulation)

  analogWrite(enableRightMotor, abs(rightMotorSpeed));

  analogWrite(enableLeftMotor, abs(leftMotorSpeed));    

}

Testing it Out

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

Resources

No items found.