بناء سيارة روبوتية متقدمة ذاتية التحكم يتم التحكم فيها عن طريق البلوتوث باستخدام Arduino Mega وأجهزة الاستشعار بالموجات فوق الصوتية وAdafruit Motor Shield

ملخص سريع

قم ببناء مشروع Arduino Mega لسيارة روبوت مستقلة متقدمة يتجنب العوائق من تلقاء نفسه باستخدام أربعة أجهزة استشعار بالموجات فوق الصوتية HC-SR04 ويمكنك التوجيه من هاتفك عبر البلوتوث. يستخدم هذا المشروع Arduino Mega وAdafruit Motor Shield، مع هيكل مطبوع ثلاثي الأبعاد، والقدرة على التبديل بين التحكم الذاتي واليدوي.

في هذا البرنامج التعليمي، ستقوم بإنشاء مشروع Arduino Mega لسيارة روبوتية متقدمة ومستقلة يمكنها القيام بأمرين: قيادة نفسها حول العوائق باستخدام أجهزة استشعار بالموجات فوق الصوتية، والاستجابة لأوامر Bluetooth من هاتفك. يستخدم جانب الأجهزة وحدة Bluetooth HC-05 وأربعة أجهزة استشعار بالموجات فوق الصوتية HC-SR04 ودرع Adafruit Motor Shield. من ناحية البرنامج، ستكتب رسمًا تخطيطيًا لـ Arduino وتنشئ تطبيقًا للتحكم في Android باستخدام MIT App Inventor. سأرشدك عبر مجموعة الهيكل والأسلاك والتعليمات البرمجية والتطبيق.

هذا المشروع هو امتداد لبرنامجنا التعليمي السابق بناء سيارة روبوت يتم التحكم فيها عن طريق البلوتوث باستخدام Arduino وHC-05 ودرع محرك Adafruit. ويضيف نظام ملاحة مستقل باستخدام أربعة أجهزة استشعار بالموجات فوق الصوتية للكشف عن العوائق في الاتجاهات الأربعة. لمعرفة المزيد عن التحكم في محرك التيار المستمر باستخدام درع المحرك، راجع موقعنا L298N Motor Driver ودليل Arduino Motor Shield، وللتعرف على أساسيات أجهزة الاستشعار بالموجات فوق الصوتية، تحقق من موقعنا شرح اردوينو لمستشعر المسافة بالموجات فوق الصوتية.

Completed advanced autonomous robot car with Arduino Mega, four ultrasonic sensors, HC-05 Bluetooth module, and Adafruit Motor Shield mounted on a custom Plexiglas chassis

ماذا سوف تتعلم

بنهاية هذا البرنامج التعليمي، ستعرف كيفية:

  • اجمع بين التحكم اليدوي عبر Bluetooth وتجنب العوائق بشكل مستقل في رسم Arduino واحد
  • استخدم أربعة أجهزة استشعار بالموجات فوق الصوتية HC-SR04 لاكتشاف العوائق الموجودة على جميع جوانب الروبوت
  • قم بقيادة أربعة محركات تعمل بالتيار المستمر من خلال Adafruit Motor Shield V1 للتوجيه التفاضلي
  • اقرأ أوامر البلوتوث وبيانات المستشعر على Arduino Mega للتحكم في الحركة
  • أنشئ تطبيق Android مخصصًا في MIT App Inventor والذي يقوم بالتبديل بين الوضعين اليدوي والمستقل
  • قم باختبار الروبوت وضبطه واستكشاف أخطائه وإصلاحها حتى يعمل بشكل موثوق

كيف يعمل الروبوت

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

أردوينو ميجا هي وحدة التحكم الرئيسية. يقوم بتشغيل حلقة التحكم، ويقرأ بيانات المستشعر، ويعالج أوامر البلوتوث، ويرسل إشارات إلى المحركات. نحن نستخدم Mega (بدلاً من Uno) لأنه يحتوي على دبابيس رقمية إضافية (الجهات 22-29 لأجهزة الاستشعار الأربعة بالموجات فوق الصوتية) ومنفذ تسلسلي للأجهزة على الأطراف 0/1 لـ HC-05.

تدفق الاتصالات والتحكم

وحدة البلوتوث HC-05 يتم توصيله بالمنفذ التسلسلي لجهاز Arduino Mega (TX على السن 1، RX على السن 0) ويتلقى أوامر ذات حرف واحد من تطبيق Android. الأوامر هي: F (للأمام)، وB (للخلف)، وL (يسار)، وR (يمين)، وS (توقف)، وA (الوضع المستقل).

ادافروت موتور شيلد V1 يقع أعلى Arduino Mega ويستخدم برامج التشغيل الخاصة به للتحكم في ما يصل إلى أربعة محركات DC. المحركات M1/M2 تقود العجلات اليسرى، وM3/M4 تقود العجلات اليمنى. يتعامل الدرع أيضًا مع إشارات المحرك ذات التيار العالي حتى لا يتم تحميل منافذ Arduino بشكل زائد. لإلقاء نظرة أعمق على استخدام درع المحرك، راجع موقعنا تعليم قيادة السيارات.

