كيف تصنع سيارة تتفادى الحواجز باستخدام Arduino وحساس الموجات فوق الصوتية؟

في الحلقة الخامسة من سلسلة Arduino من الصفر سنتعلم كيفية صناعة سيارة روبوت تتفادى العقبات باستخدام لوحة Arduino وحساس الموجات فوق الصوتية ودرع التحكم في المحركات L293D. سنبدأ بتجميع الهيكل وتركيب المحركات، ثم نتعرف على التوصيلات والبرنامج الذي يجعل السيارة تتراجع وتنعطف عندما تكتشف عائقًا أمامها.

فيديو المشروع

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

فكرة سيارة تفادي العقبات

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

المكونات المطلوبة

  • لوحة Arduino متوافقة مع درع المحركات المستخدم.
  • هيكل سيارة روبوت بأربع عجلات.
  • أربعة محركات تيار مستمر DC.
  • درع محركات L293D يحتوي على رقيقتين L293D.
  • حساس قياس المسافة بالموجات فوق الصوتية مزود بطرفي Trig وEcho.
  • لوحة تجارب صغيرة لتثبيت الحساس في مقدمة السيارة.
  • حامل بطاريات وأربع بطاريات كما في الفيديو.
  • مفتاح تشغيل، أسلاك توصيل، أربطة بلاستيكية وأدوات تجميع.

المرحلة الأولى: تجميع هيكل السيارة

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

بعد ذلك نثبت لوحة Arduino على الهيكل باستخدام رباط بلاستيكي، مع ترك مساحة مناسبة لتركيب درع L293D وتوصيل الأسلاك.

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

نستخدم حساسًا يحتوي على طرفي Trig لإرسال النبضة وEcho لاستقبال الإشارة الزمنية التي يعتمد عليها قياس المسافة. وفق التوصيلات الموضحة في الفيديو:

طرف الحساسArduinoالوظيفة
VCC5Vتغذية الحساس
GNDGNDالأرضي
TrigD2إرسال نبضة القياس
EchoD13استقبال نبضة الصدى

يتم تجهيز أسلاك الحساس قبل وضع درع المحركات فوق لوحة Arduino، كما هو موضح في الفيديو.

المرحلة الثالثة: تركيب درع المحركات L293D

درع L293D Motor Shield يركب فوق Arduino ويحتوي على رقيقتين L293D. يسمح هذا النوع من الدروع بالتحكم في أربعة محركات تيار مستمر أو محركين خطويين، كما يتيح توصيل مصدر طاقة خارجي للمحركات. يذكر الفيديو أيضًا إمكانية التحكم في محركي Servo، لكننا لا نستخدمهما في هذا المشروع.

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

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

كيف يقيس الحساس المسافة؟

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

المسافة = (زمن الصدى × سرعة الصوت) ÷ 2

في الظروف المعتادة يمكن استعمال سرعة صوت تقريبية مقدارها 0.0343 سنتيمتر لكل ميكروثانية عند حساب المسافة بالسنتيمتر.

برمجة سيارة تفادي العقبات

يبدأ البرنامج باستدعاء مكتبة التحكم في المحركات، ثم تعريف طرفي الحساس والمحركات الأربعة وسرعة دورانها. داخل setup() تتم تهيئة الاتصال التسلسلي وتحديد اتجاه المنافذ وضبط سرعة المحركات.

منطق الحركة داخل loop()

الحالةأمر السيارة
المسافة 25 سم أو أكثرالتقدم إلى الأمام
المسافة أقل من 25 سمالرجوع إلى الوراء لمدة 500 ميلي ثانية
بعد الرجوعالتوقف لمدة 200 ميلي ثانية
بعد التوقفالدوران إلى اليمين لمدة 1000 ميلي ثانية

يستعمل البرنامج دوال مستقلة للحركة: التقدم، التوقف، الرجوع إلى الخلف، والدوران إلى اليمين. وفي الدالة المسؤولة عن الدوران إلى اليمين، يذكر الفيديو أن المحركين 1 و3 يتحركان إلى الأمام، بينما يتحرك المحركان 2 و4 إلى الخلف.

الكود الكامل للمشروع

#include <AFMotor.h>

// =======================================
// Capteur ultrasonique HC-SR04
// =======================================
#define trigPin 2
#define echoPin 13

// =======================================
// Déclaration des quatre moteurs
// Motor Shield L293D V1
// =======================================
AF_DCMotor motor1(1, MOTOR12_64KHZ);
AF_DCMotor motor2(2, MOTOR12_64KHZ);
AF_DCMotor motor3(3, MOTOR34_64KHZ);
AF_DCMotor motor4(4, MOTOR34_64KHZ);

// Vitesse des moteurs : de 0 à 255
#define MAX_SPEED 200

// Durée de l'écho et distance en cm
unsigned long duration;
float distance;

void setup() {

  // Initialisation de la communication série
  Serial.begin(9600);

  // Configuration des broches du HC-SR04
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  digitalWrite(trigPin, LOW);

  // Configuration de la vitesse des moteurs
  motor1.setSpeed(MAX_SPEED);
  motor2.setSpeed(MAX_SPEED);
  motor3.setSpeed(MAX_SPEED);
  motor4.setSpeed(MAX_SPEED);

  // Voiture arrêtée au démarrage
  moveStop();
}

