يحتوي هذا المقال على روابط تسويق بالعمولة مُعلَّمة بعلامة *. بصفتي شريكًا في برنامج Amazon Associates، أربح من عمليات الشراء المؤهلة، دون أي تكلفة إضافية عليك. يساعد ذلك على إبقاء الشروحات مجانية.
ملخص سريع
توصّل وحدة بلوتوث HC-05 أو HC-06 بلوحة Arduino، ثم يشغّل تطبيق Android مبني في MIT App Inventor مخرجات Arduino ويطفئها. يشغّل المشروع 1 مصباح LED ويطفئه. أما المشروع 2 فيستخدم الوحدة والتطبيق نفسيهما لتشغيل مصباح 230 V وإطفائه عبر مرحّل (Relay). إذا كنت جديدًا على Arduino، فابدأ بـ دليل أساسيات برمجة Arduino.
HC-05 أم HC-06: أي الوحدتين تختار
تُعد HC-05 وHC-06 من أكثر وحدات البلوتوث شيوعًا في مشاريع Arduino. وكلتاهما من وحدات Bluetooth Classic (الإصدار 2.0). وBluetooth Classic هو معيار البلوتوث الأصلي؛ أما Bluetooth Low Energy (BLE) فمعيار أحدث ومستقل عنه. تتصل الوحدتان بلوحة Arduino عبر منفذها التسلسلي، أي الطرفين TX (الإرسال) وRX (الاستقبال). والفرق الرئيسي: تعمل HC-05 بوضع السيد (Master) أو التابع (Slave)، بينما تعمل HC-06 بوضع التابع فقط. فالسيد يبدأ الاتصال؛ والتابع ينتظره.
- HC-06: تكفي عندما يرسل هاتف أو حاسوب أوامر إلى Arduino، كما في المشروعين هنا. يكون هاتفك الذكي هو السيد، والوحدة هي التابع. وهي أرخص قليلًا.
- HC-05: لازمة لوضع السيد، مثلًا عندما تتواصل لوحتا Arduino معًا؛ إذ يجب أن يكون أحد الطرفين على الأقل وحدة HC-05 مضبوطة على وضع السيد.
استخدمت وحدة HC-05 في سيارة روبوتية بالبلوتوث، وفي ذراع روبوتية بست درجات حرية (6-DOF) بتحكم عبر البلوتوث و روبوت OmObiArm المتحرك. في المشاريع الثلاثة كلها يكون الهاتف هو السيد، لذا كانت وحدة HC-06 ستعمل أيضًا.
جدول المقارنة التقنية
| الميزة | HC-05 | HC-06 |
|---|---|---|
| الدور | السيد والتابع | التابع فقط |
| إصدار البلوتوث | 2.0 (Bluetooth Classic) | 2.0 (Bluetooth Classic) |
| المدى | الفئة Class 2، نحو 10 m | الفئة Class 2، نحو 10 m |
| VCC (لوحة التوصيل) | من 3.6 إلى 6 V، تُغذّى من الطرف 5 V في Arduino | من 3.6 إلى 6 V، تُغذّى من الطرف 5 V في Arduino |
| معدل الباود الافتراضي | 9600 في معظم الوحدات (وضع أوامر AT: 38400) | 9600 |
| إمكانية ضبط معدل الباود | نعم، من 2400 إلى 1382400 بأوامر AT | نعم، بأوامر AT+BAUD في معظم إصدارات البرنامج الثابت |
| رمز PIN الافتراضي | 1234 | 1234 (بعض الوحدات: 0000) |
Class 2 فئة من فئات قدرة الإرسال في البلوتوث؛ وتصل أجهزة Class 2 إلى نحو 10 m. وVCC هو طرف التغذية في لوحة التوصيل (Breakout Board)، وهي اللوحة الحاملة الصغيرة ذات الأطراف التي تُركَّب عليها الوحدة. أما أوامر AT فهي أوامر نصية قصيرة تقرأ إعدادات الوحدة أو تغيّرها، مثل الاسم ورمز PIN ومعدل الباود. وتقبلها HC-05 في وضع أوامر AT الخاص بها، الذي يعمل بسرعة 38400 باود.
كيف يعمل اتصال البلوتوث
- المنفذ التسلسلي في Arduino: ترسل لوحة Arduino البيانات عبر الطرف TX (الطرف 1) وتستقبلها عبر الطرف RX (الطرف 0). تضبط الدالة Serial.begin() السرعة بالبت في الثانية (معدل الباود)؛ وتقرأ الدالة Serial.read() بايتًا واحدًا مُستقبَلًا.
- وحدة البلوتوث: جسر تسلسلي لاسلكي. يصل كل بايت يرسله الهاتف إلى الطرف RX في Arduino دون تغيير، كأنه جاء عبر كابل USB.
- تطبيق الهاتف: يرسل حرفًا واحدًا لكل أمر، ‘1’ للتشغيل (ON) و‘0’ للإطفاء (OFF).
- برنامج Arduino (Sketch) (البرنامج الذي يعمل على اللوحة): يقرأ الحرف ويضبط الطرف 7 على HIGH (5 V) أو LOW (0 V)، فيؤدي ذلك إلى تشغيل مصباح LED أو المرحّل أو إطفائه.