أربعة أجهزة استشعار بالموجات فوق الصوتية HC-SR04 الجلوس على الجزء الأمامي والخلفي واليسار واليمين من الهيكل. يقوم كل مستشعر بقياس المسافة إلى أقرب عائق عن طريق إرسال نبضة فوق صوتية وتوقيت عودة الصدى. في الوضع المستقل، يقرأ Arduino جميع المستشعرات الأربعة ويقرر ما إذا كان يجب المضي قدمًا أو الدوران أو الرجوع للخلف. تعرف على المزيد حول كيفية عمل أجهزة الاستشعار بالموجات فوق الصوتية في موقعنا البرنامج التعليمي HC-SR04.

أوضاع التشغيل

وضع البلوتوث اليدوي: عندما يضغط المستخدم على زر الاتجاه في تطبيق Android، يرسل التطبيق أمر حرف عبر البلوتوث. يقرأ Arduino الأمر ويدير المحركات وفقًا لذلك. يؤدي تحرير الزر إلى إرسال S (توقف).

الوضع المستقل: عندما يقوم المستخدم بتبديل مفتاح الوضع إلى الحكم الذاتي، يرسل التطبيق A. ثم يدخل Arduino في حلقة مستمرة تقرأ جميع المستشعرات الأربعة. إذا لم يكن هناك أي شيء على مسافة 20 سم أمامه، فإن الروبوت يتحرك للأمام بسرعة تتناسب مع المسافة الأمامية. عندما يكون المسار الأمامي مسدودًا، فإنه يقارن بين المسافات اليسرى واليمنى ويتجه نحو أي جانب لديه مساحة أكبر. إذا كان كلا الجانبين مسدودين أيضًا، فإنه ينعكس أثناء المسح بحثًا عن فتحة. يخرج أي أمر يدوي عبر Bluetooth من الوضع المستقل على الفور.

المكونات اللازمة للسيارة الآلية Arduino Mega

هنا قائمة الأجزاء الكاملة. اجمع كل شيء قبل البدء في البناء.

المكوّنالكميةمطلوبالغرضالملاحظات
أردوينو ميجا 25601نعموحدة التحكم الرئيسية - تقوم بتشغيل الرسم وقراءة أجهزة الاستشعارهناك حاجة إلى ميجا للدبابيس الرقمية الإضافية (22-29) والجهاز التسلسلي
درع المحرك Adafruit Motor Shield V1.21نعميقوم بتشغيل أربعة محركات تعمل بالتيار المستمر عبر أطراف التوصيل M1 – M4يتم تكديسها مباشرة على رؤوس Arduino Mega
وحدة البلوتوث HC-051نعمالاتصال اللاسلكي مع تطبيق Androidيتصل بالمسلسل (دبابيس 0/1)؛ رقم التعريف الشخصي الافتراضي للاقتران هو 1234
جهاز الاستشعار بالموجات فوق الصوتية HC-SR044نعمكشف العوائق الأمامية والخلفية واليسار واليمينيتطلب دبابيس لكل منهما (Trig + Echo)
محرك DC مع علبة التروس4نعميقود العجلات الأربعمحركات DC القياسية ذات تروس 3-6 فولت
ورقة زجاج شبكي1نعملوحة قاعدة الهيكلقطع إلى الأبعاد المطلوبة
إطار مطبوع ثلاثي الأبعاد، وحوامل المحرك، وحامل Arduino1 مجموعةنعميؤمن المحركات واردوينو للهيكلمصممة خصيصًا أو مقتبسة من ملفات STL
أسلاك التوصيلمتنوعنعمجميع اتصالات الإشارة والطاقةأنواع M/M وM/F
حزمة البطارية1نعممحركات القوى واردوينويوصى بـ 6-12 فولت؛ استخدم محطات طاقة درع المحرك
الهاتف الذكي1نعميقوم بتشغيل تطبيق التحكم MIT App Inventorجهاز أندرويد مزود بتقنية البلوتوث
العجلات4نعميتم توصيله بأعمدة محرك علبة التروسعجلات سيارة روبوت قياسية مقاس 65 ملم
مسامير، صواميل، مواجهاتمتنوعنعمالتجميع الميكانيكييوصى باستخدام أجهزة M3

الخطوة 1: بناء الهيكل للسيارة الروبوتية الخاصة بك

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

  1. قطع زجاجي زجاجي زجاجي: أولاً، قم بقياس وقص لوح زجاج شبكي حسب الأبعاد المطلوبة للهيكل.
  2. طباعة ثلاثية الأبعاد للإطار وحوامل المحرك: قم بتصميم وطباعة الإطار وحوامل المحرك التي تثبت محركات التيار المستمر الأربعة بالهيكل. ضع الحوامل بحيث تكون المحركات متناظرة على كلا الجانبين.
  3. طباعة ثلاثية الأبعاد لحامل الاردوينو: تصميم وطباعة حامل للاردوينو ميجا. اترك مساحة كافية لدرع المحرك الموجود في الأعلى.

الخطوة 2: تركيب المحركات

بعد ذلك، قم بتركيب محركات التيار المستمر الأربعة التي ستقود سيارة الروبوت.

  1. قم بتوصيل المحركات: استخدم البراغي والصواميل لتثبيت كل محرك DC على حامل المحرك المطبوع ثلاثي الأبعاد.
  2. قم بتركيب المحركات على الهيكل: قم بتوصيل حوامل المحرك بهيكل زجاجي باستخدام البراغي والصواميل. تأكد من محاذاة الزوج الأيسر (M1، M2) والزوج الأيمن (M3، M4) للقيادة المستقيمة.

الخطوة 3: تركيب Arduino Mega ودرع المحرك

