ملخص سريع
قم ببناء مشروع 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، وللتعرف على أساسيات أجهزة الاستشعار بالموجات فوق الصوتية، تحقق من موقعنا شرح اردوينو لمستشعر المسافة بالموجات فوق الصوتية.

ماذا سوف تتعلم
بنهاية هذا البرنامج التعليمي، ستعرف كيفية:
- اجمع بين التحكم اليدوي عبر 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
هنا قائمة الأجزاء الكاملة. اجمع كل شيء قبل البدء في البناء.
| المكوّن | الكمية | مطلوب | الغرض | الملاحظات |
|---|---|---|---|---|
| أردوينو ميجا 2560 | 1 | نعم | وحدة التحكم الرئيسية - تقوم بتشغيل الرسم وقراءة أجهزة الاستشعار | هناك حاجة إلى ميجا للدبابيس الرقمية الإضافية (22-29) والجهاز التسلسلي |
| درع المحرك Adafruit Motor Shield V1.2 | 1 | نعم | يقوم بتشغيل أربعة محركات تعمل بالتيار المستمر عبر أطراف التوصيل M1 – M4 | يتم تكديسها مباشرة على رؤوس Arduino Mega |
| وحدة البلوتوث HC-05 | 1 | نعم | الاتصال اللاسلكي مع تطبيق Android | يتصل بالمسلسل (دبابيس 0/1)؛ رقم التعريف الشخصي الافتراضي للاقتران هو 1234 |
| جهاز الاستشعار بالموجات فوق الصوتية HC-SR04 | 4 | نعم | كشف العوائق الأمامية والخلفية واليسار واليمين | يتطلب دبابيس لكل منهما (Trig + Echo) |
| محرك DC مع علبة التروس | 4 | نعم | يقود العجلات الأربع | محركات DC القياسية ذات تروس 3-6 فولت |
| ورقة زجاج شبكي | 1 | نعم | لوحة قاعدة الهيكل | قطع إلى الأبعاد المطلوبة |
| إطار مطبوع ثلاثي الأبعاد، وحوامل المحرك، وحامل Arduino | 1 مجموعة | نعم | يؤمن المحركات واردوينو للهيكل | مصممة خصيصًا أو مقتبسة من ملفات STL |
| أسلاك التوصيل | متنوع | نعم | جميع اتصالات الإشارة والطاقة | أنواع M/M وM/F |
| حزمة البطارية | 1 | نعم | محركات القوى واردوينو | يوصى بـ 6-12 فولت؛ استخدم محطات طاقة درع المحرك |
| الهاتف الذكي | 1 | نعم | يقوم بتشغيل تطبيق التحكم MIT App Inventor | جهاز أندرويد مزود بتقنية البلوتوث |
| العجلات | 4 | نعم | يتم توصيله بأعمدة محرك علبة التروس | عجلات سيارة روبوت قياسية مقاس 65 ملم |
| مسامير، صواميل، مواجهات | متنوع | نعم | التجميع الميكانيكي | يوصى باستخدام أجهزة M3 |
الخطوة 1: بناء الهيكل للسيارة الروبوتية الخاصة بك
للبدء في بناء سيارتك الروبوتية المتقدمة ذاتية التحكم Arduino Mega، اصنع الهيكل من لوح زجاجي. هذه هي القاعدة حيث ستجلس جميع المكونات الأخرى. للحصول على مقدمة حول الطباعة ثلاثية الأبعاد للروبوتات، راجع موقعنا دليل المبتدئين للطباعة ثلاثية الأبعاد.
- قطع زجاجي زجاجي زجاجي: أولاً، قم بقياس وقص لوح زجاج شبكي حسب الأبعاد المطلوبة للهيكل.
- طباعة ثلاثية الأبعاد للإطار وحوامل المحرك: قم بتصميم وطباعة الإطار وحوامل المحرك التي تثبت محركات التيار المستمر الأربعة بالهيكل. ضع الحوامل بحيث تكون المحركات متناظرة على كلا الجانبين.
- طباعة ثلاثية الأبعاد لحامل الاردوينو: تصميم وطباعة حامل للاردوينو ميجا. اترك مساحة كافية لدرع المحرك الموجود في الأعلى.
الخطوة 2: تركيب المحركات
بعد ذلك، قم بتركيب محركات التيار المستمر الأربعة التي ستقود سيارة الروبوت.
- قم بتوصيل المحركات: استخدم البراغي والصواميل لتثبيت كل محرك DC على حامل المحرك المطبوع ثلاثي الأبعاد.
- قم بتركيب المحركات على الهيكل: قم بتوصيل حوامل المحرك بهيكل زجاجي باستخدام البراغي والصواميل. تأكد من محاذاة الزوج الأيسر (M1، M2) والزوج الأيمن (M3، M4) للقيادة المستقيمة.
الخطوة 3: تركيب Arduino Mega ودرع المحرك
بعد تركيب المحركات، قم بتثبيت Arduino Mega وAdafruit Motor Shield على الهيكل.
- وصِّل حامل الأردوينو: قم بتثبيت حامل Arduino المطبوع ثلاثي الأبعاد بالهيكل باستخدام البراغي.
- تركيب اردوينو ميجا: ثم ضع Arduino Mega في الحامل وقم بتثبيته بالمسامير. يحتوي Mega على المسامير الرقمية الإضافية التي نحتاجها لأربعة أجهزة استشعار بالموجات فوق الصوتية.
- قم بتوصيل درع المحرك: أخيرًا، ضع Adafruit Motor Shield على Arduino Mega، مع التأكد من محاذاة جميع منافذ الرأس بشكل صحيح. اضغط لأسفل بقوة ولكن بعناية.
الخطوة 4: توصيل المكونات
بعد تجميع الأجهزة، حان الوقت لتوصيل كل شيء. اتبع الجداول أدناه بعناية. إذا كنت جديدًا على وحدات البلوتوث، فلدينا البرنامج التعليمي الكامل لوحدة البلوتوث HC-05/HC-06 يغطي الأساسيات بالتفصيل.
اتصالات المحرك
| المحرك | طرف توصيل درع المحرك | جانب |
|---|---|---|
| المحرك الأمامي الأيسر | M1 | غادر |
| المحرك الخلفي الأيسر | M2 | غادر |
| المحرك الأمامي الأيمن | M3 | يمين |
| المحرك الخلفي الأيمن | M4 | يمين |
اتصالات وحدة بلوتوث HC-05
| دبوس HC-05 | اردوينو ميجا دبوس | الملاحظات |
|---|---|---|
| VCC | 5 V | مصدر الطاقة للوحدة |
| GND | GND | أرضية مشتركة |
| 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 أمبير على الأقل بشكل جيد هنا، نظرًا لأنك تقوم بتشغيل أربعة محركات في وقت واحد.

