جدول المحتويات:
- اللوازم
- الخطوة 1: البناء - اللوح
- الخطوة 2: البناء - رؤوس الدفع / اللحام
- الخطوة 3: البناء - قم بتوصيل دبابيس الطاقة
- الخطوة 4: البناء - I2S Wiring
- الخطوة الخامسة: تثبيت مكتبة BtAudio
- الخطوة 6: استخدام مكتبة BtAudio
- الخطوة 7: DSP - التصفية
- الخطوة 8: DSP - ضغط النطاق الديناميكي
- الخطوة 9: واجهة Wifi
- الخطوة العاشرة: الخطط المستقبلية
2025 مؤلف: John Day | [email protected]. آخر تعديل: 2025-01-13 06:56
ملخص
عندما أفكر في البلوتوث أفكر في الموسيقى ولكن للأسف لا تستطيع معظم المتحكمات الدقيقة تشغيل الموسيقى عبر البلوتوث. يمكن لـ Raspberry Pi ولكن هذا جهاز كمبيوتر. أرغب في تطوير إطار عمل قائم على Arduino لوحدات التحكم الدقيقة لتشغيل الصوت عبر Bluetooth. لثني عضلات متحكم الدقيق الخاص بي بشكل كامل ، سأضيف معالجة الإشارات الرقمية في الوقت الفعلي (DSP) إلى الصوت (الترشيح عالي التمرير ، والترشيح المنخفض التمرير ، وضغط النطاق الديناميكي). بالنسبة إلى الكرز في الأعلى ، سأضيف خادم ويب يمكن استخدامه لتكوين DSP لاسلكيًا. يعرض الفيديو المضمن أساسيات صوت Bluetooth أثناء العمل. يُظهر لي أيضًا استخدام خادم الويب لإجراء بعض التصفية عالية التمرير والتصفية منخفضة التمرير وضغط النطاق الديناميكي. يتسبب الاستخدام الأول لضغط النطاق الديناميكي في حدوث تشويه كمثال على اختيارات المعلمات الضعيفة. المثال الثاني يزيل هذا التشويه.
بالنسبة لهذا المشروع ، يعد ESP32 هو المتحكم الدقيق المفضل. تكلفته أقل من 10 جنيهات إسترلينية وهي مليئة بالميزات مع ADCs و DACs و Wifi و Bluetooth Low Energy و Bluetooth Classic ومعالج ثنائي النواة بسرعة 240 ميجاهرتز. يمكن لـ DAC الموجود على اللوحة تشغيل الصوت تقنيًا ولكنه لن يبدو رائعًا. بدلاً من ذلك ، سأستخدم وحدة فك ترميز استريو Adafruit I2S لإنتاج إشارة خروج. يمكن إرسال هذه الإشارة بسهولة إلى أي نظام HiFi لإضافة صوت لاسلكي على الفور إلى نظام HiFi الحالي لديك.
اللوازم
نأمل أن يكون لدى معظم المصنّعين ألواح توصيل ، وصلات توصيل ، كابلات USB ، مكاوي لحام لإمداد الطاقة وسيتعين عليهم فقط إنفاق 15 جنيهًا إسترلينيًا على ESP32 وفك تشفير الاستريو. إذا لم يكن الأمر كذلك ، فإن جميع الأجزاء المطلوبة مذكورة أدناه.
- ESP32 - تم اختباره على ESP32-PICO-KIT و TinyPico - 9.50 جنيهًا إسترلينيًا / 24 جنيهًا إسترلينيًا
- Adafruit I2S Stereo Decoder - 5.51 جنيه إسترليني
- اللوح - 3 جنيهات إسترلينية لكل 5 جنيهات إسترلينية
- أسلاك العبور - 3 جنيهات إسترلينية
- سماعات سلكية / نظام هاي فاي - $$ $
- رؤوس الدفع أو مكواة اللحام - 2.10 جنيه إسترليني / 30 جنيه إسترليني
- كابل Micro USB - 2.10 جنيه إسترليني / 3 جنيهات إسترلينية
- 3.5 ملم إلى موصل RCA / مقبس 3.5 ملم للمقبس (أو أيًا كان ما يحتاجه مكبر الصوت الخاص بك) - 2.40 جنيه إسترليني / 1.50 جنيه إسترليني
- مصدر طاقة USB - 5 جنيهات إسترلينية
الخطوة 1: البناء - اللوح
إذا اشتريت ESP32-PICO-KIT ، فلن تضطر إلى لحام أي دبابيس لأنها تأتي ملحومة مسبقًا. ببساطة ضعه على اللوح.
الخطوة 2: البناء - رؤوس الدفع / اللحام
إذا كان لديك مكواة لحام ، فقم بلحام المسامير في وحدة فك ترميز الاستريو وفقًا للتعليمات الموجودة على موقع Adafruit. في وقت كتابة هذا التقرير ، كانت مكواة اللحام الخاصة بي تعمل وتم إغلاقها. لم أكن أرغب في دفع ثمن مكواة لحام مؤقتة ، لذا قمت بتقطيع بعض رؤوس الدفع من بيموروني. قمت بتقطيعها حتى تناسب وحدة فك ترميز الاستريو. ليس هذا هو الحل الأفضل (وليس كيف كان الغرض من استخدام الرؤوس) ولكنه أرخص بديل لمكواة اللحام. قم بفتح رأس القطع على اللوح. يجب أن تحتاج فقط إلى سطر واحد من 6 دبابيس لوحدة فك التشفير. يمكنك إضافة ستة أخرى إلى الجانب الآخر من أجل الاستقرار ولكن هذا ليس ضروريًا لنظام النموذج الأولي هذا. المسامير المراد فتحها في الرؤوس هي vin و 3vo و gnd و wsel و din و bclk.
الخطوة 3: البناء - قم بتوصيل دبابيس الطاقة
ضع وحدة فك ترميز الاستريو على موصلات الدفع (دبابيس vin و 3vo و gnd و wsel و din و bclk) وادفعهم معًا بقوة. مرة أخرى ، يجب أن يتم ذلك بشكل مثالي باستخدام مكواة لحام ولكن كان علي الارتجال. ستلاحظ أن جميع الأسلاك الموجودة في هذا الدليل زرقاء. هذا لأنه لم يكن لدي أي أسلاك توصيل ، لذا قمت بقطع سلك طويل واحد إلى قطع أصغر. أيضًا ، أنا مصاب بعمى الألوان ولا أهتم حقًا بلون السلك. يتم توصيل دبابيس الطاقة على النحو التالي:
3v3 (ESP32) -> لفين في وحدة فك ترميز الاستريو
gnd (ESP32) -> لتشغيل وحدة فك ترميز الاستريو
الخطوة 4: البناء - I2S Wiring
لإرسال صوت Bluetooth من ESP32 إلى وحدة فك ترميز الاستريو ، سنستخدم طريقة اتصال رقمية تسمى I2S. ستأخذ وحدة فك ترميز الاستريو هذه الإشارة الرقمية وتحولها إلى إشارة تناظرية يمكن توصيلها بمكبر صوت أو HiFi. تتطلب I2S 3 أسلاك فقط ومن السهل فهمها بشكل معقول. يتحول خط ساعة البت (bclk) إلى أعلى ومنخفض للإشارة إلى إرسال بت جديد. يتحول خط إخراج البيانات (dout) عاليًا أو منخفضًا للإشارة إلى ما إذا كان هذا البت يحتوي على قيمة 0 أو 1 ويتحول خط تحديد الكلمة (wsel) إلى ارتفاع أو انخفاض للإشارة إلى ما إذا كان يتم نقل القناة اليسرى أو اليمنى. ليس كل متحكم يدعم I2S لكن ESP32 به خطان I2S. هذا يجعله اختيارًا واضحًا لهذا المشروع.
الأسلاك كالتالي:
27 (ESP32) -> wsel (وحدة فك ترميز ستيريو)
25 (ESP32) -> din (وحدة فك ترميز ستيريو)
26 (ESP32) -> bclk (وحدة فك ترميز ستيريو)
الخطوة الخامسة: تثبيت مكتبة BtAudio
إذا لم تكن قد قمت بتثبيتها بالفعل ، فقم بتثبيت Arduino IDE و Arduino core لـ ESP32. بمجرد تثبيتها ، قم بزيارة صفحة Github الخاصة بي وقم بتنزيل المستودع. ضمن Arduino IDE ضمن Sketch >> Include Library >> حدد "Add. ZIP library". ثم حدد الملف المضغوط الذي تم تنزيله. يجب أن يضيف هذا مكتبة btAudio الخاصة بي إلى مكتبات Arduino الخاصة بك. لاستخدام المكتبة ، سيتعين عليك تضمين الرأس ذي الصلة في رسم Arduino. سترى هذا في الخطوة التالية.
الخطوة 6: استخدام مكتبة BtAudio
بمجرد التثبيت ، قم بتوصيل ESP32 بجهاز الكمبيوتر الخاص بك عبر micro USB ثم قم بتوصيل وحدة فك ترميز الاستريو بمكبر الصوت الخاص بك باستخدام السلك مقاس 3.5 مم. قبل تحميل الرسم التخطيطي ، ستحتاج إلى تغيير بعض الأشياء في محرر Arduino. بعد تحديد منتداك ، ستحتاج إلى تعديل مخطط التقسيم ضمن أدوات >> مخطط التقسيم وتحديد إما "No OTA (تطبيق كبير)" أو "Minimal SPIFFS (تطبيقات كبيرة مع OTA)". يعد هذا ضروريًا لأن هذا المشروع يستخدم كلاً من WiFi و Bluetooth وهما مكتبات ثقيلة للذاكرة. بمجرد الانتهاء من هذا ، قم بتحميل الرسم التخطيطي التالي إلى ESP32.
#يشمل
// يعين اسم جهاز الصوت btAudio audio = btAudio ("ESP_Speaker") ؛ إعداد باطل () {// دفق البيانات الصوتية إلى ESP32 audio.begin () ؛ // إخراج البيانات المستلمة إلى I2S DAC int bck = 26 ؛ int ws = 27 ؛ نوبة int = 25 ؛ audio. I2S (bck، dout، ws) ؛ } حلقة فارغة() { }
يمكن تقسيم الرسم التخطيطي على نطاق واسع إلى 3 خطوات:
- قم بإنشاء كائن btAudio عام يقوم بتعيين "اسم Bluetooth" الخاص بـ ESP32
- قم بتكوين ESP32 لاستقبال الصوت باستخدام طريقة btAudio:: start
- اضبط دبابيس I2S باستخدام طريقة btAudio:: I2S.
هذا كل شيء على جانب البرنامج! الآن كل ما عليك فعله هو بدء اتصال Bluetooth بجهاز ESP32 الخاص بك. ما عليك سوى البحث عن أجهزة جديدة على هاتفك / الكمبيوتر المحمول / مشغل MP3 وسيظهر "ESP_Speaker". بمجرد أن تشعر بالسعادة لأن كل شيء يعمل (تشغيل الموسيقى) ، يمكنك فصل ESP32 من جهاز الكمبيوتر الخاص بك. قم بتشغيله باستخدام مصدر طاقة USB وسيتذكر الرمز الأخير الذي قمت بتحميله إليه. بهذه الطريقة ، يمكنك ترك ESP32 مخفيًا خلف نظام HiFi إلى الأبد.
الخطوة 7: DSP - التصفية
تمديد جهاز الاستقبال بمعالجة الإشارات الرقمية
إذا اتبعت جميع الخطوات (ولم أترك أي شيء) ، فلديك الآن جهاز استقبال Bluetooth يعمل بكامل طاقته لنظام HiFi الخاص بك. في حين أن هذا رائع ، إلا أنه لا يدفع بالمتحكم الدقيق إلى أقصى حدوده. يحتوي ESP32 على قلبين يعملان بسرعة 240 ميجاهرتز. هذا يعني أن هذا المشروع هو أكثر بكثير من مجرد جهاز استقبال. لديه القدرة على أن يكون جهاز استقبال Bluetooth مزودًا بمعالج إشارة رقمية (DSP). يقوم DSPs بشكل أساسي بإجراء عمليات حسابية على الإشارة في الوقت الفعلي. إحدى العمليات المفيدة تسمى التصفية الرقمية. تعمل هذه العملية على إضعاف الترددات في إشارة أدنى أو أعلى من تردد قطع معين ، اعتمادًا على ما إذا كنت تستخدم مرشح تمرير عالي أو منخفض.
مرشحات عالية التمرير
تعمل مرشحات High-Pass على توهين الترددات التي تقل عن نطاق معين. لقد قمت ببناء مكتبة فلاتر لأنظمة Arduino بناءً على كود من earlevel.com. الاختلاف الرئيسي هو أنني قمت بتغيير هيكل الفصل للسماح ببناء فلاتر ذات ترتيب أعلى بسهولة أكبر. تعمل المرشحات ذات الترتيب الأعلى على منع الترددات التي تتجاوز حد القطع بشكل أكثر فاعلية ولكنها تتطلب قدرًا أكبر من الحساب. ومع ذلك ، مع التنفيذ الحالي ، يمكنك حتى استخدام مرشحات الترتيب السادس للصوت في الوقت الفعلي!
الرسم هو نفسه الموجود في الخطوة السابقة باستثناء أننا قمنا بتغيير الحلقة الرئيسية. لتمكين المرشحات ، نستخدم طريقة btAudio:: createFilter. تقبل هذه الطريقة 3 حجج. الأول هو عدد شلالات الفلتر. عدد شلالات المرشح هو نصف ترتيب المرشح. بالنسبة لمرشح الترتيب السادس ، يجب أن تكون الوسيطة الأولى 3. بالنسبة لمرشح الترتيب الثامن ، ستكون 4. الوسيطة الثانية هي تصفية عامل التصفية. لقد قمت بتعيين هذا على 1000 هرتز ليكون له تأثير كبير على البيانات. أخيرًا ، نحدد نوع الملف بالمتغير الثالث. يجب أن يكون هذا ممرًا عاليًا لمرشح تمرير عالي وممر منخفض لمرشح تمرير منخفض. يقوم البرنامج النصي أدناه بتبديل قطع هذا التردد بين 1000 هرتز و 2 هرتز. يجب أن تسمع تأثيرًا مثيرًا على البيانات.
#يشمل
btAudio audio = btAudio ("ESP_Speaker") ؛ إعداد باطل () {audio.begin () ، int bck = 26 ؛ int ws = 27 ؛ نوبة int = 25 ؛ audio. I2S (bck، dout، ws) ؛ } void loop () {delay (5000)؛ audio.createFilter (3 ، 1000 ، highpass) ؛ تأخير (5000) ؛ audio.createFilter (3، 2، highpass) ؛ }
مرشحات الترددات المنخفضة
تعمل مرشحات التمرير المنخفض على عكس مرشحات التمرير العالي وتقمع الترددات فوق تردد معين. يمكن تنفيذها بنفس طريقة مرشحات التمرير العالي باستثناء أنها تتطلب تغيير الوسيطة الثالثة إلى lowpass. بالنسبة للرسم أدناه ، قمت بتبديل قطع التمرير المنخفض بين 2000 هرتز و 20000 هرتز. نأمل أن تسمع الفرق. يجب أن يبدو الصوت مكتومًا تمامًا عندما يكون مرشح الترددات المنخفضة عند 2000 هرتز.
#يشمل
btAudio audio = btAudio ("ESP_Speaker") ؛ إعداد باطل () {audio.begin () ، int bck = 26 ؛ int ws = 27 ؛ نوبة int = 25 ؛ audio. I2S (bck، dout، ws) ؛ } void loop () {delay (5000)؛ audio.createFilter (3 ، 2000 ، تمرير منخفض) ؛ تأخير (5000) ؛ audio.createFilter (3 ، 20000 ، ممر منخفض) ؛ }
الخطوة 8: DSP - ضغط النطاق الديناميكي
خلفية
ضغط النطاق الديناميكي هو طريقة معالجة الإشارة التي تحاول معادلة ارتفاع الصوت. يقوم بضغط الأصوات العالية ، التي ترتفع فوق عتبة معينة ، إلى مستوى الأصوات الهادئة ، ثم يقوم بتضخيم كليهما اختياريًا. والنتيجة هي تجربة استماع أكثر تكافؤًا. جاء هذا مفيدًا حقًا أثناء مشاهدة عرض بموسيقى خلفية صاخبة للغاية وغناء هادئ للغاية. في هذه الحالة ، لم تساعد مجرد زيادة مستوى الصوت لأن هذا أدى فقط إلى تضخيم موسيقى الخلفية. باستخدام ضغط النطاق الديناميكي ، يمكنني تقليل موسيقى الخلفية الصاخبة إلى مستوى الأصوات وسماع كل شيء بشكل صحيح مرة أخرى.
الرمز
لا يتضمن ضغط النطاق الديناميكي فقط خفض مستوى الصوت أو عتبة الإشارة. إنه أكثر ذكاءً من ذلك بقليل. إذا خفضت مستوى الصوت ، فسيتم تقليل الأصوات الهادئة بالإضافة إلى الأصوات العالية. طريقة واحدة للتغلب على هذا هي عتبة الإشارة ولكن هذا يؤدي إلى تشويه شديد. يتضمن ضغط النطاق الديناميكي مزيجًا من العتبة الناعمة والتصفية لتقليل التشوه الذي قد يحصل عليه المرء إذا كنت تريد عتبة / قص الإشارة. والنتيجة إشارة حيث يتم "قص" الأصوات العالية بدون تشويه وترك الأصوات الهادئة كما هي. يقوم الكود أدناه بالتبديل بين ثلاثة مستويات مختلفة من الضغط.
- ضغط مع تشويه
- ضغط بدون تشويه
- لا يوجد ضغط
#يشمل
btAudio audio = btAudio ("ESP_Speaker") ؛ إعداد باطل () {audio.begin () ، int bck = 26 ؛ int ws = 27 ؛ نوبة int = 25 ؛ audio. I2S (bck، dout، ws) ؛ } void loop () {delay (5000)؛ audio.compress (30 ، 0.0001 ، 0.0001 ، 10 ، 10 ، 0) ؛ تأخير (5000) ؛ audio.compress (30 ، 0.0001 ، 0.1 ، 10 ، 10 ، 0) ؛ تأخير (5000) ؛ audio.decompress () ، }
يعد ضغط النطاق الديناميكي معقدًا ولدى طرق btAudio:: compress العديد من المعلمات. سأحاول شرحها (بالترتيب) هنا:
- العتبة - المستوى الذي يتم عنده خفض الصوت (يُقاس بالديسيبل)
- وقت الهجوم - الوقت الذي يستغرقه الضاغط لبدء العمل بمجرد تجاوز الحد
- وقت التحرير - الوقت الذي يستغرقه الضاغط للتوقف عن العمل.
- نسبة التخفيض - العامل الذي يتم من خلاله ضغط الصوت.
- عرض الركبة - العرض (بالديسيبل) حول العتبة التي يعمل عندها الضاغط جزئيًا (صوت أكثر طبيعية).
- الكسب (ديسيبل) يضاف إلى الإشارة بعد الضغط (زيادة / تقليل الحجم)
يرجع التشويه المسموع للغاية في الاستخدام الأول للضغط إلى أن الحد الأدنى منخفض جدًا ووقت الهجوم ووقت التحرير قصير جدًا مما يؤدي إلى سلوك عتبة قاسية. يتم حل هذا بوضوح في الحالة الثانية عن طريق زيادة وقت الإصدار. يؤدي هذا بشكل أساسي إلى عمل الضاغط بطريقة أكثر سلاسة. هنا ، لقد أوضحت فقط كيف يمكن أن يكون لتغيير معلمة واحدة تأثير كبير على الصوت. الآن حان دورك لتجربة معايير مختلفة.
التنفيذ (الرياضيات السحرية - اختياري)
لقد وجدت أن تنفيذ ضغط النطاق الديناميكي بسذاجة يمثل تحديًا. تتطلب الخوارزمية تحويل عدد صحيح 16 بت إلى ديسيبل ثم تحويله مرة أخرى إلى عدد صحيح 16 بت بمجرد معالجة الإشارة. لقد لاحظت أن سطرًا واحدًا من التعليمات البرمجية كان يستغرق 10 ميكروثانية لمعالجة بيانات الاستريو. نظرًا لأن عينات صوت الاستريو التي يتم أخذ عينات منها عند 44.1 كيلو هرتز لا تترك سوى 11.3 ميكروثانية لـ DSP ، فهذا بطيء بشكل غير مقبول … ومع ذلك ، من خلال الجمع بين جدول بحث صغير (400 بايت) وإجراء استيفاء استنادًا إلى اختلافات Netwon المقسمة ، يمكننا الحصول على دقة 17 بت تقريبًا في 0.2 ميكروثانية. لقد أرفقت مستندًا بتنسيق pdf يحتوي على جميع الرياضيات للمهتمين حقًا. الأمر معقد ، لقد تم تحذيرك!
الخطوة 9: واجهة Wifi
الآن لديك مستقبل Bluetooth قادر على تشغيل DSP في الوقت الحقيقي. للأسف ، إذا كنت تريد تغيير أي من معلمات DSP ، فستحتاج إلى قطع الاتصال بـ HiFi ، وتحميل رسم تخطيطي جديد ثم إعادة الاتصال. هذا صعب. لإصلاح ذلك ، قمت بتطوير خادم ويب يمكنك استخدامه لتحرير جميع معلمات DSP دون إعادة الاتصال بجهاز الكمبيوتر الخاص بك. الرسم البياني لاستخدام خادم الويب أدناه.
#يشمل
# تضمين btAudio audio = btAudio ("ESP_Speaker") ؛ الويب webDSP ؛ إعداد باطل () {Serial.begin (115200) ؛ audio.begin () ، int bck = 26 ؛ int ws = 27 ؛ نوبة int = 25 ؛ audio. I2S (bck، dout، ws) ؛ // استبدل بمعرف WiFi وكلمة المرور const char * ssid = "SSID" ؛ const char * password = "PASSWORD" ؛ web.begin (ssid وكلمة المرور والصوت) ؛ } void loop () {web._server.handleClient ()؛ }
يقوم الرمز بتعيين عنوان IP لجهاز ESP32 الخاص بك والذي يمكنك استخدامه للوصول إلى صفحة الويب. في المرة الأولى التي تقوم فيها بتشغيل هذا الرمز ، يجب أن يتم إرفاقه بجهاز الكمبيوتر الخاص بك. بهذه الطريقة يمكنك رؤية عنوان IP المخصص لـ ESP32 على الشاشة التسلسلية. إذا كنت ترغب في الوصول إلى صفحة الويب هذه ، فما عليك سوى إدخال عنوان IP هذا في أي متصفح ويب (تم اختباره على Chrome).
الآن يجب أن نكون على دراية بطريقة تمكين Bluetooth و I2S. الاختلاف الرئيسي هو استخدام كائن webDSP. يأخذ هذا الكائن Wifi SSID وكلمة المرور كوسائط بالإضافة إلى مؤشر لكائن btAudio. في الحلقة الرئيسية ، نحصل باستمرار على كائن webDSP للاستماع إلى البيانات الواردة من صفحة الويب ثم تحديث معلمات DSP. كنقطة إغلاق ، تجدر الإشارة إلى أن كلاً من Bluetooth و Wifi يستخدمان نفس الراديو على ESP32. هذا يعني أنه قد يتعين عليك الانتظار لمدة تصل إلى 10 ثوانٍ من إدخال المعلمات على صفحة الويب إلى الوقت الذي تصل فيه المعلومات فعليًا إلى ESP32.
الخطوة العاشرة: الخطط المستقبلية
نأمل أن تكون قد استمتعت بهذه التعليمات ولديك الآن Bluetooth Audio و DSP المضافة إلى HiFi. ومع ذلك ، أعتقد أن هناك مجالًا كبيرًا للنمو في هذا المشروع وأردت فقط أن أشير إلى بعض الاتجاهات المستقبلية التي قد أتخذها.
- تمكين دفق الصوت عبر Wifi (للحصول على أفضل جودة صوت)
- استخدم ميكروفون I2S لتمكين الأوامر الصوتية
- تطوير موازن يتم التحكم فيه عن طريق WiFi
- اجعلها جميلة (اللوح لا يصرخ بتصميم منتج رائع)
عندما أتحكم في تنفيذ هذه الأفكار ، سأقدم المزيد من التعليمات. أو ربما يقوم شخص آخر بتنفيذ هذه الميزات. هذه هي متعة جعل كل شيء مفتوح المصدر!