بعد تركيب المحركات، قم بتثبيت Arduino Mega وAdafruit Motor Shield على الهيكل.

  1. وصِّل حامل الأردوينو: قم بتثبيت حامل Arduino المطبوع ثلاثي الأبعاد بالهيكل باستخدام البراغي.
  2. تركيب اردوينو ميجا: ثم ضع Arduino Mega في الحامل وقم بتثبيته بالمسامير. يحتوي Mega على المسامير الرقمية الإضافية التي نحتاجها لأربعة أجهزة استشعار بالموجات فوق الصوتية.
  3. قم بتوصيل درع المحرك: أخيرًا، ضع Adafruit Motor Shield على Arduino Mega، مع التأكد من محاذاة جميع منافذ الرأس بشكل صحيح. اضغط لأسفل بقوة ولكن بعناية.

الخطوة 4: توصيل المكونات

بعد تجميع الأجهزة، حان الوقت لتوصيل كل شيء. اتبع الجداول أدناه بعناية. إذا كنت جديدًا على وحدات البلوتوث، فلدينا البرنامج التعليمي الكامل لوحدة البلوتوث HC-05/HC-06 يغطي الأساسيات بالتفصيل.

اتصالات المحرك

المحركطرف توصيل درع المحركجانب
المحرك الأمامي الأيسرM1غادر
المحرك الخلفي الأيسرM2غادر
المحرك الأمامي الأيمنM3يمين
المحرك الخلفي الأيمنM4يمين

اتصالات وحدة بلوتوث HC-05

دبوس HC-05اردوينو ميجا دبوسالملاحظات
VCC5 Vمصدر الطاقة للوحدة
GNDGNDأرضية مشتركة
TXDآر إكس (دبوس 0)إرسال HC-05 → استقبال اردوينو
RXDتكساس (دبوس 1)إرسال اردوينو → استقبال HC-05

ملاحظة هامة حول الدبابيس التسلسلية 0/1: لأن HC-05 متصل بالمسلسل التسلسلي لأجهزة Arduino Mega (الدبابيس 0 و 1). أنت بحاجة إلى ذلك افصل أسلاك HC-05 TX/RX قبل تحميل رسم جديد، لأن اتصال USB يستخدم أيضا المسلسل على ميجا. بمجرد انتهاء التحميل، أعد توصيل الأسلاك. بدلا من ذلك، يمكنك استخدام Serial1 (دبابيس 18/19) على ميجا والتغيير Serial.begin() to المسلسل 1. البدء () في التعليمات البرمجية لتجنب هذا التعارض.

اتصالات أجهزة الاستشعار بالموجات فوق الصوتية

الاستشعارموضعدبوس المثلثاتصدى دبوس
الاستشعار_Fأمامدبوس 23دبوس 22
الاستشعار_بخلفدبوس 25دبوس 24
الاستشعار_Lغادردبوس 27دبوس 26
الاستشعار_Rيميندبوس 29دبوس 28

يحتاج كل مستشعر HC-SR04 أيضًا إلى اتصال VCC (5 فولت) وGND. لمعرفة المزيد حول كيفية عمل قياس المسافة بالموجات فوق الصوتية، راجع موقعنا مستشعر المسافة بالموجات فوق الصوتية لاردوينو: البرنامج التعليمي HC-SR04.

اتصالات الطاقة

قم بتوصيل الأطراف الموجبة والسالبة لحزمة البطارية بمدخل الطاقة الموجود على Adafruit Motor Shield. يحتوي الدرع على مدخلات الطاقة الخاصة به للمحركات. تأكد من توصيل الأرضية المشتركة بين البطارية ودرع المحرك واردوينو بشكل صحيح. تعمل حزمة بطارية 6-12 فولت مُقدرة بـ 1-2 أمبير على الأقل بشكل جيد هنا، نظرًا لأنك تقوم بتشغيل أربعة محركات في وقت واحد.

Wiring diagram for the advanced autonomous robot car showing Arduino Mega, Adafruit Motor Shield, four ultrasonic sensors, HC-05 Bluetooth module, and DC motor connections

الخطوة 5: برمجة الاردوينو للتحكم الذاتي والبلوتوث

الآن بالنسبة للرمز. يتعامل رسم Arduino لمشروع Arduino Mega للسيارة الروبوتية المتقدمة المستقلة مع أوامر Bluetooth اليدوية وتجنب العوائق بشكل مستقل. إذا كنت جديدًا في برمجة Arduino، فابدأ بـ أساسيات برمجة الأردوينو: الدليل الكامل للمبتدئين قبل الغوص في الأمر. يتوفر أيضًا كود المصدر الكامل وملفات التطبيق على الموقع مستودع GitHub: التطبيق والرمز.

رسم اردوينو كامل

هنا هو رسم اردوينو الكامل. انسخه إلى Arduino IDE وتحقق منه وقم بتحميله إلى Arduino Mega. تذكر فصل أسلاك HC-05 TX/RX قبل التحميل.

/**
 * Author: Omar Draidrya
 * Date: 2024/07/20
 * This sketch controls an advanced autonomous and Bluetooth-controlled robot car using Arduino Mega,
 * four HC-SR04 ultrasonic sensors, HC-05 Bluetooth module, and Adafruit Motor Shield V1.
 * The robot supports manual Bluetooth control (Forward, Backward, Left, Right, Stop) and
 * autonomous obstacle-avoidance navigation with front, rear, left, and right distance sensing.
 */
