شرح كامل لوحدة البلوتوث HC-05/HC-06 مع Arduino

يحتوي هذا المقال على روابط تسويق بالعمولة مُعلَّمة بعلامة *. بصفتي شريكًا في برنامج Amazon Associates، أربح من عمليات الشراء المؤهلة، دون أي تكلفة إضافية عليك. يساعد ذلك على إبقاء الشروحات مجانية.

يُحمَّل الفيديو من YouTube (Google)، وقد يضع ملفات تعريف الارتباط (Cookies). سياسة الخصوصية

ملخص سريع

توصّل وحدة بلوتوث 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-05HC-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 الافتراضي12341234 (بعض الوحدات: 0000)

Class 2 فئة من فئات قدرة الإرسال في البلوتوث؛ وتصل أجهزة Class 2 إلى نحو 10 m. وVCC هو طرف التغذية في لوحة التوصيل (Breakout Board)، وهي اللوحة الحاملة الصغيرة ذات الأطراف التي تُركَّب عليها الوحدة. أما أوامر AT فهي أوامر نصية قصيرة تقرأ إعدادات الوحدة أو تغيّرها، مثل الاسم ورمز PIN ومعدل الباود. وتقبلها HC-05 في وضع أوامر AT الخاص بها، الذي يعمل بسرعة 38400 باود.

كيف يعمل اتصال البلوتوث

  1. المنفذ التسلسلي في Arduino: ترسل لوحة Arduino البيانات عبر الطرف TX (الطرف 1) وتستقبلها عبر الطرف RX (الطرف 0). تضبط الدالة Serial.begin() السرعة بالبت في الثانية (معدل الباود)؛ وتقرأ الدالة Serial.read() بايتًا واحدًا مُستقبَلًا.
  2. وحدة البلوتوث: جسر تسلسلي لاسلكي. يصل كل بايت يرسله الهاتف إلى الطرف RX في Arduino دون تغيير، كأنه جاء عبر كابل USB.
  3. تطبيق الهاتف: يرسل حرفًا واحدًا لكل أمر، ‘1’ للتشغيل (ON) و‘0’ للإطفاء (OFF).
  4. برنامج Arduino (Sketch) (البرنامج الذي يعمل على اللوحة): يقرأ الحرف ويضبط الطرف 7 على HIGH (5 V) أو LOW (0 V)، فيؤدي ذلك إلى تشغيل مصباح LED أو المرحّل أو إطفائه.
Signal flow of Project 2: Turn ON in the app sends 1 and the Arduino Uno puts 5 V on the relay, so the lamp lights; Turn OFF sends 0, the Arduino outputs 0 V and the lamp goes off

ويصلح نمط الحرف الواحد نفسه للمحركات ومحركات السيرفو والشاشات. ولمعرفة المزيد عن اللوحة نفسها، راجع ما هو Arduino وكيف يعمل.

المكونات

المكونات الأساسية (للمشروعين كليهما)

المكوّنالكميةملاحظات
وحدة بلوتوث HC-05 أو HC-061تصلح أيٌّ من الوحدتين للمشروعين كليهما
Arduino Uno أو Nano أو Mega1للوحات الأخرى، راجع الأسئلة الشائعة
مقاومة 1 kΩ1مقسم الجهد
مقاومة 2 kΩ1مقسم الجهد (أو مقاومتان 1 kΩ على التوالي)
لوحة التجارب (Breadboard)1لتوصيلات النماذج الأولية
أسلاك توصيل Jumper (ذكر-ذكر)عدةالتوصيلات بين اللوحة ولوحة التجارب والوحدة
كابل USB للوحتك1USB-B للوحتي Uno/Mega؛ وMini-USB أو Micro-USB أو USB-C للوحة Nano، حسب الإصدار
هاتف ذكي أو جهاز لوحي يعمل بنظام Android1يشغّل تطبيق التحكم

مكونات إضافية للمشروع 1: التحكم في LED