void loop() {

  // =====================================
  // 1. Déclencher la mesure ultrasonique
  // =====================================

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);

  digitalWrite(trigPin, LOW);

  // Mesurer la durée de l'écho
  // Timeout de 30 000 microsecondes
  duration = pulseIn(echoPin, HIGH, 30000);

  // Si aucun écho n'est reçu
  if (duration == 0) {
    Serial.println("No echo received!");
    moveStop();
    delay(100);
    return;
  }

  // Calcul de la distance en centimètres
  // Vitesse du son : 0.0343 cm/us
  // Division par 2 : aller-retour du son
  distance = (duration / 2.0) * 0.0343;

  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");

  // =====================================
  // 2. Vérifier la présence d'un obstacle
  // =====================================

  if (distance < 25) {

    Serial.println("Obstacle detected!");

    // Reculer pendant 0.5 seconde
    Serial.println("Move backward during half second!");

    delay(100);
    moveBackward();
    delay(500);

    // Arrêter la voiture pendant 0.2 seconde
    Serial.println("Release movement!");

    moveStop();
    delay(200);

    // Tourner à droite pendant 1 seconde
    Serial.println("Turn right during 1 second!");

    turnRight();
    delay(1000);

  } else {

    // Aucun obstacle :
    // continuer à avancer
    Serial.println("No obstacle detected. Move forward.");

    delay(15);
    moveForward();
  }
}

// =======================================
// 3. Fonctions de contrôle des moteurs
// =======================================

// Faire avancer les quatre moteurs
void moveForward() {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
}

// Faire reculer les quatre moteurs
void moveBackward() {
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
}

// Tourner à droite
// Moteurs 1 et 3 : marche avant
// Moteurs 2 et 4 : marche arrière
void turnRight() {
  motor1.run(FORWARD);
  motor3.run(FORWARD);

  motor2.run(BACKWARD);
  motor4.run(BACKWARD);
}

// Arrêter tous les moteurs
void moveStop() {
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);
}

تثبيت مكتبة التحكم في المحركات

من داخل Arduino IDE نفتح مدير المكتبات، ونبحث عن مكتبة التحكم في المحركات الملائمة لإصدار درع L293D المستخدم. يوضح الفيديو البحث بكلمة Motor ثم تثبيت المكتبة. يجب اختيار المكتبة المتوافقة مع الكود والدرع الفعليين؛ فهناك أكثر من مكتبة تحمل أسماء متقاربة.

اختبار السيارة

بعد رفع البرنامج، نضع السيارة على سطح مناسب ونشغلها مع مراقبة حركتها. عندما تقترب من عائق ضمن مسافة أقل من 25 سم، ينبغي أن تتراجع ثم تتوقف قليلًا وتنعطف يمينًا، كما يظهر في التجربة النهائية بالفيديو.

نصيحة للاختبار: ارفع العجلات عن الأرض أثناء الاختبار الأول للتأكد من اتجاه دوران المحركات، ثم اختبر السيارة في مساحة خالية بعيدًا عن الحواف والسلالم.

مشكلات شائعة وحلول مقترحة

المشكلةما يجب فحصه
الحساس لا يعطي مسافة صحيحةتوصيل Trig إلى D2 وEcho إلى D13، والتغذية والأرضي
السيارة لا تتحركالبطاريات ومفتاح التشغيل وتوصيلات المحركات والدرع
السيارة تتحرك بعكس الاتجاهقطبية توصيل المحركات واتجاهاتها في البرنامج
الدوران لا يتم كما في الفيديوترتيب المحركات 1 و2 و3 و4 واتجاه كل محرك
خطأ عند ترجمة البرنامجتثبيت مكتبة المحركات المتوافقة مع الكود والدرع

ماذا تعلمنا في هذا المشروع؟

  • تجميع هيكل سيارة روبوت بأربع عجلات.
  • تركيب حساس الموجات فوق الصوتية في مقدمة السيارة.
  • توصيل الحساس إلى Arduino عبر D2 وD13.
  • استخدام درع L293D للتحكم في أربعة محركات.
  • قراءة المسافة واتخاذ قرار الحركة وفق حد 25 سم.
  • تنفيذ تسلسل الرجوع والتوقف والدوران لتفادي العائق.

أفكار لتطوير المشروع

بعد نجاح التجربة يمكن تطوير البرنامج ليختار اتجاه الانعطاف حسب المساحة المتاحة، أو إضافة حساس آخر لتوسيع مجال الرؤية، أو تعديل سرعة المحركات بحسب المسافة. هذه أفكار إضافية للتطوير وليست أجزاء منفذة في الفيديو.

الخلاصة

صنعنا في هذه الحلقة سيارة روبوت تستخدم Arduino وحساس الموجات فوق الصوتية ودرع L293D لتفادي العقبات. جمع المشروع بين التجميع الميكانيكي والتوصيلات الإلكترونية والبرمجة الشرطية للتحكم في حركة المحركات. تابعوا بقية دروس Arduino من الصفر على قناة نادي تك – نادي الابتكار.

موضوعات ذات صلة