#include <AFMotor.h>
// Motor setup
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);
// Ultrasonic sensor pins
const int trigF = 23;
const int echoF = 22;
const int trigL = 27;
const int echoL = 26;
const int trigR = 29;
const int echoR = 28;
const int trigB = 25;
const int echoB = 24;
char command;
bool autonomousModeEnabled = false; // Variable to track autonomous mode
// Function prototypes
void handleCommand(char command);
void forward(int speed = 160);
void backward(int speed = 160);
void turnLeft(int speed = 160);
void turnRight(int speed = 160);
void stop();
void autonomousMode();
int getDistance(int trigPin, int echoPin);
void setup() {
  Serial.begin(9600);
  pinMode(trigF, OUTPUT);
  pinMode(echoF, INPUT);
  pinMode(trigL, OUTPUT);
  pinMode(echoL, INPUT);
  pinMode(trigR, OUTPUT);
  pinMode(echoR, INPUT);
  pinMode(trigB, OUTPUT);
  pinMode(echoB, INPUT);
}
void loop() {
  if (Serial.available() > 0) {
    command = Serial.read();
    handleCommand(command);
  }
  if (autonomousModeEnabled) {
    autonomousMode();
  }
}
void handleCommand(char command) {
  if (command == 'F') {
    forward();
    autonomousModeEnabled = false; // Disable autonomous mode
  } else if (command == 'B') {
    backward();
    autonomousModeEnabled = false; // Disable autonomous mode
  } else if (command == 'L') {
    turnLeft();
    autonomousModeEnabled = false; // Disable autonomous mode
  } else if (command == 'R') {
    turnRight();
    autonomousModeEnabled = false; // Disable autonomous mode
  } else if (command == 'S') {
    stop();
    autonomousModeEnabled = false; // Disable autonomous mode
  } else if (command == 'A') {
    autonomousModeEnabled = true; // Enable autonomous mode
  }
}
void forward(int speed) {
  motor1.setSpeed(speed);
  motor2.setSpeed(speed);
  motor3.setSpeed(speed);
  motor4.setSpeed(speed);
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
}
void backward(int speed) {
  motor1.setSpeed(speed);
  motor2.setSpeed(speed);
  motor3.setSpeed(speed);
  motor4.setSpeed(speed);
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
}
void turnLeft(int speed) {
  motor1.setSpeed(speed);
  motor2.setSpeed(speed);
  motor3.setSpeed(speed);
  motor4.setSpeed(speed);
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
}
void turnRight(int speed) {
  motor1.setSpeed(speed);
  motor2.setSpeed(speed);
  motor3.setSpeed(speed);
  motor4.setSpeed(speed);
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
}
void stop() {
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);
}
void autonomousMode() {
  int distanceF = getDistance(trigF, echoF);
  int distanceL = getDistance(trigL, echoL);
  int distanceR = getDistance(trigR, echoR);
  int distanceB = getDistance(trigB, echoB);
  // Prüfen, ob ein Hindernis vorne ist
  if (distanceF < 20) {
    stop();
    delay(100); // Verzögerung, um sicherzustellen, dass der Roboter angehalten hat
    // Hindernisvermeidung
    if (distanceR > distanceL && distanceR > 20) {
      turnRight(180);
      delay(300);
    } else if (distanceL > distanceR && distanceL > 20) {
      turnLeft(180);
      delay(300);
    } else if (distanceB > 20) {
      backward(160);
      while (distanceB > 20) {
        distanceB = getDistance(trigB, echoB);
        distanceL = getDistance(trigL, echoL);
        distanceR = getDistance(trigR, echoR);
        if (distanceR > 20 || distanceL > 20) {
          stop();
          delay(100);
          if (distanceR > distanceL) {
            turnRight(180);
          } else {
            turnLeft(180);
          }
          delay(300);
          break;
        }
        delay(100);
      }
      stop();
    } else {
      stop();
    }
  } else {
    adjustDirection(distanceL, distanceR);
    forward(map(distanceF, 20, 160, 64, 160));
  }
}
void adjustDirection(int distanceL, int distanceR) {
  if (distanceL < 20) {
    turnRight(180);
    delay(100);
    forward(160);
  } else if (distanceR < 20) {
    turnLeft(180);
    delay(100);
    forward(160);
  }
}
int getDistance(int trigPin, int echoPin) {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  long duration = pulseIn(echoPin, HIGH);
  int distance = duration * 0.034 / 2;
  return distance;
}
    

تجول التعليمات البرمجية التفصيلية

اسمحوا لي أن أتجول في قسم الكود قسمًا تلو الآخر.

شرح الكود: إعداد المكتبة والمحرك

يتضمن الرسم AFMotor.h مكتبة من Adafruit، والتي توفر وظائف ملائمة للتحكم في محركات التيار المستمر من خلال Motor Shield. أربعة أجسام حركية (المحرك1 من خلال المحرك4) يتم إنشاؤها بما يتوافق مع المحطات الطرفية M1 – M4 الموجودة على الدرع. يتحكم M1/M2 في العجلات اليسرى ويتحكم M3/M4 في العجلات اليمنى.

شرح الكود: رسم خرائط دبوس المستشعر بالموجات فوق الصوتية