ويصلح نمط الحرف الواحد نفسه للمحركات ومحركات السيرفو والشاشات. ولمعرفة المزيد عن اللوحة نفسها، راجع ما هو Arduino وكيف يعمل.
المكونات
المكونات الأساسية (للمشروعين كليهما)
| المكوّن | الكمية | ملاحظات |
|---|---|---|
| وحدة بلوتوث HC-05 أو HC-06 | 1 | تصلح أيٌّ من الوحدتين للمشروعين كليهما |
| Arduino Uno أو Nano أو Mega | 1 | للوحات الأخرى، راجع الأسئلة الشائعة |
| مقاومة 1 kΩ | 1 | مقسم الجهد |
| مقاومة 2 kΩ | 1 | مقسم الجهد (أو مقاومتان 1 kΩ على التوالي) |
| لوحة التجارب (Breadboard) | 1 | لتوصيلات النماذج الأولية |
| أسلاك توصيل Jumper (ذكر-ذكر) | عدة | التوصيلات بين اللوحة ولوحة التجارب والوحدة |
| كابل USB للوحتك | 1 | USB-B للوحتي Uno/Mega؛ وMini-USB أو Micro-USB أو USB-C للوحة Nano، حسب الإصدار |
| هاتف ذكي أو جهاز لوحي يعمل بنظام Android | 1 | يشغّل تطبيق التحكم |
مكونات إضافية للمشروع 1: التحكم في LED
| المكوّن | الكمية | ملاحظات |
|---|---|---|
| LED (أي لون) | 1 | LED قياسي 5 mm بأطراف للتركيب عبر الثقوب (Through-Hole) |
| مقاومة 220 Ω | 1 | مقاومة تحديد التيار: تحدّ من التيار المار عبر LED |
مكونات إضافية للمشروع 2: المرحّل والمصباح
| المكوّن | الكمية | ملاحظات |
|---|---|---|
| وحدة مرحّل (5 V، قناة واحدة) | 1 | يُنصح بوحدة ذات عزل ضوئي (يفصل المقرن الضوئي Optocoupler مدخلَ Arduino عن دائرة ملف المرحّل) |
| مصباح (230 V أو 110 V) | 1 | مصباح صغير يعمل بجهد الشبكة الكهربائية ضمن حدود تحمّل تلامسات المرحّل (مطبوعة على المرحّل، وغالبًا 10 A عند 250 V AC؛ وAC تعني التيار المتردد) |
| قاعدة المصباح وكابل الكهرباء | 1 | لتوصيل آمن بالشبكة الكهربائية |
المشروع 1: التحكم في LED عبر البلوتوث
يشغّل الهاتف مصباح LED موصولًا بالطرف 7 ويطفئه.
توصيلات الدائرة للتحكم في LED
وصّل الوحدة وLED كما في الجدولين أدناه. يتصل الطرف TXD (الإرسال) في الوحدة بالطرف RX في Arduino (الطرف 0)، ويتصل الطرف RXD (الاستقبال) في الوحدة بالطرف TX في Arduino (الطرف 1). أي أن الخطين متقاطعان.
يعمل مدخل RXD في الوحدة بجهد 3.3 V، لكن الطرف TX في Arduino يُخرج 5 V، لذا يحتاج هذا الخط إلى مقسم جهد: مقاومتان على التوالي تخفضان الجهد. وصّل Arduino TX (الطرف 1) → 1 kΩ → RXD في الوحدة، ثم RXD في الوحدة ← 2 kΩ → GND (الأرضي، 0 V). وبذلك ترى الوحدة 5 V × 2 kΩ / (1 kΩ + 2 kΩ) ≈ 3.3 V.
| طرف الوحدة | طرف Arduino | ملاحظات |
|---|---|---|
| VCC | 5 V | تغذية الوحدة بالطاقة |
| GND | GND | أرضي مشترك |
| TXD | RX (الطرف 0) | إرسال الوحدة ← استقبال Arduino |
| RXD | TX (الطرف 1) | عبر مقسم الجهد (1 kΩ + 2 kΩ) |
| طرف LED | طرف Arduino | ملاحظات |
|---|---|---|
| الأنود (الساق الطويلة) | الطرف 7، عبر المقاومة 220 Ω | طرف خرج رقمي |
| الكاثود (الساق القصيرة) | GND | أرضي مشترك |

