كود البحث

الدرس 28/31: سيارة-6 سيارة أردوينو ذاتية القيادة من صنف SunFounder باستخدام | Robojax

الدرس 28/31: سيارة-6 سيارة أردوينو ذاتية القيادة من صنف SunFounder باستخدام | Robojax

في هذا المشروع، سنقوم ببناء سيارة ذاتية القيادة أساسية باستخدام أردوينو، وحساس فوق صوتي، وحساسين للأشعة تحت الحمراء. هذا مشروع تمهيدي رائع لتعلم الملاحة الذاتية، ودمج الحساسات، ومنطق اتخاذ القرار. يمكن للسيارة التحرك للأمام والخلف، والقيام بالدوران لتجنب العوائق، وإيجاد مسار واضح بنفسها بشكل فعال. يعتمد هذا المشروع على مجموعة SunFounder 3-in-1 لأردوينو وهو جزء من دورة أردوينو الخاصة بـ Robojax.

هذا المشروع ليس مجرد بناء لعبة؛ بل هو مقدمة عملية للمفاهيم الأساسية وراء الروبوتات الذاتية. نفس المنطق والحساسات تُستخدم في تطبيقات واقعية مثل المكانس الروبوتية، والمركبات الموجهة آليًا في المستودعات، وحتى أنظمة الملاحة للروبوتات الأكثر تعقيدًا. من خلال فهم كيفية دمج استشعار المسافة مع قواعد ملاحة بسيطة، يمكنك إنشاء مجموعة متنوعة من المشاريع، مثل:

  • بناء روبوت صغير يمكنه التنقل في غرفة وتجنب الأثاث.
  • إنشاء مركبة آلية يمكنها اتباع مسار بسيط أو القيام بدوريات في منطقة ما.
  • تعلم كيفية تنفيذ خوارزميات أساسية لتجنب العوائق لمشاريع روبوتية أكبر.

مكونات الأجهزة

يستخدم هذا المشروع المكونات من مجموعة SunFounder 3-in-1. الأجزاء الأساسية هي:

  • لوحة أردوينو أونو
  • هيكل سيارة SunFounder 2WD أو 3-in-1 مع محركات
  • وحدة تشغيل المحركات (مثل L298N أو ما شابه)
  • حساس المسافة فوق الصوتي HC-SR04
  • حساسا عوائق بالأشعة تحت الحمراء
  • أسلاك توصيل ومصدر طاقة للمحركات

دليل التوصيل

التوصيل هو الخطوة الأولى الحاسمة لإحياء سيارتك ذاتية القيادة. التوصيلات مباشرة، ولكن من الضروري التحقق من كل واحد منها لتجنب إتلاف المكونات. المنطق وراء التوصيل هو ربط دبابيس التحكم في أردوينو بمشغل المحركات والحساسات، مما يسمح لأردوينو بقراءة البيانات وإرسال الأوامر.

  • دبابيس مشغل المحركات (A-1B، A-1A، B-1B، B-1A): تتحكم هذه الدبابيس في سرعة واتجاه المحركين. وهي متصلة بدبابيس أردوينو 5 و6 و9 و10، وهي قادرة على PWM، مما يسمح بالتحكم في السرعة المتغيرة.
  • الحساس فوق الصوتي (Trig و Echo): يرسل دبوس Trig نبضة فوق صوتية، ويستقبل دبوس Echo الإشارة المنعكسة. دبوس Trig متصل بدبوس أردوينو 3، ودبوس Echo متصل بدبوس أردوينو 4.
  • حساسا الأشعة تحت الحمراء (يسار ويمين): يكتشف هذان الحساسان ما إذا كان هناك عائق أمامهما مباشرة. حساس الأشعة تحت الحمراء الأيسر متصل بدبوس أردوينو 8، والحساس الأيمن متصل بالدبوس 7. يُستخدمان للتحقق من المساحة على جانبي السيارة.

للحصول على دليل بصري مفصل، يرجى الرجوع إلى مخطط التوصيل أدناه، الذي يوضح كل اتصال بوضوح.

شرح الكود

الكود مكتوب بلغة برمجة أردوينو (C++). البرنامج الكامل متاح للتحميل من صفحة الموارد المرتبطة في وصف الفيديو. دعنا نحلل الأجزاء الرئيسية القابلة للتخصيص من هذا المخطط.

تعريفات الدبابيس

في أعلى الكود، تقوم بتعريف الدبابيس التي تربط أردوينو بالمكونات المختلفة. يمكنك تغييرها إذا كنت تستخدم دبابيس مختلفة على لوحتك.

const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int echoPin = 4;
const int trigPin = 3;

const int rightIR = 7;
const int leftIR = 8;

تتحكم دبابيس A_1B وA_1A وB_1B وB_1A في مشغل محركات الجسر H. من خلال ضبط هذه الدبابيس على HIGH أو LOW في مجموعات مختلفة، يمكنك التحكم في اتجاه كل محرك. echoPin وtrigPin مخصصان للحساس فوق الصوتي، وrightIR وleftIR مخصصان لحساسي الأشعة تحت الحمراء.

متغيرات السلوك والمنطق

المنطق الأساسي للسلوك الذاتي القيادة موجود في دالة loop(). تتخذ السيارة القرارات بناءً على قراءات حساسي الأشعة تحت الحمراء والحساس فوق الصوتي. يحدد الكود مسافات محددة تؤدي إلى إجراءات مختلفة. على سبيل المثال، يتم قياس متغير distance بالسنتيمتر. المنطق هو كما يلي:

  • إذا كانت المسافة أكبر من 50 سم: المسار أمامك واضح، لذا تتحرك السيارة للأمام بسرعة 200.
  • إذا كانت المسافة بين 2 سم و10 سم: السيارة قريبة جدًا من عائق. ترجع للخلف لمدة ثانية واحدة، ثم تستدير للخلف ولليسار لمدة نصف ثانية لإيجاد مسار جديد.
  • إذا كانت المسافة بين 10 سم و50 سم: السيارة في "منطقة الحذر". تتحرك للأمام، ولكن بسرعة أبطأ تبلغ 150.