بعد ذلك، تحدد الثوابت الثمانية توصيلات Trig وEcho لأجهزة الاستشعار الأربعة HC-SR04: trigF/echoF (الجبهة، دبابيس 23/22)، trigB/echoB (الظهر، دبابيس 25/24)، trigL/echoL (يسار، دبابيس 27/26)، و مثلثات/صدى (يمين، دبابيس 29/28). ال setup() تقوم الوظيفة بتكوين جميع دبابيس Trig كـ OUTPUT ودبابيس Echo كـ INPUT.

شرح الكود: التعامل مع أوامر البلوتوث

خلال كل مرور عبر حلقة() وظيفة، اردوينو يتحقق أيضا Serial.available() لبيانات البلوتوث الواردة. عندما تصل الشخصية، مقبض الأمر () تقوم الوظيفة بتعيينها إلى وظيفة الحركة: F → للأمام، B → للخلف، L → TurnLeft، R → TurnRight، S → stop. يتم أيضًا تعيين كل أمر يدوي AutomationModeEnabled = false للخروج على الفور من الملاحة المستقلة. يقوم الأمر A بتمكين الوضع المستقل من خلال الإعداد AutomationModeEnabled = true.

شرح الكود: وظائف الحركة بالوضع اليدوي

إن إلى الأمام(), إلى الوراء (), انعطف لليسار()و انعطف يمينا() تقوم كل وظيفة بتعيين السرعة لجميع المحركات الأربعة ثم تشغيلها في الاتجاه المناسب. أعمال الخراطة من خلال المحرك التفاضلي: انعطف لليسار() يدير المحركات اليسرى للخلف والمحركات اليمنى للأمام، بينما انعطف يمينا() يفعل العكس. ال قف() وظيفة تطلق جميع المحركات التي تستخدم يطلق. تقبل كل وظيفة معلمة سرعة اختيارية (الافتراضي 160 من 255).

شرح الكود: الوضع المستقل ومنطق العوائق الأمامية

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

شرح الكود: منطق التصحيح الجانبي

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

شرح الكود: المنطق العكسي والهروب

في أسوأ الحالات، عندما يكون كل من الأمام واليسار واليمين مسدودًا ولكن الجزء الخلفي خالٍ (المسافة > 20 سم)، يتحرك الروبوت للخلف. أثناء هذه المناورة، يقوم باستمرار بمسح المستشعرات اليمنى واليسرى. بمجرد أن ينفتح أحد الجانبين (المسافة > 20 سم)، فإنه يتوقف، ويتجه نحو الجانب المفتوح، ويخرج من الحلقة العكسية. وإلا فإنه يتوقف بعد أن يصبح الجزء الخلفي مسدودًا أيضًا.

شرح الكود: وظيفة قياس المسافة

إن الحصول على المسافة () تعمل الوظيفة على تشغيل نبض بالموجات فوق الصوتية على دبوس Trig المحدد وتقيس وقت الإرجاع على دبوس Echo الذي يستخدمه نبض في(). يقوم بتحويل المدة إلى سنتيمترات مع المسافة = المدة * 0.034 / 2. يستدعي Arduino هذه الوظيفة لكل من أجهزة الاستشعار الأربعة عندما يحتاج إلى قراءة عن بعد.

شرح الكود: منطق رسم خرائط السرعة

عندما يكون المسار أمامك خاليًا، يقوم الكود بتعيين السرعة الأمامية باستخدام خريطة (المسافةF، 20، 160، 64، 160). يتحرك الروبوت بشكل أبطأ عندما يكون العائق الأمامي قريبًا (أعلى بقليل من 20 سم) ويتحرك بشكل أسرع عندما يكون المسار مفتوحًا على مصراعيه (أكثر من 160 سم). الحد الأدنى للسرعة 64 يمنع المحركات من التوقف عند قيم PWM منخفضة جدًا.

الخطوة 6: إنشاء تطبيق Android للتحكم في البلوتوث

بالنسبة لتطبيق Android، نستخدم MIT App Inventor لإنشاء واجهة بسيطة ترسل الأوامر إلى HC-05 عبر البلوتوث. إذا كنت جديدًا على مفاهيم برمجة Arduino، فلدينا دليل أساسيات برمجة الاردوينو يوفر خلفية مفيدة. للتعمق أكثر في إعداد وإقران HC-05/HC-06، راجع موقعنا البرنامج التعليمي الكامل لوحدة البلوتوث HC-05/HC-06.

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

  1. التسجيل وتسجيل الدخول: انتقل إلى مخترع تطبيقات معهد ماساتشوستس للتكنولوجيا وقم بتسجيل الدخول باستخدام حساب Google الخاص بك.
  2. إنشاء مشروع جديد: انقر فوق "بدء مشروع جديد" وقم بتسميته "RobotCarControl".

مكونات واجهة المستخدم المطلوبة

تصميم واجهة المستخدم بهذه المكونات:

  • منتقي القائمة1: اضبط النص على "تحديد جهاز Bluetooth". يتيح ذلك للمستخدم اختيار HC-05 المقترن من قائمة أجهزة Bluetooth المتوفرة.
  • عميل البلوتوث 1: أضف هذا من لوحة الاتصال. وهو مكون غير مرئي يتعامل مع اتصال Bluetooth التسلسلي.
  • التسمية 1: تسمية نصية تستخدم لعرض حالة الاتصال ("متصل" أو "غير متصل"). هذه التسمية يجب أن تكون موجودة في واجهة المستخدم لأن رمز الكتل يشير إليه.
  • ButtonForward، ButtonBackward، ButtonLeft، ButtonRight: أربعة أزرار للتحكم في الاتجاه. اضبط ألوانها لتحقيق الوضوح البصري (على سبيل المثال، الأخضر للأمام، والأحمر للخلف).
  • تبديل الوضع: مكون تبديل يقوم بالتبديل بين الوضعين اليدوي والمستقل. عند تشغيله، فإنه يرسل "A" لتمكين الوضع المستقل. عند إيقاف التشغيل، فإنه يرسل "M" الذي لا يتعامل معه مخطط Arduino بشكل صريح (أي أمر غير معروف يترك الوضع اليدوي نشطًا ببساطة).