يُظهر المخطط التوصيلات المباشرة فقط. أضف مقسم الجهد والمقاومة 220 Ω الواردين في الجدولين أعلاه.
كود Arduino للتحكم في LED عبر البلوتوث
يستمع البرنامج إلى الأحرف الواردة على المنفذ التسلسلي، ويشغّل LED الموصول بالطرف 7 ويطفئه.
قبل الرفع: افصل وحدة البلوتوث عن الطرفين 0 و1. فلوحة Arduino تستخدم هذين الطرفين نفسيهما للبرمجة عبر USB. وإذا بقيت الوحدة موصولة، يفشل الرفع غالبًا برسالة خطأ مثل “avrdude: stk500_getsync(): not in sync”. وقد سبّب لي هذا مشكلات في سيارتي الروبوتية العاملة بالبلوتوث. أعد توصيل الوحدة بعد انتهاء الرفع.
/**
* Author: Omar Draidrya
* Date: 2024/06/26
* Bluetooth LED Control -- HC-05 / HC-06 Arduino Tutorial
* Receives '1' or '0' from a smartphone via Bluetooth
* and turns an LED on or off.
*/
#define ledPin 7 // Pin for the LED
char state = 0; // Variable to store incoming data
void setup() {
pinMode(ledPin, OUTPUT); // Set the LED pin as output
digitalWrite(ledPin, LOW); // Initialize the LED state to OFF
Serial.begin(9600); // Start serial at 9600 baud
}
void loop() {
if (Serial.available() > 0) { // Check if data is available
state = Serial.read(); // Read the incoming byte
if (state == '0') { // If '0' is received
digitalWrite(ledPin, LOW); // Turn LED OFF
Serial.println("LED: OFF"); // Send confirmation back
} else if (state == '1') { // If '1' is received
digitalWrite(ledPin, HIGH); // Turn LED ON
Serial.println("LED: ON"); // Send confirmation back
}
}
}
شرح الكود: برنامج LED
- #define ledPin 7: قبل الترجمة البرمجية (Compiling)، يُستبدَل كل ledPin في البرنامج بالرقم 7. فهو قيمة ثابتة وليس متغيرًا. غيّر الرقم لاستخدام طرف رقمي آخر.
- Serial.begin(9600): تبدأ الاتصال التسلسلي بسرعة 9600 باود. ويجب أن تطابق هذه القيمة معدل الباود في وحدتك. تستخدم HC-06 ومعظم وحدات HC-05 القيمة 9600، وكذلك وحدة HC-05 في الفيديو الخاص بي. وإذا كانت وحدتك مضبوطة من المصنع على 38400، فغيّر هذا السطر إلى Serial.begin(38400) أو اضبط الوحدة على 9600 بأوامر AT.
- Serial.available(): تُرجع عدد البايتات المستقبَلة المنتظرة في المخزن المؤقت التسلسلي (Serial Buffer)، وهو منطقة ذاكرة صغيرة تنتظر فيها البايتات الواردة حتى يقرأها البرنامج. وعندما يرسل الهاتف حرفًا، تصبح هذه القيمة أكبر من 0.
- Serial.read(): تقرأ بايتًا واحدًا من المخزن المؤقت التسلسلي وتخزّنه في المتغير state.
- if (state == ‘1’): يقارن الحرف المستقبَل بـ ‘1’. فإذا تطابقا، يشغّل الأمر digitalWrite(ledPin, HIGH) مصباح LED. وإذا وصل ‘0’، ينطفئ LED. فـ ‘1’ بين علامتي الاقتباس هو الحرف؛ أما 1 دون علامتي اقتباس فهو العدد، وعندها تفشل المقارنة.
- Serial.println(): ترسل نص تأكيد عائدًا عبر البلوتوث. لا يعرضه التطبيق الذي نبنيه هنا؛ بل يعرضه تطبيق طرفية تسلسلية للبلوتوث (Bluetooth Serial Terminal) على الهاتف.
لإدخال HC-05 في وضع أوامر AT، أبقِ طرفها KEY/EN على HIGH أثناء توصيل التغذية بها. وفي هذا الوضع تقرأ أوامر مثل AT+UART? إعدادات الوحدة أو تغيّرها.
بناء تطبيق التحكم باستخدام MIT App Inventor
تحتاج لوحة Arduino إلى تطبيق Android يرسل الأحرف. MIT App Inventor منصة برمجة مرئية مجانية: تبرمج فيها بالكتل بدلًا من كتابة الكود. ويصلح التطبيق نفسه للمشروعين كليهما. وكود Arduino، لا التطبيق، هو الذي يحدد ما يحدث عند وصول ‘1’ أو ‘0’.
الخطوة 1: إنشاء مشروع
- افتح MIT App Inventor وسجّل الدخول بحساب Google الخاص بك.
- انقر على “Start New Project” وسمِّه “BluetoothControl”.
الخطوة 2: تصميم واجهة المستخدم
اضبط خاصية Title للشاشة Screen1 على “Bluetooth Control”. ثم أضف في عرض Designer المكونات التالية واحتفظ بأسمائها الافتراضية، لأن الكتل أدناه تستخدمها:
- Label1: النص “Not Connected”. ويعرض حالة الاتصال.
- ListPicker1: النص “Select Bluetooth Device”. ويعرض قائمة بأجهزة البلوتوث المقترنة مسبقًا بالهاتف.
- Button1: النص “Turn ON”.
- Button2: النص “Turn OFF”.
- BluetoothClient1 من لوحة Connectivity. وهو مكوّن غير مرئي: لا يظهر على الشاشة، ويتولى إدارة اتصال البلوتوث.
الخطوة 3: برمجة الكتل
انتقل إلى محرر Blocks وابنِ المنطق التالي:
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 Button1.Click
if BluetoothClient1.IsConnected
call BluetoothClient1.SendText text "1"
when Button2.Click
if BluetoothClient1.IsConnected
call BluetoothClient1.SendText text "0"
- ListPicker1.BeforePicking تحمّل أسماء جميع الأجهزة المقترنة وعناوينها في القائمة قبل فتحها.
- ListPicker1.AfterPicking تتصل بالجهاز المحدد. فإذا نجح الاتصال، يعرض Label1 النص “Connected”؛ وإلا يبقى على “Not Connected”.
- Button1.Click و Button2.Click ترسلان النص “1” أو “0” ما دام الاتصال مفتوحًا. وتقرأ لوحة Arduino هذين الحرفين وتتصرف وفقهما.