قيم العتبة هذه (50 سم و10 سم و2 سم) والسرعات (200 و150) هي المتغيرات الأساسية التي يمكنك ضبطها لتغيير سلوك سيارتك. على سبيل المثال، قد تزيد المسافة "الآمنة" إلى 60 سم إذا كانت سيارتك تتحرك بسرعة.

الدوال المخصصة

يتضمن الكود عدة دوال مخصصة للتحكم في حركات السيارة. تُستخدم هذه الدوال في جميع أنحاء الحلقة الرئيسية لجعل الكود أنظف وأسهل في الفهم.

  • moveForward(int speed): تقوم هذه الدالة بضبط دبابيس المحرك لدفع السيارة إلى الأمام. تتحكم المعلمة speed (0-255) في سرعة دوران المحركات.
  • moveBackward(int speed): مشابهة لـ moveForward، لكنها تعكس اتجاه المحرك لتحريك السيارة إلى الخلف.
  • backLeft(int speed) و backRight(int speed): تقوم هاتان الدالتان بإدارة السيارة عن طريق تشغيل محرك واحد في الاتجاه العكسي بينما يكون الآخر متوقفًا. هذا دوران محوري يساعد السيارة على تغيير الاتجاه بفعالية.
  • stopMove(): توقف هذه الدالة جميع المحركات عن طريق ضبط جميع دبابيس التحكم على LOW.
  • readSensorData(): ترسل هذه الدالة نبضة من مستشعر الموجات فوق الصوتية وتقيس الوقت الذي يستغرقه الصدى للعودة. ثم تحسب المسافة بالسنتيمتر وتعيد القيمة.

عرض المشروع المباشر

(في الفيديو عند 07:09) في العرض، توضع السيارة في بيئة تحتوي على عوائق متنوعة مثل الصناديق والجدران. يكون منطق السيارة واضحًا أثناء تنقلها. عندما يكتشف مستشعر الموجات فوق الصوتية جدارًا أو عائقًا على بعد أكثر من 50 سم، تتحرك السيارة بثقة إلى الأمام. وعندما تقترب أكثر، تتحقق المستشعرات الحمراء على الجانبين من وجود مساحة مفتوحة.

إذا تم اكتشاف عائق على اليسار، تقوم السيارة بدوران خلفي يميني لتجنبه والعكس صحيح. عندما تجد السيارة نفسها في مكان ضيق، مثل تحت طاولة (في الفيديو عند 07:49)، تستخدم وظائف الرجوع والدوران لإخراج نفسها وإيجاد مسار واضح. تقرأ السيارة بيئتها باستمرار وتتخذ القرارات، مما يوضح نظام تحكم تفاعلي لا يعتمد على مسار مخطط مسبقًا.

فصول الفيديو

  • [00:00] مقدمة إلى مشروع السيارة ذاتية القيادة
  • [00:28] حول مجموعة SunFounder 3-in-1
  • [01:32] فتح الكود ونظرة عامة
  • [02:02] شرح بنية الكود والوظائف الجديدة
  • [03:11] إعداد الدبابيس في دالة الإعداد
  • [03:28] المنطق الرئيسي لاتخاذ القرار في الحلقة
  • [05:41] عرض مباشر: السيارة أثناء العمل
  • [07:09] عرض مع العوائق وتتبع الجدران
  • [09:58] الخاتمة والأفكار النهائية

الصور

28 SunFounder Car 6 self-driving path
28 SunFounder Car 6 self-driving path
Car 7 8 28 self driving
Car 7 8 28 self driving
897-Lesson 28/31: Car-6 SunFounder self Driving Arduino car
اللغة: C++
/*
Lesson 28/31: Car-6 SunFounder self Driving Arduino car
Get this code and watch video Download and resource page https://robojax.com/RJT611
https://www.youtube.com/watch?v=IyninXUcsn0
*/
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int echoPin = 4;
const int trigPin = 3;

const int rightIR = 7;
const int leftIR = 8;

float readSensorData() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  float distance = pulseIn(echoPin, HIGH) / 58.00; //Equivalent to (340m/s*1us)/2
  return distance;
}


void moveForward(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void moveBackward(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}


void backLeft(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

void backRight(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void stopMove() {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

void setup() {
  Serial.begin(9600);

  //motor
  pinMode(A_1B, OUTPUT);
  pinMode(A_1A, OUTPUT);
  pinMode(B_1B, OUTPUT);
  pinMode(B_1A, OUTPUT);

  //ultrasonic
  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);

  //IR obstacle
  pinMode(leftIR, INPUT);
  pinMode(rightIR, INPUT);
}

void loop() {

  int left = digitalRead(leftIR);  // 0: Obstructed   1: Empty
  int right = digitalRead(rightIR);

  if (!left && right) {
    backLeft(150);
  } else if (left && !right) {
    backRight(150);
  } else if (!left && !right) {
    moveBackward(150);
  } else {
    float distance = readSensorData();
    Serial.println(distance);
    if (distance > 50) { // Safe
      moveForward(200);
    } else if (distance < 10 && distance > 2) { // Attention
      moveBackward(200);
      delay(1000);
      backLeft(150);
      delay(500);
    } else {
      moveForward(150);
    }
  }
}

الأشياء التي قد تحتاجها

ملفات📁

مكتبات أردوينو (ملف مضغوط)