كيف يعمل اتصال Bluetooth ListPicker

عندما ينقر المستخدم على ListPicker، سيتم عرض الملف BeforePicking يقوم الحدث بملء القائمة بأجهزة Bluetooth المقترنة من عميل BluetoothClient1.AddressesAndNames. بعد أن يختار المستخدم الجهاز، AfterPicking يحاول الحدث الاتصال باستخدام BluetoothClient1.Connect. إذا نجح الاتصال، يعرض Label1 "متصل"؛ وإلا فإنه يظهر "غير متصل".

كيف تعمل أوامر TouchDown / TouchUp

يستخدم كل زر الاتجاه لمس لأسفل لإرسال أمر الحركة (F، B، L، أو R) عند الضغط عليه، و لمس لإرسال "S" (توقف) عند تحريره. يتحرك الروبوت طالما تم الضغط على الزر ويتوقف بمجرد تركه.

برمجة الكتل

أضف هذه الكتل في محرر كتل MIT App Inventor للتعامل مع اتصال Bluetooth وإرسال الأوامر:

عندما ListPicker1.BeforePicking
  اضبط ListPicker1.Elements على BluetoothClient1.AddressesAndNames
عندما ListPicker1.AfterPicking
  إذا كان استدعاء BluetoothClient1.Connect عنوان ListPicker1.Selection
    ثم قم بتعيين Label1.Text إلى "متصل"
    وإلا قم بتعيين Label1.Text إلى "غير متصل"
عند ButtonForward.TouchDown
  في حالة BluetoothClient1.IsConnected
    استدعاء BluetoothClient1.SendText النص "F"
عند ButtonBackward.TouchDown
  إذا كان BluetoothClient1.IsConnected
    استدعاء BluetoothClient1.SendText النص "B"
عندما ButtonLeft.TouchDown
  إذا كان BluetoothClient1.IsConnected
    استدعاء BluetoothClient1
.SendText النص "L"
عندما ButtonRight.TouchDown
  إذا كان BluetoothClient1.IsConnected
    استدعاء BluetoothClient1.SendText النص "R"
عند ButtonForward.TouchUp
  إذا كان BluetoothClient1.IsConnected
    استدعاء BluetoothClient1.SendText النص "S"
عند ButtonBackward.TouchUp
  إذا كان BluetoothClient1.IsConnected
    استدعاء BluetoothClient1.SendText النص "S"
عندما ButtonLeft.TouchUp
  إذا كان BluetoothClient1.IsConnected
    استدعاء BluetoothClient1.SendText النص "S"
عند ButtonRight.TouchUp
  إذا كان BluetoothClient1.IsConnected
    استدعاء BluetoothClient1.SendText النص "S"
عند تغيير الوضع
  إذا كان ModeSwitch.On
    استدعاء BluetoothClient1.SendText النص "A"
  في حالة أخرى
    استدعاء BluetoothClient1.SendText النص "M"
    
MIT App Inventor block programming interface showing Bluetooth connection, directional button commands, and mode switch logic for the robot car control app

الخطوة 7: توصيل الروبوت واختباره

  1. قم بإقران جهاز Bluetooth: قم بتشغيل Bluetooth على هاتفك الذكي الذي يعمل بنظام Android وقم بإقرانه بوحدة HC-05. كلمة مرور الاقتران الافتراضية هي عادةً 1234 أو 0000.
  2. الاتصال عبر التطبيق: افتح تطبيق RobotCarControl، وانقر فوق ListPicker، وحدد جهاز HC-05 الخاص بك. في حالة النجاح، يجب أن يتغير Label1 إلى "متصل".
  3. اختبار التحكم اليدوي بالبلوتوث: اضغط على كل زر اتجاه وتأكد من أن الروبوت يتحرك في الاتجاه الصحيح. حرر الزر وتأكد من توقف الروبوت.
  4. اختبار الوضع المستقل: قم بتبديل مفتاح الوضع إلى الحكم الذاتي. ثم ضع عائقًا أمام الروبوت ولاحظ ما إذا كان سيتوقف ويستدير لتجنبه.

كيفية اختبار وضبط سيارتك الروبوتية ذاتية التحكم Arduino Mega

