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)