الخطوة 4: بناء التطبيق وتثبيته
في MIT App Inventor، افتح Build → Android App (.apk) وامسح رمز QR بهاتفك لتثبيت التطبيق. وملف .apk هو ملف تثبيت تطبيقات Android. اسمح بالتثبيت من هذا المصدر عندما يطلب Android ذلك. وفي Android 12 أو أحدث، امنح إذن الأجهزة المجاورة (Nearby devices)؛ وإذا بقيت قائمة الأجهزة فارغة، ففعّله من الإعدادات (Settings) ← التطبيقات (Apps) ← BluetoothControl ← الأذونات (Permissions).
أما أنا فنزّلت ملف .apk على حاسوبي بدلًا من ذلك، ونسخته إلى جهازي اللوحي بنظام Android، وثبّته باستخدام مدير الملفات. وعلى الجهاز اللوحي، بقيت قائمة الأجهزة في التطبيق فارغة حتى منحت إذن Nearby devices وأقرنت الوحدة.
توصيل هاتفك الذكي بالوحدة
تُقرن كل وحدة بهاتفك مرة واحدة فقط.
الخطوة 1: إقران وحدة البلوتوث
- غذِّ لوحة Arduino عبر USB أو من مصدر طاقة خارجي. يومض LED الوحدة بسرعة: أي أنها في وضع الإقران وتنتظر اتصالًا.
- على هاتفك بنظام Android، افتح الإعدادات (Settings) → Bluetooth وشغّل البلوتوث.
- ابحث عن الأجهزة. تظهر الوحدة باسم “HC-05” أو “HC-06”؛ وتستخدم بعض الوحدات اسمًا آخر، مثل “linvor” في إصدارات البرنامج الثابت القديمة لوحدة HC-06.
- اضغط عليها للإقران وأدخل رمز PIN 1234 (في بعض وحدات HC-06: 0000).
- تظهر الوحدة الآن ضمن “Paired devices” (الأجهزة المقترنة). ولا يغيّر الإقران وحده حالة LED. وبمجرد اتصال التطبيق، يومض LED وحدة HC-05 مرتين كل 2 s تقريبًا، ويبقى LED وحدة HC-06 مضاءً.
الخطوة 2: الاتصال عبر التطبيق
- افتح تطبيق BluetoothControl.
- اضغط على “Select Bluetooth Device”. تعرض القائمة الأجهزة المقترنة.
- اختر الوحدة. يتغير Label1 إلى “Connected”.
- اضغط “Turn ON” لإرسال ‘1’، و“Turn OFF” لإرسال ‘0’.
إذا لم تظهر الوحدة في القائمة، فتأكد من وصول التغذية إليها ومن أنك أقرنتها في إعدادات البلوتوث على الهاتف. فمكوّن ListPicker لا يعرض إلا الأجهزة المقترنة.
المشروع 2: التحكم في المرحّل (Relay) ومصباح 230 V
في المشروع 2 تحل وحدة مرحّل محل LED. والمرحّل (Relay) مفتاح يُتحكَّم فيه كهربائيًا: تقود لوحة Arduino ملفه، فيفتح تلامسه دائرة المصباح 230 V (أو 110 V) أو يغلقها. ولهذا التلامس طرفان تحتاج إليهما هنا: COM (المشترك) وNO (المفتوح عادةً). ولا يتصل NO بـ COM إلا أثناء تشغيل المرحّل.
⚠ تحذير سلامة: قد يسبب جهد الشبكة الكهربائية (230 V أو 110 V) إصابات خطيرة أو الوفاة. إذا لم تكن لديك خبرة في توصيلات الشبكة الكهربائية، فلا تنفّذ المشروع 2، واستعن بكهربائي مؤهل. اختبر أولًا بحمل منخفض الجهد على طرفي COM وNO في المرحّل، مثل طنّان بجهد 5 V أو شريط LED بجهد 12 V له مزود طاقة خاص به. تأكد من أن المرحّل يُصدر صوت نقرة. اعزل كل توصيلة بالشبكة الكهربائية، وضع وحدة المرحّل وجميع أسلاك الشبكة داخل علبة مغلقة ومعزولة، مع مانع شدّ للكابل (Strain Relief) يمنع انتقال الشدّ إلى نقاط التوصيل. تترك وحدات المرحّل الرخيصة مسافة صغيرة بين ملامسات الشبكة الكهربائية وجانب الجهد المنخفض، لذا لا تلمس الدائرة أبدًا ما دامت موصولة بالمقبس. ولا يحتاج الاختبار بالجهد المنخفض إلى أي تعديل في الكود: يبقى البرنامج (Sketch) والتوصيلات على جانب Arduino كما هي.
توصيلات الدائرة للتحكم في المصباح عبر المرحّل
توصيلات البلوتوث هي نفسها كما في المشروع 1. ولا يتغير إلا الخرج: فالطرف 7 يقود الآن الطرف IN في وحدة المرحّل.
| طرف وحدة المرحّل | طرف Arduino | ملاحظات |
|---|---|---|
| VCC | 5 V | تغذية وحدة المرحّل |
| GND | GND | أرضي مشترك |
| IN | الطرف 7 | إشارة التحكم من Arduino |
| السلك | يتصل بـ | ملاحظات |
|---|---|---|
| خط الطور في الشبكة (L) | COM في المرحّل | لا يُقطع ويُوصل إلا سلك الطور |
| سلك الطور للمصباح | NO في المرحّل | يتصل بـ COM أثناء تشغيل المرحّل |
| الخط المحايد في الشبكة (N) | السلك المحايد للمصباح، مباشرةً | لا يمر عبر المرحّل |
| التأريض الواقي (PE، أخضر-أصفر) | طرف التأريض في المصباح، مباشرةً | ضروري للمصابيح ذات الهيكل المعدني؛ ولا يمر عبر المرحّل أبدًا |

