- A2DP
- تحضير Raspberry Pi للإعداد بدون رأس
- المتطلبات الأساسية ليتم تثبيتها في Raspberry Pi
- إقران جهاز Bluetooth مع Raspberry Pi
- أتمتة عملية اقتران البلوتوث باستخدام برامج Python النصية
- قم بتشغيل البرنامج النصي لإقران البلوتوث باستخدام زر
- مخطط الرسم البياني
- قم بإعداد وظيفة Cron لبدء تشغيل برنامج Python الخاص بسماعات Bluetooth عند التمهيد
Raspberry Pi هو كمبيوتر بحجم راحة اليد يحتوي على تقنية Bluetooth و Wi-Fi ومنفذ Ethernet ومنفذ كاميرا وما إلى ذلك مما يجعله متحكمًا دقيقًا أكثر ملاءمة للتطبيقات المضمنة القائمة على إنترنت الأشياء. يتم استخدامه أيضًا لإنشاء العديد من أنواع الخوادم مثل خادم الطباعة وخادم الوسائط وخادم الويب وما إلى ذلك. اليوم سنتعلم كيف يمكن لـ Raspberry Pi تحويل مكبر صوت عادي به مقبس 3.5 مم إلى مكبر صوت بلوتوث لاسلكي.
في هذا المنشور ، سنبني مكبر صوت Bluetooth قائم على Raspberry Pi من خلال دمج قوة A2DP و Linux وبرنامج ترميز الصوت لدفق حزم البيانات من مصدر صوتي إلى حوض صوت لاسلكيًا. للقيام بذلك ، سنقوم باختراق نظام Linux قليلاً وكتابة جزء من التعليمات البرمجية في bash و python وسنكون في مجال الأعمال.
A2DP
A2DP هو اختصار لملف توزيع الصوت المتقدم. هذا بروتوكول موجود في جميع الأجهزة التي تدعم تقنية Bluetooth تقريبًا. يمهد الطريق لنقل بيانات الصوت من جهاز إلى آخر بشرط أن يكون كلاهما متصلين ببعضهما البعض عبر البلوتوث. يستخدم A2dp خوارزمية ضغط بدون فقدان لضغط حزم الصوت قبل الإرسال لتقليل زمن الوصول ولكن الخسائر الناجمة عن هذا الضغط لا يمكن إدراكها للآذان البشرية.
تحضير Raspberry Pi للإعداد بدون رأس
لتحويل Raspberry Pi إلى مكبر صوت لاسلكي ، قم أولاً بتثبيت نظام التشغيل (Raspbian Stretch) في بطاقة Raspberry PI SD ، إذا كنت جديدًا على Raspberry Pi ، فاتبع هذه المقالة لبدء استخدام Raspberry Pi.
يمتلك معظمنا Raspberry Pi وجهاز كمبيوتر محمول ولكن يفتقر إلى شاشة. ولكن من أجل SSH في Raspberry Pi ، نريد أن يتم توصيل نفس الشيء في نفس الشبكة التي يتصل بها جهاز الكمبيوتر الخاص بنا. نحتاج إلى شاشة متصلة بـ Pi يمكننا من خلالها تحديد شبكة Wi-Fi والاتصال؟
في الواقع نحن لا نفعل ذلك. يمكن توصيل Raspberry Pi بشبكة Wi-Fi عن طريق إضافة إدخال إلى ملف يسمى wpa_supplicant.conf
للقيام بذلك ، قم بتوصيل بطاقة SD بالكمبيوتر وافتح الملف rootfs / etc / wpa_supplicant / wpa_supplicant.conf وأضف الإدخال التالي إلى نفسه. لا تنس فتح الملف بامتيازات المسؤول (الجذر).
شبكة = {ssid = "wifi_ssid" psk = "wifi_passkey" key_mgmt = WPA-PSK}
يجب أن يبدو الدخول مشابهًا لهذا.
يجب أن يجعلنا الإدخال أعلاه متصلين بشبكة Wi-Fi ولكن هذا لا يكفي لإنشاء اتصال SSH والحفاظ عليه بين Raspberry Pi والكمبيوتر. افتراضيًا ، يتم تعطيل SSH في Raspberry Pi ، لذلك لتمكينه ، قم بإنشاء ملف فارغ باسم ssh في دليل التمهيد.
الآن تم تمكين Raspberry Pi تقنيًا للوصول إليه عن بُعد. قم بتوصيل raspberry pi بمصدر الطاقة. الآن سيتم توصيل pi بشبكة Wi-Fi تلقائيًا ولكن عنوان IP الخاص به مطلوب من أجل SSH فيه. هناك طرق متعددة لمعرفة الشيء نفسه. أنا استخدم الأمر nmap
nmap -sn / 24
سيعطينا هذا الأمر عناوين IP لجميع الأجهزة المتصلة في شبكتنا. فمثلا،
واحد منهم من توت العليق. الآن نحن نعرف عنوان IP الخاص بـ pi ، فدعنا نتصل به
ssh pi @ pi_ip_address
هناك أيضًا طرق أخرى لبدء Raspberry Pi بدون رأس ، تحقق من الرابط لتتعلم الشيء نفسه.
المتطلبات الأساسية ليتم تثبيتها في Raspberry Pi
BlueZ
BlueZ هو التطبيق الافتراضي الذي يأتي مع Raspbian distro. يتم استخدامه للوصول إلى عناصر تحكم البلوتوث في النظام. يمكن أيضًا تثبيته في حالة عدم توفره لديك لأسباب قد تعرفها أنت فقط.
يحصل الأمر أدناه على تثبيت تطبيق واجهة Bluetooth في pi الخاص بنا.
apt-get install bluez
PulseAudio
Pulse Audio هو تطبيق يحول بايت من بيانات الكمبيوتر إلى تصور بشري. يطلق عليه أيضًا اسم مشغل الموسيقى. بروتوكول A2DP متاح في ملحقات تطبيق PulseAudio. لذلك دعونا نقوم بتثبيت جميع التطبيقات المتعلقة بنبض الصوت باستخدام الأمر أدناه:
apt-get install pulseaudio- *.
إقران جهاز Bluetooth مع Raspberry Pi
افتح تطبيق BlueZ باستخدام الأمر
bluetoothctl
و كيل بلوتوث هي وسيط ان المحادثات بين اثنين من الأجهزة بتقنية البلوتوث والتهيئة اتصال بينهما. هناك أنواع مختلفة من وكلاء البلوتوث. الذي سنستخدمه هو وكيل NoInputNoOutput لأنه يتيح لنا الاتصال دون تدخل المستخدم. لذلك دعونا نهيئ العامل عن طريق تشغيل الأوامر التالية.
وكيل NoInputNoOutput
يجب أن تتلقى رسالة "تم تسجيل الوكيل " كرد. الآن بعد أن تم تسجيل وكيلنا ، دعونا نجعله الوكيل الافتراضي .
الوكيل الافتراضي
التي يجب أن تكون الاستجابة لها "طلب الوكيل الافتراضي ناجح"
الآن دعونا نجعل جهازنا قابلاً للاكتشاف
قابل للاكتشاف في
التي يجب أن تكون الاستجابة لها "تغيير قابل للاكتشاف عند النجاح"
حاول الآن توصيل هاتفك المحمول أو الكمبيوتر بـ Raspberry Pi
سيطلب منا التطبيق ترخيص الخدمات ولا نحتاج إلى القيام بها. بدلاً من ذلك ، سنثق فقط في الجهاز ونوصله. تعد الوثوق بالجهاز أمرًا مهمًا للغاية لأنه عندما يحاول الجهاز الموثوق به الاتصال بـ pi ، فإنه يسمح بذلك دون تدخل المستخدم على الإطلاق.
ثق بالاتصال
بعد كل هذه الإجراءات ، يجب أن يبدو جهازك الطرفي مشابهًا لهذا.
ياي! لدينا هاتفنا متصل بـ Raspberry Pi عبر البلوتوث. لكن هل هذا كاف؟ من الواضح لا ، نريد أن يتم نقل حزم بيانات الصوت الخاصة بنا من الهاتف إلى pi ثم من pi إلى السماعة المتصلة بمنفذ صوت Pi.
دعنا نتأكد من إدراج هاتفنا في مصدر الصوت لتطبيق PulseAudio عن طريق تشغيل الأمر التالي:
قائمة pactl قصيرة
سوف يسرد جميع وحدات الصوت المحملة ومصادر الصوت ومصادر الصوت
انظر إلى القيم مقابل الرقم التسلسلي 30. Bluez_source تعني مصدر الصوت عبر تطبيق BlueZ وهو البلوتوث. تحقق من عنوان mac الخاص بالجهاز الموجود بين bluez_source و a2dp_source والعنوان الموجود في تطبيق BlueZ. في حالتي ، يكون اللون bluez_source.3C_28_6D_FD_65_3D.a2dp_source وهو نفسه الموجود في تطبيق BlueZ. الآن إذا قمت بتشغيل أغنية من الجهاز المتصل بـ pi ، فيجب توجيهها إلى السماعة المتصلة بمنفذ الصوت الخاص بـ raspberry pi.
يوريكا! لقد نجحنا في بناء مكبر صوت Bluetooth. لقد قمنا بتوجيه الصوت ولكن هذا ليس كل شيء. لا يمكننا القيام بكل الخطوات المذكورة أعلاه يدويًا ، لذا دعنا نقوم بأتمتة هذه الخطوات باستخدام البرنامج النصي المتوقع والواجهة pi بمفتاح يقوم عند الضغط عليه بإقران Pi بالأجهزة.
رائع؟ دعونا الآن نبدأ العمل.
أتمتة عملية اقتران البلوتوث باستخدام برامج Python النصية
توقع البرامج النصية مثل نصوص bash ولكنها آلية. إنه يبحث عن الكلمة المعطاة في الجهاز وعند وصولها ، ترسل الأمر وفقًا للبرنامج النصي. دعونا نتمكّن من أتمتة عملية الاقتران. قم بإنشاء ملف يسمى pair_bluetooth_device.expect
ضبط المهلة 30 spawn bluetoothctl توقع "#" إرسال "عامل" إيقاف \ r "توقع"؟ أرسل "إرسال" \ r "توقع" # "إرسال" وكيل NoInputNoOutput \ r "توقع" وكيل مسجل "إرسال" \ r "توقع" # توقع "أرسل" الوكيل الافتراضي \ r "نجاح طلب العامل الافتراضي" إرسال "\ r" توقع إرسال "#" قابل للاكتشاف على \ r "توقع" تخويل "إرسال" نعم \ r "إرسال" خروج \ r "
انسخ الكود والصقه في الملف. إنه يعمل تلقائيًا ، الإجراءات التي قمنا بها أثناء إقران الهاتف المحمول بـ Raspberry Pi. إنه يتيح للجهاز الاتصال فقط ولكنه لا يثق به. للثقة بجهاز ، نحتاج إلى عنوان mac الخاص به. لذلك سنطبع إخراج هذا البرنامج النصي المتوقع إلى ملف سجل يمكن من خلاله الحصول على عنوان mac.
grep -Pom 1 "(؟ <= جهاز). * (؟ = متصل)"
يقوم الأمر أعلاه بطباعة القيمة الموجودة بين السلسلة "Device" و "Connected". في حالتنا (الجهاز 3C: 28: 6D: FD: 65: 3D متصل: لا) هو عنوان mac للجهاز.
دعونا نكتب نصًا نصيًا متوقعًا يأخذ عنوان mac كأول وسيطة ونثق ونتصل بهذا الجهاز.
قم بإنشاء ملف يسمى trust_and_connect.expect
ضبط المهلة 30 spawn bluetoothctl توقع "#" إرسال "وكيل" إيقاف \ r " توقع"؟ تسجيل " إرسال" \ r " توقع" إرسال "الوكيل على \ r" توقع "وكيل" إرسال "\ r" توقع "# توقع " إرسال" الوكيل الافتراضي \ r " نجاح طلب الوكيل الافتراضي" إرسال "\ r" توقع "#" إرسال "ثقة \ r" توقع "تغيير" إرسال الاتصال \ r " توقع خروج " اتصال ناجح " إرسال \ ص "
انسخ الكود أعلاه في هذا الملف. يقوم بجزء الثقة والاتصال تلقائيًا.
دعونا الآن نضع كل هذا في ملف نصي بلغة Python حتى يمكن أتمتة عملية الاقتران بأكملها.
لنقم بإنشاء ملف pair_and_trust_bluetooth_device.sh
cd $ (dirname $ 0) صدى "الاقتران…" نتوقع pair_bluetooth_device.expect> متوقع_script.log chmod 777 يتوقع _script.log النوم 2 صدى "الثقة والاتصال.." device_mac_address = $ (cat تتوقع_script.log - grep -Pom 1 " (؟ <= الجهاز). * (؟ = متصل) ") عنوان echo mac هو $ device_mac_address if]؛ ثم توقع trust_and_connect.expect $ device_mac_address else echo "لا يوجد جهاز متصل" في rm متوقع_script.log
لذا فإن نص باش ،
- يستدعي البرنامج النصي المتوقع (الذي ستتم طباعة مخرجاته على ملف يسمى يتوقع _script.log) والذي ،
- يبدأ عامل NoInputNoOutput
- يجعلها الوكيل الافتراضي
- يقوم بتشغيل قابلية الاكتشاف pi
- ينتظر شخصًا ما للاتصال ويخرج عندما يقوم شخص ما بذلك أو تنتهي مهلاته
- النوم لمدة ثانيتين
- احصل على ملف يتوقع_script.log الخاص بعنوان mac للجهاز
- يثق بالجهاز ويوصله إذا كان عنوان mac فارغًا
- يزيل الملف المتبقي يتوقع_script.log
قم بتشغيل البرنامج النصي لإقران البلوتوث باستخدام زر
الآن لدينا البرنامج النصي لأتمتة عملية الاقتران. لكن هذا البرنامج النصي يجب أن يعمل بشكل ملائم ومتى شاء المستخدم. لذا دعنا نربط هذا البرنامج النصي بزر مادي حتى يتم استدعاء هذا البرنامج النصي في كل مرة يتم فيها الضغط على الزر. المقاطعة هي أحد الأجزاء الحيوية في البرمجة المضمنة. بالنسبة للمبتدئين ، تضع المقاطعات عند استشعارها الروتين المعتاد للبرنامج وتقوم بتشغيل ISR محدد مسبقًا يعرف باسم Interrupt Service Routine.
لذلك دعونا نربط زر الضغط بـ gpio pin 11 ونخصص ISR لنفسه. داخل ISR ، يجب أن نسمي البرنامج النصي.
دعونا ننشئ ملف python يسمى Bluetooth-speaker-main.py ونضيف الكود أدناه إليه. لقد أضفت التعليقات في البرنامج ، لذا في حالة استخدام هذا الرمز ، فلا يزال لديك
#import المطلوبة الحزم استيراد عملية فرعية استيراد RPi.GPIO مثل gpio import time import os import logging pair_pin = 11 # جلب دليل الملف الذي يتم تشغيل سكربت Python منه fileDirectory = os.path.dirname (os.path.realpath (__ file__)) #Set موقع ملف السجل حسب نفس الموقع النصي الثعبان ملف السجل = fileDirectory + "/ bluetoothSpeaker.log" logging.basicConfig (اسم الملف = ملف السجل، filemode = "ث"، شكل = '٪ (الاسم) ق -٪ (levelname) ق -٪ (message) s '، level = logging.INFO ) def pairNewDevice (قناة): #ISR للطباعة 11 ("انتظار الاقتران") logging.info ("Waiting to pair") الإخراج = subprocess.call () gpio.setmode (gpio.مجلس) gpio.setup (pair_pin، gpio.IN، pull_up_down = gpio.PUD_UP) جرب: # اضبط pair_pin على أنه دبوس مقاطعة يكتشف الحافة المتساقطة وعندما يحدث ذلك ، اتصل بوظيفة pairNewDevice gpio.add_event_detect (pair_pin، gpio.FALLING، callback = pairNewDevice، bouncetime = 1000) print ("برنامج Bluetooth بدأ") logging.info ("برنامج Bluetooth بدأ") بينما True: time.sleep (5) باستثناء KeyboardInterrupt: gpio.cleanup ()
مخطط الرسم البياني
يوجد أدناه مخطط الدائرة لتوصيل زر بـ GPIO11 الخاص بـ Raspberry Pi لتشغيل عملية اقتران Bluetooth لنقل الصوت عبر Bluetooth.
قم بإعداد وظيفة Cron لبدء تشغيل برنامج Python الخاص بسماعات Bluetooth عند التمهيد
الآن أخيرًا ، دعونا نحدد وظيفة cron التي ستبدأ برنامج python هذا في كل مرة يتم فيها تشغيل pi.
كرونتاب -e
حدد المحرر المفضل لديك وأضف السطر أدناه في نهاية الملف
reboot python3 /home/pi/blueooth-speaker/Bluetooth-speaker-main.py
سيؤدي هذا إلى استدعاء برنامج python الخاص بنا في كل مرة يتم فيها تشغيل pi.
وهذا هو. هبط النسر. لقد صنعت مكبر صوت Raspberry Pi Bluetooth بدون رأس.
أعد تشغيل Pi ، وقم بإقران هاتفك ودفق الصوت.:)
يمكن تنزيل جميع البرامج النصية لمكبر الصوت Raspberry Pi Bluetooth من حساب GitHub. تحقق أيضا من الفيديو أدناه.