سماعة بلوتوث باستخدام ESP32 و MAX98357A
في الحلقة العاشرة من سلسلة ESP32 من الصفر سنتعلم كيف نحول لوحة ESP32 إلى سماعة Bluetooth بسيطة تستقبل الصوت من الهاتف لاسلكيًا، ثم ترسله رقمياً عبر واجهة I2S إلى وحدة MAX98357A لتضخيمه وتشغيل مكبر صوت.
هذا المشروع فرصة عملية لفهم مسار الصوت الرقمي، والفرق بين Bluetooth Classic وواجهة I2S، ودور وحدة MAX98357A في تحويل البيانات الصوتية الرقمية إلى إشارة مناسبة لمكبر الصوت.
فيديو المشروع
شاهد الحلقة كاملة على قناة Naadi Tech – نادي الابتكار، ثم استخدم هذا المقال كمرجع للمكونات والتوصيلات والبرمجة.
فكرة المشروع

عند تشغيل مقطع صوتي على الهاتف، تنتقل البيانات الصوتية لاسلكيًا عبر Bluetooth Classic إلى لوحة ESP32 باستخدام ملف نقل الصوت A2DP. بعد ذلك ترسل ESP32 الصوت الرقمي إلى وحدة MAX98357A عبر واجهة I2S.
تستقبل وحدة MAX98357A البيانات الرقمية، وتحولها إلى إشارة صوتية كهربائية وتضخمها، ثم ترسلها مباشرة إلى مكبر الصوت.
مسار الصوت:
Phone → Bluetooth A2DP → ESP32 → I2S → MAX98357A → Speaker
ما هي واجهة I2S؟
I2S اختصار لـ Inter-IC Sound، وهي واجهة اتصال رقمية مخصصة لنقل البيانات الصوتية بين الدوائر الإلكترونية. في هذا المشروع نعتمد على ثلاث إشارات رئيسية:
| الإشارة | وظيفتها | منفذ ESP32 |
|---|---|---|
| BCLK | إشارة التوقيت Bit Clock لتنظيم نقل البتات الصوتية | GPIO14 |
| LRC / WS | تحديد القناة الصوتية اليسرى أو اليمنى | GPIO15 |
| DIN | استقبال البيانات الصوتية الرقمية في MAX98357A | GPIO22 |
المكونات المطلوبة
| المكون | العدد | ملاحظات |
|---|---|---|
| لوحة ESP32 | 1 | يجب أن تدعم Bluetooth Classic |
| وحدة MAX98357A | 1 | محول ومضخم صوت رقمي I2S |
| مكبر صوت 8Ω | 1 | قدرة 0.5W في التجربة |
| لوحة تجارب Breadboard | 1 | للتركيب والتجربة |
| أسلاك توصيل Jumper Wires | حسب الحاجة | لتوصيل المكونات |
| كابل USB | 1 | لبرمجة وتغذية ESP32 |
ملاحظة مهمة حول مكبر الصوت:
استخدمنا في التجربة مكبر صوت بمقاومة 8 أوم وقدرة 0.5 واط، لذلك استخدمنا مستوى صوت منخفضًا لتجنب تشغيل المكبر بقدرة أعلى من قدرته المسموح بها.
مخطط التوصيل
نبدأ بتوصيل التغذية الكهربائية لوحدة MAX98357A، ثم إشارات I2S، وأخيرًا مكبر الصوت.