إن الحصول على هذه السيارة الروبوتية المتقدمة ذاتية التحكم Arduino Mega لتتصرف بشكل موثوق يتطلب بعض الضبط. إليك كيف أوصي بالتعامل معها:

  • اختبار أوامر البلوتوث أولاً: قبل اختبار الوضع المستقل، تأكد من أن كل أمر يدوي (F، B، L، R، S) ينتج الاستجابة الحركية الصحيحة. هذا يؤكد صحة الأسلاك والرمز الخاص بك.
  • التحقق من اتجاه المحرك: إذا كان المحرك يدور بطريقة خاطئة، قم بتبديل سلكيه عند طرف درع المحرك. يجب أن تتفق جميع المحركات الأربعة على "الأمام".
  • التحقق من كل جهاز استشعار بالموجات فوق الصوتية على حدة: إضافة مؤقتة Serial.println() بيانات لطباعة قراءة مسافة كل مستشعر إلى الشاشة التسلسلية. تأكد من أن جميع الأجزاء الأمامية والخلفية واليسار واليمين تقرأ القيم المعقولة وتستجيب للأشياء الموضوعة أمامها.
  • ضبط عتبات مسافة العوائق: يستخدم الكود 20 سم كحد أدنى. إذا كان رد فعل الروبوت الخاص بك متأخرًا جدًا (تعطل) أو مبكرًا جدًا (توقف بعيدًا عن العوائق)، فاضبط هذه القيمة في الوضع المستقل () وظيفة.
  • ضبط قيم السرعة: السرعة الافتراضية هي 160 (من 255). إذا كانت محركاتك سريعة جدًا أو بطيئة جدًا، فاضبط معلمة السرعة الافتراضية و map() يتراوح. قد تحتاج الروبوتات الأثقل أو المحركات الأضعف إلى سرعات دنيا أعلى.
  • ضبط توقيت الدوران: يتم التحكم في مدة الدوران بواسطة تأخير(300) بعد تحول الأوامر. إذا لم يدور الروبوت بدرجة كافية (أو تحول بعيدًا جدًا)، فقم بزيادة أو تقليل قيمة التأخير هذه.
  • التكيف مع مجموعات الهيكل/المحرك المختلفة: كل هيكل له وزن واحتكاك وعزم دوران محرك مختلف. توقع التكرار على قيم السرعة والتأخير والعتبة حتى يتم تشغيل التصميم المحدد بسلاسة.

استكشاف الأخطاء وإصلاحها في سيارة الروبوت المستقلة الخاصة بك Arduino Mega

إذا كان هناك شيء لا يعمل، فراجع هذا الجدول لمعرفة المشكلات والإصلاحات الشائعة:

مشكلةالسبب المحتملحل
أزواج HC-05 لكن الروبوت لا يتحركالتطبيق لا يرسل الأوامر، أو أن الأسلاك غير صحيحةتأكد من صحة BluetoothClient1.IsConnected في التطبيق. تحقق من أسلاك درع المحرك وطاقة البطارية.
فشل التحميل بسبب خطأ في المسلسلتشغل أسلاك HC-05 TX/RX الأطراف 0/1افصل أسلاك HC-05 TX وRX قبل التحميل. أعد الاتصال بعد اكتمال التحميل.
يتحرك الروبوت في الاتجاه الخاطئيتم تبديل أسلاك المحركقم بتبديل السلكين للمحرك المتأثر عند طرف الدرع، أو قم بتبديل تعيينات كائن المحرك في الكود.
جهاز استشعار بالموجات فوق الصوتية يعطي قراءات غير مستقرةأسلاك فضفاضة أو ضوضاء كهربائية أو مستشعر يواجه سطحًا ناعمًا/زاويًاتأمين جميع أسلاك العبور. أضف تأخيرًا بسيطًا بين قراءات المستشعر. اختبار مع سطح مستو وصلب.
يستمر الروبوت في التوقف بشكل غير متوقعالمستشعر الأمامي يقرأ المسافات القصيرة الكاذبةتحقق من عدم وجود أسلاك Trig/Echo مفككة. تأكد من تثبيت المستشعر بإحكام وعدم اهتزازه.
وضع الحكم الذاتي عالق في الزاويةيتم حظر جميع الاتجاهات الأربعة في حدود 20 سمهذا هو الحد من الخوارزمية البسيطة. حاول زيادة العتبة أو إضافة هروب منعطف عشوائي.
المحركات ضعيفة أو غير متناسقةعدم كفاية جهد البطارية أو التياراستخدم بطاريات جديدة أو مجموعة بطاريات ذات سعة أعلى. تحقق من انخفاض الجهد تحت الحمل.
طاقة البطارية غير كافيةهناك عدد كبير جدًا من المكونات التي تسحب التياراستخدم بطارية منفصلة للمحركات (عبر مدخل طاقة الدرع) وقم بتشغيل Arduino عبر USB أو مصدر منفصل منظم.
يتحول الروبوت إلى الاتجاه الخاطئ في الوضع المستقليتم تبديل أجهزة الاستشعار اليسرى/اليمين في الأسلاك أو التعليمات البرمجيةتحقق من أن Sensor_L موجود فعليًا على اليسار وSensor_R على اليمين. تحقق من تطابق تعيينات الدبوس مع التخطيط الفعلي.

الأسئلة المتداولة

هل يمكنني استخدام Arduino Uno بدلاً من Arduino Mega لهذا المشروع؟

لا، لسوء الحظ لا يحتوي Arduino Uno على دبابيس رقمية كافية لتوصيل أربعة أجهزة استشعار بالموجات فوق الصوتية (التي تحتاج إلى 8 دبابيس) بالإضافة إلى Motor Shield، الذي يستخدم بالفعل عدة دبابيس. توفر لوحة Arduino Mega الأطراف 22-29 لأجهزة الاستشعار والأجهزة التسلسلية على الأطراف 0/1 للبلوتوث، مما يجعلها اللوحة الأفضل لهذا المشروع.

ما هو الفرق بين Adafruit Motor Shield V1 وV2؟