يُظهر هذا المخطط أيضًا التوصيلات المباشرة فقط. أبقِ مقسم الجهد من المشروع 1 على خط RXD في الوحدة.
كود Arduino للتحكم في المرحّل عبر البلوتوث
يشبه برنامج المرحّل برنامج LED؛ فالطرف 7 يقود الآن الطرف IN في المرحّل. ارفعه والوحدة مفصولة عن الطرفين 0 و1، كما في المشروع 1.
/**
* Author: Omar Draidrya
* Date: 2024/06/26
* Bluetooth Relay/Lamp Control -- HC-05 / HC-06 Arduino Tutorial
* Receives '1' or '0' from a smartphone via Bluetooth
* and switches a relay (connected to a lamp) on or off.
*/
#define relayPin 7 // Pin connected to relay IN
int state = 0; // Variable to store incoming data
void setup() {
pinMode(relayPin, OUTPUT); // Set relay pin as output
digitalWrite(relayPin, LOW); // Initialize relay to OFF
Serial.begin(9600); // same baud rate as Project 1
}
void loop() {
if (Serial.available() > 0) { // Check if data is available
state = Serial.read(); // Read the incoming byte
}
if (state == '0') {
digitalWrite(relayPin, LOW); // Turn Relay OFF
Serial.println("Lamp: OFF"); // Send confirmation back
state = 0; // Reset state
} else if (state == '1') {
digitalWrite(relayPin, HIGH); // Turn Relay ON
Serial.println("Lamp: ON"); // Send confirmation back
state = 0; // Reset state
}
}
شرح الكود: برنامج المرحّل
- state = 0; بعد كل إجراء: يعمل فحص if/else خارج كتلة Serial.available(). ولولا إعادة الضبط هذه، لكرر البرنامج آخر أمر وأرسل “Lamp: ON” في كل دورة من loop(). وبإعادة الضبط يُنفَّذ كل أمر مرة واحدة.
- منطق المرحّل: تختلف وحدات المرحّل فيما بينها. فبعضها يعمل عندما يكون IN على HIGH (نشط عند HIGH، أي Active-HIGH)؛ وكثير من الوحدات المعزولة ضوئيًا يعمل عندما يكون IN على LOW (نشط عند LOW، أي Active-LOW)، وبعضها مزوّد بوصلة (Jumper) لاختيار الوضع. والوحدة التي أستخدمها في الفيديو من نوع Active-HIGH: فجهد 5 V على IN يغلق تلامس المرحّل فيضيء المصباح، و0 V يفتحه. إذا أضاء المصباح فور توصيل التغذية أو استجاب بشكل معكوس، فبدّل HIGH وLOW في البرنامج، بما في ذلك السطر الموجود في setup().
أعد توصيل الوحدة واختبر بالتطبيق نفسه. يُصدر المرحّل نقرة عند الضغط على “Turn ON”، ويُحرّر تلامسه عند الضغط على “Turn OFF”.
استكشاف الأخطاء وإصلاحها
مشكلات التوصيلات والعتاد
| المشكلة | السبب المحتمل | الحل |
|---|---|---|
| الهاتف لا يعثر على الوحدة | الوحدة غير متصلة بالتغذية أو ليست في وضع الإقران | تأكد من أن LED الوحدة يومض بسرعة. وتحقق من VCC وGND. وتأكد من تشغيل البلوتوث في الهاتف. |
| يفشل الاتصال، أو تبدو توصيلات TX/RX خاطئة | الطرفان TX وRX مُبدَّلان | يتصل TXD في الوحدة بـ RX في Arduino (الطرف 0)، ويتصل RXD في الوحدة بـ TX في Arduino (الطرف 1). أي أن الخطين متقاطعان. |
| LED لا يضيء ولا ينطفئ | طرف خاطئ أو مقاومة مفقودة | وصّل أنود LED بالطرف 7 عبر المقاومة 220 Ω، والكاثود بـ GND. وتحقق من الطرف 7 في الكود. |
| المرحّل يُصدر نقرة لكن المصباح يبقى مطفأً | توصيلات الشبكة الكهربائية عند المرحّل غير صحيحة | سلك الطور إلى COM، وسلك الطور للمصباح إلى NO، والمحايد مباشرةً إلى المصباح. |
| المصباح يضيء فور توصيل التغذية، أو يستجيب بشكل معكوس | وحدة مرحّل من نوع Active-LOW | بدّل HIGH وLOW في البرنامج، بما في ذلك setup(). وابحث في الوحدة عن وصلة H/L (Jumper). |
مشكلات الاتصال التسلسلي والتطبيق
| المشكلة | السبب المحتمل | الحل |
|---|---|---|
| لا استجابة من Arduino بعد الرفع | كانت الوحدة موصولة أثناء الرفع | افصل الوحدة عن الطرفين 0 و1 قبل الرفع. فمنفذ USB والوحدة يتشاركان هذين الطرفين. |
| التطبيق يتصل، لكن Arduino لا يستجيب | معدل الباود في Serial.begin() لا يطابق الوحدة، أو الأزرار ترسل أحرفًا خاطئة | اضبط Serial.begin(9600) (أو 38400). وتأكد من أن Button1 يرسل النص “1” وButton2 النص “0”، لا أعدادًا؛ فالبرنامج يقارن قيمًا حرفية (Character Literals). |
| LED وحدة HC-05 يومض ببطء، ومضة واحدة كل 2 s تقريبًا (وليس الومضة المزدوجة الدالة على الاتصال) | الوحدة في وضع أوامر AT (الطرف KEY على HIGH عند توصيل التغذية) | افصل الطرف KEY، ثم افصل تغذية الوحدة وأعد توصيلها. |
| LED وحدة HC-06 يبقى مضاءً، والتطبيق لا يستطيع الاتصال | الوحدة متصلة بالفعل بجهاز آخر | افصل الجهاز الآخر. |
| يعرض التطبيق “Not Connected” بعد اختيار الجهاز | الوحدة متصلة بجهاز آخر، أو انتهت صلاحية الإقران | ألغِ إقران الوحدة ثم أقرنها من جديد في إعدادات البلوتوث على الهاتف. وتأكد من عدم اتصال أي هاتف أو تطبيق آخر بالوحدة. |
| قائمة الأجهزة في التطبيق فارغة (Android 12 أو أحدث) | إذن الأجهزة المجاورة (Nearby devices) غير ممنوح | الإعدادات (Settings) ← التطبيقات (Apps) ← BluetoothControl ← الأذونات (Permissions)، ثم اسمح بـ Nearby devices. |
الأسئلة الشائعة
هل يمكنني التحكم في أكثر من LED واحد أو مرحّل واحد بهذا الإعداد؟ نعم. وسّع الكود بأحرف إضافية (‘2’، ‘3’، ‘A’، ‘B’)، يُخصَّص كل منها لطرف مختلف، وأضف في التطبيق زرًا لكل حرف. وتستخدم سيارة روبوتية يُتحكَّم بها عبر البلوتوث هذا الأسلوب في أوامر محركاتها.
هل يعمل هذا مع iPhone؟ لا. تستخدم HC-05 وHC-06 تقنية Bluetooth Classic مع ملف تعريف المنفذ التسلسلي (Serial Port Profile، SPP)، ولا يدعمه نظام iOS لهذا النوع من الوحدات. لذا يحتاج iPhone إلى وحدة BLE مثل HM-10، أو إلى ESP32 بما يتضمنه من BLE مدمج.
إلى أي مدى يصل اتصال البلوتوث؟ الوحدتان كلتاهما من أجهزة البلوتوث من الفئة Class 2، ويبلغ مداهما نحو 10 m (33 قدمًا) في الهواء الطلق. وتقلّل الجدران والأثاث هذا المدى.
هل يمكنني استخدام SoftwareSerial بدلًا من الطرفين 0 و1؟ نعم. تحوّل مكتبة SoftwareSerial طرفين رقميين آخرين إلى منفذ تسلسلي. وبذلك تتجنب التعارض أثناء الرفع، وتبقى الشاشة التسلسلية (Serial Monitor)، وهي نافذة برنامج Arduino لعرض النصوص التسلسلية، متاحة لتتبّع الأخطاء. ولا يمكن الاعتماد على SoftwareSerial عند معدلات الباود العالية، لذا أبقِه على 9600. وصّل TXD في الوحدة بالطرف 10، وRXD في الوحدة بالطرف 11 عبر مقسم الجهد نفسه. ومع Adafruit Motor Shield V1 في سياراتي الروبوتية، يقود الطرف 11 المحرك M1؛ لذا استخدم هناك A0 وA1.
هل يمكنني استخدام هذا مع لوحات Arduino الأخرى؟ نعم. في Uno وNano، استخدم التوصيلات والكود كما هو موضح. وفي Mega، تُعد Serial1 (الطرفان 18/19) وSerial2 (16/17) وSerial3 (14/15) بدائل تتجنب التعارض أثناء الرفع على الطرفين 0 و1. أما في Leonardo وMicro، فـ Serial هو منفذ USB؛ والوحدة الموصولة بالطرفين 0 و1 تكون على Serial1، لذا استبدل Serial بـ Serial1 في البرنامج.
المصادر والمشاريع التالية
مشاريع تالية للمبتدئين
- أساسيات برمجة Arduino: المداخل والمخارج الرقمية (Digital I/O) والمتغيرات والاتصال التسلسلي.
- دليل التحكم في محرك السيرفو باستخدام Arduino: أضف حركة السيرفو إلى أوامر البلوتوث.
- وحدة قيادة المحركات L298N مع Arduino: التحكم في محركات التيار المستمر للمركبات التي يُتحكَّم فيها بالبلوتوث. تحتوي L298N على جسرين من نوع H (H-Bridge)، وهي دوائر تدير محرك التيار المستمر في الاتجاهين. وتستخدم سياراتي الروبوتية دروع محركات (Motor Shields) تعمل على المبدأ نفسه.
مشاريع بلوتوث متقدمة
- سيارة روبوتية يُتحكَّم فيها بالبلوتوث: سيارة يُتحكَّم فيها بالهاتف الذكي، مبنية بـ Arduino وHC-05 وAdafruit Motor Shield.
- سيارة OmObi الروبوتية: نسخة مطوَّرة من السيارة الروبوتية العاملة بالبلوتوث، ذات هيكل مخصص مطبوع بتقنية الطباعة ثلاثية الأبعاد (3D).
- ذراع روبوتية بست درجات حرية (6-DOF) اصنعها بنفسك مع تحكم عبر البلوتوث: ذراع بستة محاور يُتحكَّم فيها من الهاتف عبر HC-05 وتطبيق مخصص.
- OmObiArm: روبوت متنقل بذراع روبوتية مدمجة: منصة متحركة مع ذراع، يُتحكَّم فيهما من تطبيق واحد.
- سيارة روبوتية لتجنب العوائق: سيارة ذاتية القيادة تتجنب العوائق باستخدام مستشعر الموجات فوق الصوتية.
الخطوة التالية: اربط مزيدًا من الأحرف بمزيد من الأطراف (راجع الأسئلة الشائعة)، أو ابنِ السيارة الروبوتية التي يُتحكَّم فيها بالبلوتوث من القائمة أعلاه. وإذا تصرفت وحدتك بشكل مختلف، فاكتب إصدارها ومعدل الباود الخاص بها في التعليقات.

رأيان حول “Arduino and HC-05/HC-06 Bluetooth Module Complete Tutorial”