| MAX98357A | التوصيل | الوظيفة |
|---|---|---|
| VIN | 3.3V في ESP32 | تغذية الوحدة |
| GND | GND في ESP32 | الأرضي |
| BCLK | GPIO14 | إشارة التوقيت |
| LRC | GPIO15 | اختيار القناة الصوتية |
| DIN | GPIO22 | البيانات الصوتية الرقمية |
| SPK+ | الطرف الموجب لمكبر الصوت | خرج الصوت الموجب |
| SPK- | الطرف السالب لمكبر الصوت | خرج الصوت السالب |
| GAIN | غير موصول في تجربتنا | التحكم في مستوى التضخيم |
| SD | غير موصول في تجربتنا | التحكم في تشغيل/إيقاف الوحدة |
تنبيه مهم:
لا توصل الطرف السالب لمكبر الصوت SPK- مع GND. يتم توصيل مكبر الصوت مباشرة بين خرجي SPK+ وSPK- في وحدة MAX98357A.
كيف يعمل المشروع؟
يمكن تقسيم عمل المشروع إلى أربع مراحل بسيطة:
- الهاتف يرسل الصوت عبر Bluetooth Classic باستخدام A2DP.
- لوحة ESP32 تستقبل البيانات الصوتية الرقمية.
- ESP32 ترسل البيانات إلى MAX98357A عبر إشارات I2S الثلاث.
- MAX98357A تحول البيانات الرقمية وتضخم الصوت لتشغيل مكبر الصوت.
تثبيت المكتبات
يعتمد البرنامج على مكتبتين: ESP32-A2DP لاستقبال الصوت عبر Bluetooth Classic، وArduino Audio Tools للتعامل مع مسار الصوت وواجهة I2S.
تثبيت ESP32-A2DP
حمّل المكتبة من مستودعها، ثم في Arduino IDE اختر:
Sketch → Include Library → Add .ZIP Library...
بعد ذلك حدد ملف ZIP الذي قمت بتحميله وانتظر حتى ينتهي Arduino IDE من تثبيت المكتبة.
تثبيت Arduino Audio Tools
كرر العملية نفسها مع مكتبة Arduino Audio Tools: حمّل ملف ZIP ثم استخدم خيار Add .ZIP Library... لإضافتها إلى Arduino IDE.
الروابط الرسمية للمكتبتين:
- ESP32-A2DP:
https://github.com/pschatzmann/ESP32-A2DP - Arduino Audio Tools:
https://github.com/pschatzmann/arduino-audio-tools
الكود الكامل للمشروع
أضف هنا الكود المستخدم في الفيديو باستخدام إضافة Code Block Pro حتى يظهر الكود بتنسيق واضح مع أرقام الأسطر وزر النسخ.
#include "AudioTools.h"
#include "BluetoothA2DPSink.h"
// I2S audio output
I2SStream i2s;
// Bluetooth audio receiver
BluetoothA2DPSink a2dp_sink(i2s);
// I2S pins
const int BCLK_PIN = 14;
const int LRC_PIN = 15;
const int DIN_PIN = 22;
void setup() {
Serial.begin(115200);
// Configure I2S as audio output
auto cfg = i2s.defaultConfig(TX_MODE);
cfg.pin_bck = BCLK_PIN;
cfg.pin_ws = LRC_PIN;
cfg.pin_data = DIN_PIN;
// Start I2S
i2s.begin(cfg);
// Low initial volume
a2dp_sink.set_volume(20);
// Start Bluetooth audio receiver
a2dp_sink.start("Naadi Tech Speaker");
Serial.println("Bluetooth speaker ready");
}
void loop() {
}
شرح الكود
استدعاء المكتبات
نبدأ باستدعاء المكتبتين اللازمتين للمشروع. تستخدم Audio Tools لإرسال الصوت الرقمي عبر I2S، بينما تسمح ESP32-A2DP باستقبال الصوت القادم من الهاتف عبر Bluetooth Classic.
إنشاء مسار I2S ومستقبل Bluetooth
ننشئ عنصرًا من نوع I2SStream ليكون مسؤولًا عن إخراج البيانات الصوتية عبر I2S، ثم عنصرًا من نوع BluetoothA2DPSink لاستقبال الصوت عبر البلوتوث وتمريره إلى مسار I2S.
تحديد منافذ I2S
يجب أن تتطابق أرقام المنافذ في البرنامج مع التوصيلات الفعلية للدائرة:
DIN → GPIO22LRC → GPIO15BCLK → GPIO14
تهيئة I2S داخل setup()
داخل دالة setup() نقوم بتشغيل الاتصال التسلسلي، ثم نحصل على الإعداد الافتراضي لـ I2S في وضع الإرسال TX_MODE. بعد ذلك نحدد منافذ البيانات والتوقيت والقناة، ثم نشغل واجهة I2S باستخدام begin().
تحديد مستوى الصوت وتشغيل Bluetooth
نحدد مستوى صوت منخفضًا في البداية باستخدام set_volume() بما يناسب مكبر الصوت الصغير المستخدم في التجربة. بعد ذلك نشغل مستقبل Bluetooth ونعطي السماعة الاسم:
نادي تك سبيكر
هذا هو الاسم الذي سيظهر في قائمة أجهزة Bluetooth على الهاتف.
لماذا دالة loop() فارغة؟
لا نحتاج إلى كتابة تعليمات متكررة داخل loop() لأن المكتبات تتولى إدارة استقبال البيانات الصوتية عبر Bluetooth وتمريرها إلى I2S في الخلفية.
رفع البرنامج وتجربة المشروع
بعد تركيب الدائرة وتثبيت المكتبات وإضافة الكود، قم بتوصيل ESP32 بالحاسوب باستخدام كابل USB. اختر نوع لوحة ESP32 ومنفذ الاتصال الصحيح في Arduino IDE ثم اضغط على Upload.
بعد انتهاء عملية الرفع:
- افتح إعدادات Bluetooth في الهاتف.
- فعّل Bluetooth وابحث عن الأجهزة القريبة.
- ابحث عن الجهاز باسم نادي تك سبيكر.
- اضغط عليه لإجراء الاقتران والاتصال.
- شغّل مقطعًا صوتيًا على الهاتف بمستوى صوت منخفض في البداية.
إذا كان كل شيء موصولًا بشكل صحيح، سيخرج الصوت من مكبر الصوت المتصل بوحدة MAX98357A.
ماذا يحدث عند فصل تغذية MAX98357A؟
في التجربة قمنا بفصل سلك VIN عن وحدة MAX98357A أثناء تشغيل الصوت. توقف الصوت الخارج من مكبر الصوت رغم استمرار المقطع على الهاتف واستمرار اتصال Bluetooth.
السبب هو أن ESP32 ما زالت تستقبل البيانات الصوتية، لكن وحدة MAX98357A لم تعد مزودة بالطاقة، وبالتالي لا تستطيع تحويل البيانات الرقمية وتضخيمها. عند إعادة سلك التغذية يعود الصوت من جديد.
مشاكل شائعة وحلولها
| المشكلة | ما الذي يجب التحقق منه؟ |
|---|---|
| اسم السماعة لا يظهر على الهاتف | تأكد من أن لوحة ESP32 المستخدمة تدعم Bluetooth Classic، وأن البرنامج رُفع بنجاح. |
| Bluetooth متصل لكن لا يوجد صوت | راجع توصيل VIN وGND وإشارات BCLK وLRC وDIN، وتأكد من توصيل مكبر الصوت بين SPK+ وSPK-. |
| الصوت متقطع أو غير واضح | ابدأ بمستوى صوت منخفض، راجع جودة التوصيلات، وتأكد من ثبات التغذية. |
| خطأ أثناء ترجمة البرنامج | تأكد من تثبيت ESP32-A2DP وArduino Audio Tools والإصدارات المتوافقة مع بيئة ESP32 المستخدمة. |
| لا يمكن رفع البرنامج | تحقق من نوع اللوحة ومنفذ COM وكابل USB وتعريف USB الخاص بلوحة ESP32. |
ملاحظة حول توافق لوحات ESP32:
هذا المشروع يحتاج إلى لوحة تدعم Bluetooth Classic. ليست كل عائلات ESP32 الحديثة توفر Bluetooth Classic، لذلك تحقق من إمكانات الشريحة الموجودة على لوحتك قبل تنفيذ المشروع.
ماذا تعلمنا؟
- كيفية استقبال الصوت من الهاتف عبر Bluetooth Classic.
- فكرة عمل بروتوكول A2DP لنقل الصوت عبر البلوتوث.
- كيفية نقل الصوت الرقمي من ESP32 باستخدام I2S.
- وظيفة إشارات BCLK وLRC وDIN.
- كيفية استخدام وحدة MAX98357A كمحول ومضخم صوت رقمي.
- كيفية تشغيل مكبر صوت صغير من مشروع ESP32.
كيف يمكن تطوير المشروع؟
بعد نجاح النسخة الأساسية يمكن تطوير السماعة بإضافة أزرار للتحكم في مستوى الصوت، أو بطارية لجعل المشروع محمولًا، أو تصميم صندوق مناسب لمكبر الصوت لتحسين جودة الصوت. ويمكن لاحقًا إضافة أزرار للتحكم في التشغيل والإيقاف والتنقل بين المقاطع.
الخلاصة
نجحنا في هذه الحلقة في تحويل ESP32 إلى سماعة Bluetooth بسيطة. الهاتف يرسل الصوت لاسلكيًا إلى ESP32، ثم تنتقل البيانات الرقمية عبر I2S إلى MAX98357A التي تتولى تحويلها وتضخيمها قبل إرسالها إلى مكبر الصوت.
إذا أعجبك المشروع، تابع باقي حلقات سلسلة ESP32 من الصفر على قناة Naadi Tech – نادي الابتكار.
تعلّم • جرّب • ابتكر
حوّل أفكارك إلى مشاريع إلكترونية حقيقية