يستخدم درع V1 مكتبة AFMotor.h ويقوم بتشغيل المحركات مباشرة من خلال سجلات التحول. يستخدم V2 اتصال I2C ومكتبة Adafruit_MotorShield. ومع ذلك، يستخدم هذا البرنامج التعليمي V1. إذا كان لديك V2، فستحتاج إلى تغيير رمز المكتبة وتهيئة المحرك وفقًا لذلك.

هل يمكنني استخدام وحدة HC-06 بدلاً من HC-05؟

نعم. يعمل HC-06 كجهاز استقبال Bluetooth (تابع فقط) ويمكنه استبدال HC-05 لهذا المشروع نظرًا لأن الروبوت يحتاج فقط إلى تلقي الأوامر. تظل الأسلاك والكود كما هي. انظر لدينا HC-05/HC-06 البرنامج التعليمي الكامل للحصول على تفاصيل حول الاختلافات.

كيف أقوم بتغيير عتبة مسافة اكتشاف العوائق؟

في الوضع المستقل () وظيفة، يتم تعيين العتبة إلى 20 سم في ظروف مثل إذا (المسافةF < 20). على سبيل المثال، قم بزيادة هذه القيمة إلى 30 إذا كنت تريد أن يتفاعل الروبوت مبكرًا، أو قم بتخفيضها إذا توقف الروبوت بعيدًا عن العوائق.

لماذا لا يقود الروبوت الخاص بي بشكل مستقيم في الوضع الذاتي؟

عادة، يمكن أن تؤدي سرعات المحرك غير المتساوية، أو احتكاك العجلات المختلفة، أو الاختلافات الطفيفة بين المحركين الأيسر والأيمن إلى الانجراف. لإصلاح ذلك، حاول ضبط سرعات المحرك الفردية في إلى الأمام() وظيفة، أو إضافة التحكم PID لقيادة أكثر دقة في خط مستقيم.

هل يمكنني التحكم في هذا الروبوت من هاتف iPhone بدلاً من Android؟

لسوء الحظ، يستخدم HC-05 تقنية Bluetooth الكلاسيكية (SPP)، والتي لا يدعمها iOS أصلاً، لاستخدام iPhone، واستبدال HC-05 بوحدة BLE (مثل HM-10) وإنشاء التطبيق باستخدام نظام أساسي متوافق مع BLE.

ما البطارية التي يجب أن أستخدمها للسيارة الروبوتية؟

تعمل حزمة البطاريات بقوة 6-12 فولت بسعة 1-2 أمبير على الأقل بشكل جيد. على سبيل المثال، تتضمن الخيارات الشائعة 4 بطاريات قلوية AA (6 فولت)، أو بطارية LiPo 7.4 فولت 2S، أو بطارية 9 فولت (على الرغم من أن بطاريات 9 فولت لها تيار محدود). قم بتوصيل البطارية بمحطات إدخال الطاقة المخصصة لدرع المحرك.

هل أحتاج إلى استخدام أجزاء مطبوعة ثلاثية الأبعاد، أم يمكنني بناء الهيكل بشكل مختلف؟

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

كم عدد أجهزة الاستشعار بالموجات فوق الصوتية التي أحتاجها حقًا؟

في هذا المشروع، نستخدم أربعة أجهزة استشعار لتغطية كاملة بزاوية 360 درجة (الأمامية والخلفية واليسار واليمين). لتجنب العوائق الأمامية الأساسية، يكفي وجود مستشعر أمامي واحد، ومع ذلك، تعمل المستشعرات الجانبية والخلفية على تحسين قدرة الروبوت بشكل كبير على التنقل في المساحات الضيقة والرجوع للخلف بأمان.

هل يمكنني إضافة المزيد من الميزات إلى هذه السيارة الروبوتية؟

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

الموارد والمشاريع القادمة

الآن بعد أن تم تشغيل مشروع Arduino Mega المتقدم للسيارة الروبوتية المستقلة، إليك بعض البرامج التعليمية ذات الصلة وأفكار الترقية إذا كنت تريد الاستمرار:

دروس OmArTronics ذات الصلة

ترقية الأفكار

الخاتمة

إذا كنت قد تابعت ذلك، فلديك الآن سيارة روبوتية متقدمة ومستقلة تعمل بتقنية Arduino Mega والتي يمكنها تفادي العقبات من تلقاء نفسها والاستجابة لأوامر البلوتوث من هاتفك. في هذه العملية، قمت بتوصيل Adafruit Motor Shield وأربعة أجهزة استشعار بالموجات فوق الصوتية، وكتبت مخطط Arduino لتجنب العوائق، وقمت بإقران وحدة Bluetooth HC-05، وقمت ببناء تطبيق Android في MIT App Inventor للتحكم في كل شيء.

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

تنزيل ملفات الطباعة ثلاثية الأبعاد (STL)

جميع ملفات STL القابلة للطباعة ثلاثية الأبعاد لهذا المشروع متاحة للتنزيل. يمكنك الحصول عليها من متجرنا أو تصفحها على Cults3D:

  • متجر OmArTronics: قم بتنزيل ملفات المشروع من OmArTronics - احصل على حزمة المشروع الكاملة بما في ذلك ملفات STL ومخططات الأسلاك وكود المصدر التي يتم تسليمها إلى بريدك الإلكتروني.
  • الطوائف3D: عرض على Cults3D - تصفح وتنزيل ملفات النماذج ثلاثية الأبعاد على Cults3D.

أضف تعليق