المكوّنالكميةملاحظات
LED (أي لون)1LED قياسي 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ملاحظات
VCC5 Vتغذية الوحدة بالطاقة
GNDGNDأرضي مشترك
TXDRX (الطرف 0)إرسال الوحدة ← استقبال Arduino
RXDTX (الطرف 1)عبر مقسم الجهد (1 kΩ + 2 kΩ)
طرف LEDطرف Arduinoملاحظات
الأنود (الساق الطويلة)الطرف 7، عبر المقاومة 220 Ωطرف خرج رقمي
الكاثود (الساق القصيرة)GNDأرضي مشترك
Wiring diagram for Project 1: HC-05 Bluetooth module and an LED wired directly to an Arduino Uno, LED on pin 7 and 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: إنشاء مشروع

  1. افتح MIT App Inventor وسجّل الدخول بحساب Google الخاص بك.
  2. انقر على “Start New Project” وسمِّه “BluetoothControl”.

الخطوة 2: تصميم واجهة المستخدم

اضبط خاصية Title للشاشة Screen1 على “Bluetooth Control”. ثم أضف في عرض Designer المكونات التالية واحتفظ بأسمائها الافتراضية، لأن الكتل أدناه تستخدمها:

  1. Label1: النص “Not Connected”. ويعرض حالة الاتصال.
  2. ListPicker1: النص “Select Bluetooth Device”. ويعرض قائمة بأجهزة البلوتوث المقترنة مسبقًا بالهاتف.
  3. Button1: النص “Turn ON”.
  4. Button2: النص “Turn OFF”.
  5. 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"
  1. ListPicker1.BeforePicking تحمّل أسماء جميع الأجهزة المقترنة وعناوينها في القائمة قبل فتحها.
  2. ListPicker1.AfterPicking تتصل بالجهاز المحدد. فإذا نجح الاتصال، يعرض Label1 النص “Connected”؛ وإلا يبقى على “Not Connected”.
  3. Button1.Click و Button2.Click ترسلان النص “1” أو “0” ما دام الاتصال مفتوحًا. وتقرأ لوحة Arduino هذين الحرفين وتتصرف وفقهما.
MIT App Inventor blocks of the control app: ListPicker1 BeforePicking and AfterPicking, Button1 sends 1, Button2 sends 0

الخطوة 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: إقران وحدة البلوتوث

  1. غذِّ لوحة Arduino عبر USB أو من مصدر طاقة خارجي. يومض LED الوحدة بسرعة: أي أنها في وضع الإقران وتنتظر اتصالًا.
  2. على هاتفك بنظام Android، افتح الإعدادات (Settings) → Bluetooth وشغّل البلوتوث.
  3. ابحث عن الأجهزة. تظهر الوحدة باسم “HC-05” أو “HC-06”؛ وتستخدم بعض الوحدات اسمًا آخر، مثل “linvor” في إصدارات البرنامج الثابت القديمة لوحدة HC-06.
  4. اضغط عليها للإقران وأدخل رمز PIN 1234 (في بعض وحدات HC-06: 0000).
  5. تظهر الوحدة الآن ضمن “Paired devices” (الأجهزة المقترنة). ولا يغيّر الإقران وحده حالة LED. وبمجرد اتصال التطبيق، يومض LED وحدة HC-05 مرتين كل 2 s تقريبًا، ويبقى LED وحدة HC-06 مضاءً.

الخطوة 2: الاتصال عبر التطبيق

  1. افتح تطبيق BluetoothControl.
  2. اضغط على “Select Bluetooth Device”. تعرض القائمة الأجهزة المقترنة.
  3. اختر الوحدة. يتغير Label1 إلى “Connected”.
  4. اضغط “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ملاحظات
VCC5 Vتغذية وحدة المرحّل
GNDGNDأرضي مشترك
INالطرف 7إشارة التحكم من Arduino
السلكيتصل بـملاحظات
خط الطور في الشبكة (L)COM في المرحّللا يُقطع ويُوصل إلا سلك الطور
سلك الطور للمصباحNO في المرحّليتصل بـ COM أثناء تشغيل المرحّل
الخط المحايد في الشبكة (N)السلك المحايد للمصباح، مباشرةًلا يمر عبر المرحّل
التأريض الواقي (PE، أخضر-أصفر)طرف التأريض في المصباح، مباشرةًضروري للمصابيح ذات الهيكل المعدني؛ ولا يمر عبر المرحّل أبدًا
Wiring diagram for Project 2: HC-05 Bluetooth module and relay module wired to an Arduino Uno, relay IN on pin 7, lamp switched through COM and NO

يُظهر هذا المخطط أيضًا التوصيلات المباشرة فقط. أبقِ مقسم الجهد من المشروع 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 and HC-05/HC-06 Bluetooth Module Complete Tutorial”

أضف تعليق