Skip to Content


Obstacle-avoiding robot with servo motor and ultrasonic



-CIRCUIT DIAGRAM



driver motor l298 with arduino


Arduino with ultrasonic 


full circuit

-CODE




#include <Servo.h>  // مكتبة التحكم في Servo Motor

Servo Myservo;      // إنشاء Servo Object

// Ultrasonic Sensor Pins
#define trigPin 11   // إرسال الموجات الصوتية
#define echoPin 8    // استقبال الموجات المرتدة

// Motor A Pins
#define IN1 2       // اتجاه الموتور A
#define IN2 3       // اتجاه الموتور A
#define ENA 6       // التحكم في سرعة الموتور A (PWM)

// Motor B Pins
#define IN3 4       // اتجاه الموتور B
#define IN4 5       // اتجاه الموتور B
#define ENB 9       // التحكم في سرعة الموتور B (PWM)

// Servo Motor Pin
#define servoPin 10

// Motor Speed (0 - 255)
int motorSpeed = 150;

// Variables for Distance Measurement
int distance;       // المسافة أمام الروبوت
int leftDistance;   // المسافة ناحية الشمال
int rightDistance;  // المسافة ناحية اليمين

long duration;      // زمن رجوع الموجة الصوتية


// =====================================
// Function: Read Ultrasonic Distance
// قياس المسافة باستخدام حساس Ultrasonic
// =====================================

int readDistance() {

  // إرسال نبضة قصيرة لتجهيز الحساس
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  // إرسال نبضة Trigger لمدة 10 ميكروثانية
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // حساب زمن استقبال الموجة المرتدة
  duration = pulseIn(echoPin, HIGH, 30000);

  // لو مفيش موجة رجعت خلال المهلة
  // نعتبر مبدئيًا إن الطريق بعيد
  if (duration == 0) {
    return 400;
  }

  // تحويل زمن الموجة إلى مسافة بالسنتيمتر
  return duration / 58.2;
}


// =====================================
// Function: Stop Motors
// إيقاف الموتورين
// =====================================

void stopMotors() {

  analogWrite(ENA, 0);
  analogWrite(ENB, 0);
}


// =====================================
// Function: Move Forward
// تحريك الروبوت للأمام
// =====================================

void forward() {

  // تحديد اتجاه الموتور A
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);

  // تحديد اتجاه الموتور B
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);

  // تشغيل الموتورين بالسرعة المحددة
  analogWrite(ENA, motorSpeed);
  analogWrite(ENB, motorSpeed);
}


// =====================================
// Function: Turn Left
// دوران الروبوت ناحية الشمال
// =====================================

void turnLeft() {

  // إيقاف الموتور A
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);

  // تشغيل الموتور B للأمام
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);

  analogWrite(ENA, 0);
  analogWrite(ENB, motorSpeed);
}


// =====================================
// Function: Turn Right
// دوران الروبوت ناحية اليمين
// =====================================

void turnRight() {

  // تشغيل الموتور A للأمام
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);

  // إيقاف الموتور B
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);

  analogWrite(ENA, motorSpeed);
  analogWrite(ENB, 0);
}


// =====================================
// Setup: إعداد المكونات
// يتم تنفيذ هذا الجزء مرة واحدة
// =====================================

void setup() {

  Serial.begin(9600);  // تشغيل Serial Monitor

  // إعداد بنات الموتور A كمخارج
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(ENA, OUTPUT);

  // إعداد بنات الموتور B كمخارج
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(ENB, OUTPUT);

  // إعداد حساس Ultrasonic
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  // توصيل السيرفو بالبن رقم 10
  Myservo.attach(servoPin);

  // توجيه الحساس للأمام عند زاوية 90 درجة
  Myservo.write(90);

  delay(500);
}


// =====================================
// Loop: البرنامج الرئيسي
// يتكرر باستمرار طوال تشغيل الروبوت
// =====================================

void loop() {

  // توجيه الحساس للأمام
  Myservo.write(90);
  delay(100);

  // قياس المسافة أمام الروبوت
  distance = readDistance();

  // عرض المسافة على Serial Monitor
  Serial.print("Front: ");
  Serial.println(distance);


  // =====================================
  // Check Front Obstacle
  // فحص وجود عائق أمام الروبوت
  // =====================================

  if (distance > 15) {

    // لو المسافة أكبر من 15 سم
    // يتحرك الروبوت للأمام
    forward();

  }

  else {

    // لو المسافة 15 سم أو أقل
    // يتوقف الروبوت قبل العائق
    stopMotors();
    delay(200);


    // =====================================
    // Scan Left
    // قياس المسافة ناحية الشمال
    // =====================================

    Myservo.write(180);  // توجيه الحساس للشمال
    delay(500);          // انتظار استقرار السيرفو

    leftDistance = readDistance();

    // عرض المسافة ناحية الشمال
    Serial.print("Left: ");
    Serial.println(leftDistance);


    // =====================================
    // Scan Right
    // قياس المسافة ناحية اليمين
    // =====================================

    Myservo.write(0);    // توجيه الحساس لليمين
    delay(500);          // انتظار استقرار السيرفو

    rightDistance = readDistance();

    // عرض المسافة ناحية اليمين
    Serial.print("Right: ");
    Serial.println(rightDistance);


    // إعادة الحساس إلى الوضع الأمامي
    Myservo.write(90);
    delay(300);


    // =====================================
    // Compare Distances
    // مقارنة المسافة يمينًا وشمالًا
    // واختيار الطريق الأكثر اتساعًا
    // =====================================

    if (leftDistance > rightDistance) {

      // لو الشمال أوسع من اليمين
      // يلف الروبوت ناحية الشمال
      Serial.println("Turning Left");

      turnLeft();
      delay(450);

    }

    else {

      // لو اليمين أوسع أو المسافتان متساويتان
      // يلف الروبوت ناحية اليمين
      Serial.println("Turning Right");

      turnRight();
      delay(450);

    }


    // إيقاف الموتورات بعد انتهاء اللفة
    stopMotors();
    delay(100);

    // استكمال الحركة للأمام
    forward();

  }
}




-COMPONENTS
https://www.gravityelectronic.com/shop/electronics-projects-84/obstacle-avoidance-robot-car-4dw-using-ultrasonic-sensor-14647
1x 4WD & 2DW RC Smart Robot gravity edition- body blue

1x Arduino Uno R3 Original AT16U2 + USB Cable 30 CM

4x Robot Car Wheel Tyre (65mm)

4x DC Motor Dual Shaft 3:12VDC 600RPM

1x L298N Dual HBridge Motor Driver

3x Rechargeable Liion Battery 18650 3.7 V 1200 ma new

1x Battery Holder 3-way 18650

1x Ultrasonic Sensor HCSR04

1x Ultrasonic Sensor holder (bracket)

1x Servo Motor micro SG90 - 180°

10x Male / Male Jumper Wires (20cm)

10x Male / Female Jumper Wires (20cm)

10x Male / Female Jumper Wires (10cm)

1x ON/OFF Switch 2 Pins 17x11mm

1x Magnetic Screwdriver Flat (Free Gift)