في هدا المشروع سنناقش أقصر مسار مكتشف باستخدام Arduino ومستشعر الموجات فوق الصوتية HC-SR 04. يمكنك اتباع الإجراء الخاص بنا ولصق الكود المحدد في Arduino IDE.
إنه في الأساس روبوت يستخدم الموجات فوق الصوتية (SONAR) لاكتشاف العوائق القريبة منه ووفقًا لها ، فإنه يغير مساره. من خلال القيام بذلك ، لم ينهار الروبوت ويتحرك بحرية في المساحة المتوفرة. يستخدم Arduino UNO للتحكم في التعليمات. استخدمنا وحدة تشغيل المحرك L298N وبطارية ليثيوم أيون 12 فولت لتشغيلها للتحكم في العجلات. يتم تثبيت الإعداد الكامل على الهيكل المعدني بحيث لا تتحرك الأجزاء ولا يتم إزعاج الأسلاك. هنا أنشأنا مشروعًا آخر يُعرف باسم الرادار باستخدام Arduino ومستشعر الموجات فوق الصوتية.
يستخدم الروبوت مستشعر الموجات فوق الصوتية HC-SR 04 لمسح وجهات النظر اليسرى واليمنى والأمامية. يتم تركيب المستشعر على محرك سيرفو يدور في اتجاهات مختلفة. تمت برمجة Arduino بطريقة تجعله كلما ظهرت عقبة أمام الروبوت يتوقف ويتحرك للخلف قليلاً. ثم يقوم بالبحث عن المسار الحر بين اليسار واليمين وبهذه الطريقة يستمر روبوت مكتشف المسار في الحركة. إنه يعمل مثل الروبوت الذي يتجنب العقبات قليلاً. ينقل المستشعر بالموجات فوق الصوتية الموجة فوق الصوتية من أحد طرفي جهاز الاستشعار بالموجات فوق الصوتية ومن الطرف الآخر.
المكونات المطلوبة
كود مشروع روبوت تجنب العوائق باستخدام Arduino و HC-SR04
#include <Servo.h> //Tech-hme.com
#include <NewPing.h>
//our L298N control pins
const int LeftMotorForward = 7;
const int LeftMotorBackward = 6;
const int RightMotorForward = 4;
const int RightMotorBackward = 5;
int pos=0;
//sensor pins
#define trig_pin A1 //analog input 1
#define echo_pin A2 //analog input 2
#define maximum_distance 200
boolean goesForward = false;
int distance = 100;
NewPing sonar(trig_pin, echo_pin, maximum_distance); //sensor function
Servo servo_motor; //our servo name
Servo myservo;
void setup(){
pinMode(RightMotorForward, OUTPUT);
pinMode(LeftMotorForward, OUTPUT);
pinMode(LeftMotorBackward, OUTPUT);
pinMode(RightMotorBackward, OUTPUT);
servo_motor.attach(10); //our servo pin
myservo.attach(13);
servo_motor.write(115);
delay(2000);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
}
void loop(){
int distanceRight = 0;
int distanceLeft = 0;
delay(50);
if (distance <= 20){
moveStop();
delay(300);
myservo.write(170);
delay(300);
myservo.write(50);
delay(300);
myservo.write(170);
delay(300);
myservo.write(50);
delay(300);
moveBackward();
delay(400);
moveStop();
delay(300);
distanceRight = lookRight();
delay(300);
distanceLeft = lookLeft();
delay(300);
if (distance >= distanceLeft){
turnRight();
moveStop();
}
else{
turnLeft();
moveStop();
}
}
else{
moveForward();
}
distance = readPing();
}
int lookRight(){
servo_motor.write(50);
delay(500);
int distance = readPing();
delay(100);
servo_motor.write(115);
return distance;
}
int lookLeft(){
servo_motor.write(170);
delay(500);
int distance = readPing();
delay(100);
servo_motor.write(115);
return distance;
delay(100);
}
int readPing(){
delay(70);
int cm = sonar.ping_cm();
if (cm==0){
cm=250;
}
return cm;
}
void moveStop(){
digitalWrite(RightMotorForward, LOW);
digitalWrite(LeftMotorForward, LOW);
digitalWrite(RightMotorBackward, LOW);
digitalWrite(LeftMotorBackward, LOW);
}
void moveForward(){
if(!goesForward){
goesForward=true;
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorForward, HIGH);
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(RightMotorBackward, LOW);
}
}
void moveBackward(){
goesForward=false;
digitalWrite(LeftMotorBackward, HIGH);
digitalWrite(RightMotorBackward, HIGH);
digitalWrite(LeftMotorForward, LOW);
digitalWrite(RightMotorForward, LOW);
}
void turnRight(){
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorBackward, HIGH);
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(RightMotorForward, LOW);
delay(500);
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorForward, HIGH);
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(RightMotorBackward, LOW);
}
void turnLeft(){
digitalWrite(LeftMotorBackward, HIGH);
digitalWrite(RightMotorForward, HIGH);
digitalWrite(LeftMotorForward, LOW);
digitalWrite(RightMotorBackward, LOW);
delay(500);
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorForward, HIGH);
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(RightMotorBackward, LOW);
}