في هذا الدرس التعليمي، سنرشدك في كيفية بناء سيارة متقدمة تعمل بشكل مستقل وتتحكم فيها عبر البلوتوث باستخدام Arduino Mega، ووحدة البلوتوث HC-05، والعديد من أجهزة الاستشعار بالموجات فوق الصوتية، ودرع المحرك Adafruit. يغطي هذا المشروع كل شيء من تجميع هيكل السيارة إلى برمجة الأردوينو وتطوير تطبيق تحكم لهاتفك الذكي. بنهاية هذا الدليل، ستحصل على سيارة روبوتية تعمل بكامل وظائفها، تتنقل بشكل مستقل ويمكن التحكم بها لاسلكياً باستخدام جهاز الأندرويد الخاص بك.
هذا المشروع هو امتداد لمشروعنا السابق "بناء سيارة روبوتية يتم التحكم فيها عبر البلوتوث باستخدام Arduino، HC-05، وAdafruit Motor Shield." يضيف هذا المشروع ميزات أكثر تطورًا مثل التنقل المستقل باستخدام أجهزة الاستشعار بالموجات فوق الصوتية. لمزيد من التفاصيل حول أساسيات التحكم في محركات التيار المستمر باستخدام درع المحرك، يمكنك الرجوع إلى هذا المدونة ولدمج مستشعر الموجات فوق الصوتية، تحقق من هذه المدونة.
المكونات المطلوبة:
- ورقة زجاج عضوي (بلكسيجلاس) لاستخدامها كهيكل للروبوت
- 4 محركات تيار مستمر مع صناديق تروس
- درع المحرك Adafruit V1.2
- أردوينو أونو
- وحدة البلوتوث HC-05
- 4 أجهزة استشعار بالموجات فوق الصوتية (HC-SR04)
- إطار مطبوع ثلاثي الأبعاد، وحوامل محرك وحامل Arduino
- أسلاك التوصيل
- Battery
- هاتف ذكي مثبت عليه تطبيق MIT App Inventor
Step 1: Building the Chassis for Your Car
لبدء بناء سيارتك التي يتم التحكم فيها عبر البلوتوث، سنقوم بإنشاء الهيكل باستخدام ورقة من زجاج الأكريليك (Plexiglas). سيعمل هذا كقاعدة لتركيب جميع المكونات.
- قص البلكسيجلاس: قم بقياس وقص ورقة البلكسيجلاس إلى الأبعاد المطلوبة للهيكل.
- طباعة الإطار وحوامل المحركات بتقنية الطباعة ثلاثية الأبعاد: قم بتصميم وطباعة الإطار وحوامل المحركات لتثبيت محركات التيار المستمر بأمان على الهيكل.
- طباعة حامل أردوينو ثلاثي الأبعاد: قم بتصميم وطباعة حامل لتثبيت لوحة أردوينو أونو بشكل آمن على الهيكل.
الخطوة 2: تركيب المحركات
بعد ذلك، سنقوم بتركيب محركات التيار المستمر كجزء من مشروع سيارتنا التي يتم التحكم فيها عبر البلوتوث.
- تثبيت المحركات: استخدم البراغي والصواميل لتثبيت محركات التيار المستمر على حوامل المحركات المطبوعة ثلاثياً.
- تثبيت المحركات على الهيكل: قم بتثبيت حوامل المحركات على هيكل البلكسيجلاس باستخدام البراغي والصواميل.
الخطوة 3: تركيب لوحة الأردوينو ودرع المحرك
ثبت لوحة Arduino Uno ودرع محرك Adafruit بينما نتقدم في درسنا لبناء سيارة يتم التحكم فيها عبر البلوتوث.
- تثبيت حامل الأردوينو: قم بتثبيت حامل الأردوينو المطبوع ثلاثياً على الهيكل بشكل آمن.
- تثبيت الأردوينو: ضع لوحة Arduino Mega في الحامل وثبتها باستخدام البراغي.
- توصيل درع المحرك: ضع درع المحرك Adafruit على لوحة Arduino Mega، مع التأكد من أن جميع المسامير متراصة بشكل صحيح.
الخطوة 4: توصيل المكونات
توصيل المكونات بشكل صحيح أمر بالغ الأهمية في هذا المشروع لبناء سيارة يتم التحكم فيها عبر البلوتوث.
- توصيل المحركات بدرع المحرك:
– قم بتوصيل المحركات اليسرى بالمنافذ M1 و M2 على درع المحرك.
– قم بتوصيل المحركات اليمنى بالمنافذ M3 و M4 على درع المحرك. - توصيل وحدة البلوتوث HC-05:
– قم بتوصيل VCC إلى 5V على الأردوينو.
– قم بتوصيل GND إلى GND على الأردوينو.
– قم بتوصيل TXD إلى RX (الطرف 0) على الأردوينو.
– قم بتوصيل RXD إلى TX (الطرف 1) على الأردوينو. توصيل مستشعرات الموجات فوق الصوتية:
مستشعر الموجات فوق الصوتية_F: Echo إلى الطرف 22، Trig إلى الطرف 23
مستشعر الموجات فوق الصوتية_B: Echo إلى الطرف 24، Trig إلى الطرف 25
مستشعر الموجات فوق الصوتية_L: Echo إلى الطرف 26، Trig إلى الطرف 27
مستشعر الموجات فوق الصوتية_R: Echo إلى الطرف 28، Trig إلى الطرف 29توصيل البطاريات:
قم بتوصيل الأطراف الموجبة والسالبة لحزمة البطاريات بأطراف الطاقة على درع المحرك.
تأكد من توصيل الأرض بشكل صحيح.
الخطوة 5: برمجة الأردوينو للتحكم الذاتي والتحكم عبر البلوتوث
إليك كود الأردوينو للتحكم في سيارة الروبوت باستخدام أوامر البلوتوث من هاتفك الذكي والتحكم الذاتي باستخدام أجهزة الاستشعار بالموجات فوق الصوتية.
/** * Author: Omar Draidrya * Date: 2024/07/20 * This code controls the forward and backward movement of a motor using an H-bridge. */ #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; }
الوصف:
هذا الكود يتحكم في روبوت بأربعة محركات تيار مستمر باستخدام الاتصال التسلسلي عبر البلوتوث. يستقبل الأردوينو الأوامر من الهاتف الذكي وينفذ الحركات المقابلة:
- تهيئة المحركات: يتم تكوين المحركات باستخدام مكتبة Adafruit Motor Shield () مع الموصلات M1 إلى M4. يتم ضبط كل محرك في البداية على السرعة القصوى.
- الاتصال التسلسلي: ينتظر الأردوينو بيانات تسلسلية من الهاتف الذكي. عندما يتم استقبال أمر، يتم قراءته وتخزينه في المتغير الخاص بالأمر.
- تنفيذ الأوامر: يتم استدعاء الدالة المناسبة للتحكم في المحركات اعتمادًا على الأمر المستلم (F للأمام، B للخلف، L لليسار، R لليمين، S للتوقف).
- وظائف الحركة:
forward(): جميع المحركات تتحرك إلى الأمام.
backward(): جميع المحركات تتحرك إلى الخلف.
turnLeft(): المحركات اليسرى تتحرك إلى الخلف، المحركات اليمنى تتحرك إلى الأمام.
turnRight(): المحركات اليسرى تتحرك إلى الأمام، المحركات اليمنى تتحرك إلى الخلف.
stop(): جميع المحركات تتوقف.
الخطوة 6: تطوير تطبيق أندرويد للتحكم بالبلوتوث
سنستخدم MIT App Inventor لإنشاء تطبيق يرسل أوامر إلى الروبوت عبر Bluetooth. لفهم أساسيات برمجة Arduino، يمكنك الرجوع إلى دليلنا "أساسيات برمجة Arduino".
- التسجيل وتسجيل الدخول:
اذهب إلى MIT App Inventor وسجّل الدخول باستخدام حساب Google الخاص بك. - إنشاء مشروع جديد:
انقر على "ابدأ مشروع جديد" واختر اسم "RobotCarControl". - تصميم واجهة المستخدم:
أضف عنصر ListPicker واضبط النص على "Select Bluetooth Device".
أضف مكون BluetoothClient من لوحة الاتصالات (مكون غير مرئي).
أضف أربعة أزرار للتحكم: Forward (للأمام)، Backward (للخلف)، Left (لليسار)، Right (لليمين)، واضبط ألوانها وفقًا لذلك. أضف مفتاح تبديل للتنقل بين الأوضاع اليدوية والتلقائية.
- برمجة الكتل (Blocks):
أضف الكتل التالية لإدارة اتصال Bluetooth وإرسال أوامر التحكم.
when ListPicker1.BeforePicking set ListPicker1.Elements to BluetoothClient1.AddressesAndNames when ListPicker1.AfterPicking if call BluetoothClient1.Connect address ListPicker1.Selection then set Label1.Text to "Connected" else set Label1.Text to "Not Connected" when ButtonForward.TouchDown if BluetoothClient1.IsConnected call BluetoothClient1.SendText text "F" when ButtonBackward.TouchDown if BluetoothClient1.IsConnected call BluetoothClient1.SendText text "B" when ButtonLeft.TouchDown if BluetoothClient1.IsConnected call BluetoothClient1 .SendText text "L" when ButtonRight.TouchDown if BluetoothClient1.IsConnected call BluetoothClient1.SendText text "R" when ButtonForward.TouchUp if BluetoothClient1.IsConnected call BluetoothClient1.SendText text "S" when ButtonBackward.TouchUp if BluetoothClient1.IsConnected call BluetoothClient1.SendText text "S" when ButtonLeft.TouchUp if BluetoothClient1.IsConnected call BluetoothClient1.SendText text "S" when ButtonRight.TouchUp if BluetoothClient1.IsConnected call BluetoothClient1.SendText text "S" when ModeSwitch.Changed if ModeSwitch.On call BluetoothClient1.SendText text "A" else call BluetoothClient1.SendText text "M"
الخطوة 7: توصيل الروبوت واختباره
- ربط جهاز Bluetooth:
قم بتشغيل Bluetooth على هاتفك الذكي واربطه مع وحدة HC-05 (كلمة المرور الافتراضية هي 1234). - Connect via App:
استخدم التطبيق للاتصال بوحدة Bluetooth. - استخدام الأزرار الاتجاهية للتحكم في الروبوت:
اختبر التحكم اليدوي باستخدام الأزرار الاتجاهية. قم بتبديل المفتاح لاختبار الوضع التلقائي.
الخاتمة
بناء سيارة روبوت متقدمة تعمل بشكل مستقل وتتحكم فيها عبر البلوتوث هو مشروع مثير يجمع بين جوانب مختلفة من الروبوتات، بما في ذلك التحكم في المحركات، واستخدام أجهزة الاستشعار بالموجات فوق الصوتية، والاتصال عبر البلوتوث، وتطوير تطبيقات الهواتف المحمولة. من خلال اتباع هذا الدليل الشامل، يمكنك إنشاء سيارة روبوتية تعمل بكامل وظائفها، تتنقل بشكل مستقل وتستجيب للأوامر من هاتفك الذكي. يعزز هذا المشروع فهمك لوحدات الأردوينو والبلوتوث، ويوفر أيضًا أساسًا قويًا لمشاريع الروبوتات الأكثر تقدمًا.
لا تتردد في طرح أي أسئلة في قسم التعليقات أدناه وتفقد مشاريع أردوينو الأخرى للحصول على المزيد من الإلهام.