الخطوة 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.
إعداد المشروع
- التسجيل وتسجيل الدخول: انتقل إلى مخترع تطبيقات معهد ماساتشوستس للتكنولوجيا وقم بتسجيل الدخول باستخدام حساب Google الخاص بك.
- إنشاء مشروع جديد: انقر فوق "بدء مشروع جديد" وقم بتسميته "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"

الخطوة 7: توصيل الروبوت واختباره
- قم بإقران جهاز Bluetooth: قم بتشغيل Bluetooth على هاتفك الذكي الذي يعمل بنظام Android وقم بإقرانه بوحدة HC-05. كلمة مرور الاقتران الافتراضية هي عادةً 1234 أو 0000.
- الاتصال عبر التطبيق: افتح تطبيق RobotCarControl، وانقر فوق ListPicker، وحدد جهاز HC-05 الخاص بك. في حالة النجاح، يجب أن يتغير Label1 إلى "متصل".
- اختبار التحكم اليدوي بالبلوتوث: اضغط على كل زر اتجاه وتأكد من أن الروبوت يتحرك في الاتجاه الصحيح. حرر الزر وتأكد من توقف الروبوت.
- اختبار الوضع المستقل: قم بتبديل مفتاح الوضع إلى الحكم الذاتي. ثم ضع عائقًا أمام الروبوت ولاحظ ما إذا كان سيتوقف ويستدير لتجنبه.
كيفية اختبار وضبط سيارتك الروبوتية ذاتية التحكم 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 على دبابيس رقمية كافية لتوصيل أربعة أجهزة استشعار بالموجات فوق الصوتية (التي تحتاج إلى 8 دبابيس) بالإضافة إلى Motor Shield، الذي يستخدم بالفعل عدة دبابيس. توفر لوحة Arduino Mega الأطراف 22-29 لأجهزة الاستشعار والأجهزة التسلسلية على الأطراف 0/1 للبلوتوث، مما يجعلها اللوحة الأفضل لهذا المشروع.
يستخدم درع V1 مكتبة AFMotor.h ويقوم بتشغيل المحركات مباشرة من خلال سجلات التحول. يستخدم V2 اتصال I2C ومكتبة Adafruit_MotorShield. ومع ذلك، يستخدم هذا البرنامج التعليمي V1. إذا كان لديك V2، فستحتاج إلى تغيير رمز المكتبة وتهيئة المحرك وفقًا لذلك.
نعم. يعمل HC-06 كجهاز استقبال Bluetooth (تابع فقط) ويمكنه استبدال HC-05 لهذا المشروع نظرًا لأن الروبوت يحتاج فقط إلى تلقي الأوامر. تظل الأسلاك والكود كما هي. انظر لدينا HC-05/HC-06 البرنامج التعليمي الكامل للحصول على تفاصيل حول الاختلافات.
في الوضع المستقل () وظيفة، يتم تعيين العتبة إلى 20 سم في ظروف مثل إذا (المسافةF < 20). على سبيل المثال، قم بزيادة هذه القيمة إلى 30 إذا كنت تريد أن يتفاعل الروبوت مبكرًا، أو قم بتخفيضها إذا توقف الروبوت بعيدًا عن العوائق.
عادة، يمكن أن تؤدي سرعات المحرك غير المتساوية، أو احتكاك العجلات المختلفة، أو الاختلافات الطفيفة بين المحركين الأيسر والأيمن إلى الانجراف. لإصلاح ذلك، حاول ضبط سرعات المحرك الفردية في إلى الأمام() وظيفة، أو إضافة التحكم PID لقيادة أكثر دقة في خط مستقيم.
لسوء الحظ، يستخدم 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 وHC-05 ودرع محرك Adafruit - المشروع التأسيسي الذي يعتمد عليه هذا البرنامج التعليمي
- البرنامج التعليمي الكامل لوحدة البلوتوث HC-05/HC-06 Arduino ووحدة البلوتوث HC-05/HC-06 - الغوص العميق في إعداد Bluetooth واتصالاتها
- مستشعر المسافة بالموجات فوق الصوتية لاردوينو: البرنامج التعليمي HC-SR04 — تعرف على كيفية عمل قياس المسافة بالموجات فوق الصوتية
- سائق محرك L298N مع اردوينو: دليل التحكم في محرك التيار المستمر - أساسيات قيادة السيارات
- أساسيات برمجة الأردوينو: الدليل الكامل للمبتدئين - ابدأ هنا إذا كنت جديدًا على Arduino
- دليل التحكم المؤازر الأردوينو: SG90، و PWM، و PCA9685 - مفيد إذا كنت تريد إضافة ماسح ضوئي مؤازر إلى الروبوت الخاص بك
ترقية الأفكار
- أضف مستشعرًا بالموجات فوق الصوتية الأمامي مُثبتًا مؤازرًا لإجراء مسح بزاوية 180 درجة (انظر موقعنا رادار اردوينو مع HC-SR04 ومحرك سيرفو مرشد)
- دمج أجهزة الاستشعار التي تتبع الخط للتنقل القائم على المسار (انظر موقعنا الروبوت الذي يتبع الخط مع أجهزة الاستشعار KY-033 درس تعليمي)
- بناء أ الذراع الروبوتية ذات 6 دووف ذات التحكم بالبلوتوث كتحدي الروبوتات القادم
- أضف شاشة OLED أو LCD لإظهار قراءات المستشعر وحالة الاتصال في الوقت الفعلي
- تنفيذ التحكم في المحرك PID لمطابقة السرعة بدقة والقيادة في خط مستقيم (أكثر تقدمًا)
الخاتمة
إذا كنت قد تابعت ذلك، فلديك الآن سيارة روبوتية متقدمة ومستقلة تعمل بتقنية 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.