- A2DP
- Paghahanda ng Raspberry Pi para sa Headless Setup
- Mga kinakailangan upang mai-install sa Raspberry Pi
- Pagpapares ng Bluetooth Device sa Raspberry Pi
- I-automate ang Proseso ng Bluetooth Paring gamit ang Mga Python Script
- Trigger ang Bluetooth Pairing Script gamit ang isang Button
- Diagram ng Circuit
- Mag-set up ng Cron Job upang simulan ang Bluetooth Speaker Python Program sa Boot
Ang Raspberry Pi ay isang palad na laki ng computer na mayroong built-in na Bluetooth, Wi-Fi, Ethernet port, Camera port atbp na ginagawang pinakaangkop na microcontroller para sa IoT na naka-embed na mga application. Ginagamit din ito upang makagawa ng maraming uri ng mga server tulad ng Print server, Media Server, Web Server atbp. Ngayon ay matututunan natin kung paano maaaring i-convert ng isang Raspberry Pi ang isang normal na speaker na mayroong 3.5mm jack sa isang wireless bluetooth speaker.
Sa post na ito magtatayo kami ng Raspberry Pi batay sa Bluetooth Speaker sa pamamagitan ng pagsasama sa lakas ng A2DP, Linux at audio codec upang mai-stream ang mga packet ng data mula sa isang mapagkukunan ng audio sa isang audio sink na wireless. Upang magawa ito, magta-hack kami ng kaunting sistema ng Linux at magsusulat ng isang piraso ng code sa bash at sawa at kami ay nasa negosyo.
A2DP
Ang A2DP ay ang daglat ng Advanced Audio Distribution Profile. Ito ay isang protokol na naroroon sa halos lahat ng mga aparatong pinagana ng Bluetooth. Nagbibigay ito ng paraan para sa paghahatid ng data ng tunog mula sa isang aparato patungo sa iba pang ibinigay na pareho silang konektado sa bawat isa sa pamamagitan ng Bluetooth. Gumagamit ang A2dp ng algorithm na walang pagkawala ng compression upang i-compress ang mga audio packet bago ang paghahatid upang mabawasan ang latency ngunit ang mga pagkalugi sanhi ng compression na ito ay halos hindi napapansin ng tainga ng tao.
Paghahanda ng Raspberry Pi para sa Headless Setup
Para sa pag-convert sa Raspberry Pi sa isang wireless Speaker, una sa lahat i-install ang OS (Raspbian Stretch) sa Raspberry PI SD card, kung bago ka sa Raspberry Pi pagkatapos ay sundin ang artikulong ito upang makapagsimula sa Raspberry Pi.
Karamihan sa atin ay nagmamay-ari ng isang Raspberry Pi at isang laptop ngunit walang isang monitor. Ngunit upang mapunta ang SSH sa Raspberry Pi nais naming magkonekta ang pareho sa parehong network kung saan nakakonekta ang aming computer. Kailangan namin ng monitor na konektado sa Pi kung saan maaari naming piliin ang Wi-Fi at makakonekta?
Sa totoo lang hindi. Ang Raspberry Pi ay maaaring konektado sa Wi-Fi sa pamamagitan ng pagdaragdag ng isang entry sa isang file na pinangalanang wpa_supplicant.conf
Upang magawa ito, ikonekta ang SD card sa computer at buksan ang file rootfs / etc / wpa_supplicant / wpa_supplicant.conf at idagdag ang sumusunod na entry sa pareho. Huwag kalimutang buksan ang file na may mga pribilehiyo ng administrator (root).
network = {ssid = "wifi_ssid" psk = "wifi_passkey" key_mgmt = WPA-PSK}
Ang entry ay dapat magmukhang katulad nito.
Ang entry sa itaas ay dapat makakonekta sa amin sa Wi-Fi ngunit hindi sapat iyon upang lumikha at mapanatili ang isang koneksyon sa SSH sa pagitan ng Raspberry Pi at computer. Bilang default ang SSH ay hindi pinagana sa Raspberry Pi, kaya upang paganahin ito, lumikha ng isang walang laman na file na pinangalanang ssh sa direktoryo ng boot.
Ngayon ang Raspberry Pi ay teknikal na pinagana upang ma-access nang malayuan. Ikonekta ang raspberry pi sa mapagkukunan ng kuryente. Ngayon ang pi ay makakonekta sa Wi-Fi nang awtomatiko ngunit kinakailangan ang IP address nito upang mapasok ito ng SSH. Mayroong maraming mga paraan upang malaman ang pareho. Gumamit ako ng nmap utos
nmap -sn / 24
Ang utos na ito ay magbibigay sa amin ng mga IP address ng lahat ng mga aparato na nakakonekta sa aming network. Halimbawa,
Isa sa mga ito ay ng raspberry pi's. Ngayon alam namin ang IP address ng pi ipaalam sa amin kumonekta dito
ssh pi @ pi_ip_address
Mayroon ding iba pang mga paraan upang magsimula sa Raspberry Pi nang walang ulo, suriin ang link upang malaman ang pareho.
Mga kinakailangan upang mai-install sa Raspberry Pi
BlueZ
Ang BlueZ ay ang default na application na kasama ng Raspbian distro. Ginagamit ito upang ma-access ang mga kontrol ng Bluetooth ng system. Maaari din itong mai-install kung sakaling hindi mo ito magagamit sa iyong pi para sa mga kadahilanan na maaari mo lamang malaman.
Sa ibaba ang utos ay nakakakuha ng application ng interface ng Bluetooth na naka-install sa aming pi.
apt-get install na bluez
PulseAudio
Ang Pulse Audio ay isang application na nagko-convert ng mga byte ng data ng computer sa pang-unawa ng tao. Tinatawag din ito bilang music player. Magagamit ang A2DP protocol sa mga plugin ng application ng PulseAudio. Kaya't i-install natin ang lahat ng mga application na nauugnay sa pulso-audio sa pamamagitan ng paggamit sa ibaba ng utos:
apt-get install pulseaudio- *.
Pagpapares ng Bluetooth Device sa Raspberry Pi
Buksan ang BlueZ application gamit ang utos
bluetoothctl
Ang isang ahente ng Bluetooth ay isang broker na nakikipag-usap sa pagitan ng dalawang aparato na pinagana ng bluetooth at pinasimulan ang isang koneksyon sa pagitan nila. Mayroong iba't ibang mga uri ng mga ahente ng bluetooth. Ang gagamitin namin ay NoInputNoOutput agent dahil pinapayagan kaming kumonekta nang walang interbensyon ng gumagamit. Kaya't pasimulan natin ang ahente sa pamamagitan ng pagpapatakbo ng mga sumusunod na utos.
ahente NoInputNoOutput
Dapat mong makuha ang mensahe na " Nakarehistro ang ahente " bilang tugon. Ngayon na nakarehistro na ang aming ahente, gawin namin itong default .
default-ahente
Kung saan ang tugon ay dapat na "Matagumpay na humiling ng ahente ng matagumpay"
Hayaan mo ngayong gawing matuklasan ang aming aparato
matuklasan sa
Kung saan ang tugon ay dapat na "Pagbabago ng natuklasan sa tagumpay"
Ngayon subukang ikonekta ang iyong mobile phone o ang computer sa Raspberry Pi
Ang application ay mag-uudyok sa amin upang pahintulutan ang mga serbisyo at hindi namin kailangang gawin ang mga ito. Sa halip ay magtiwala lang kami sa aparato at ikonekta ito. Ang pagtitiwala sa aparato ay napakahalaga dahil kapag ang pinagkakatiwalaang aparato ay nagtatangka upang kumonekta sa pi, pinapayagan nito ang pareho nang walang interbensyon ng gumagamit.
magtiwala kumonekta
Matapos ang lahat ng mga pagkilos na ito, ang iyong terminal ay dapat magmukhang katulad sa isang ito.
Yay! Nakakonekta ang aming telepono sa Raspberry Pi sa pamamagitan ng Bluetooth. Ngunit sapat na ba iyon? Malinaw na hindi, nais naming ilipat ang aming mga packet ng tunog ng data mula sa telepono patungo sa pi at pagkatapos mula sa pi papunta sa speaker na konektado sa audio port ng pi.
Tiyaking tiyakin na nakalista ang aming telepono sa audio source ng PulseAudio application sa pamamagitan ng pagpapatakbo ng command sa ibaba:
listahan ng pactl maikli
Ililista nito ang lahat ng na-load na mga module ng tunog, audio sink at mga mapagkukunan ng audio
Tumingin sa mga halaga laban sa serial number 30. Ang Bluez_source ay nangangahulugang ang mapagkukunan ng audio sa pamamagitan ng BlueZ application na kung saan ay Bluetooth. Suriin ang address ng mac ng aparato na nasa pagitan ng bluez_source at a2dp_source at ang address na mayroon ka sa BlueZ application. Sa aking kaso ito ay bluez_source.3C_28_6D_FD_65_3D.a2dp_source na kapareho ng isa mula sa BlueZ application. Ngayon kung nagpapatugtog ka ng isang kanta mula sa aparato na nakakonekta sa pi Dapat itong ilipat sa speaker na konektado sa audio port ng raspberry pi.
Eureka! Matagumpay kaming nakabuo ng isang Bluetooth speaker. Napaandar na natin ang tunog ngunit hindi iyan lahat. Hindi namin magagawa ang lahat ng mga hakbang sa itaas nang manu-mano kaya't i- automate natin sila gamit ang asahan ang script at interface pi gamit ang isang switch na kapag pinindot, ipares ang Pi sa mga aparato.
Malamig? Magsimula tayo ngayon sa negosyo.
I-automate ang Proseso ng Bluetooth Paring gamit ang Mga Python Script
Asahan ang Mga Script ay tulad ng bash script ngunit awtomatiko. Hinahanap nito ang ibinigay na salita sa terminal at kapag dumating ang pareho, nagpapadala ito ng utos ayon sa script. I-automate natin ang proseso ng pagpapares. Lumikha ng isang file na tinatawag na pair_blu Bluetooth_device.expect
itakda ang timeout 30 spawn bluetoothctl asahan ang "#" ipadala "ang ahente \ r" asahan "? nagbigay ng" send "\ r" asahan "#" ipadala "ang ahente NoInputNoOutput \ r" asahan ang "Rehistradong ahente" ipadala "\ r" asahan "# "send" default-agent \ r "asahan" Ang default na kahilingan ng ahente ay matagumpay na "ipadala" \ r "asahan" # "ipadala" na matuklasan sa \ r "asahan" Pahintulutan "ipadala" oo \ r "ipadala" exit \ r "
Kopyahin ang code at i-paste ang pareho sa file. Awtomatiko lamang itong ginagawa, ang mga pagkilos na ginawa namin habang ipinapares ang mobile gamit ang raspberry pi. Hinahayaan lang nitong kumonekta ang aparato ngunit hindi ito pinagkakatiwalaan. Upang magtiwala sa isang aparato kailangan namin ng mac address nito. Kaya mai-print namin ang output ng inaasahang script na ito sa isang file ng log mula sa kung saan maaaring mahawakan ang mac address.
grep -Pom 1 "(? <= Device). * (? = Nakakonekta)"
Ang utos sa itaas ay naka-print ang halaga sa pagitan ng string na "Device" at "Nakakonekta". Sa aming kaso (Device 3C: 28: 6D: FD: 65: 3D Nakakonekta: hindi) ito ang mac address ng aparato.
Sumulat kami ng isang inaasahang script na kukuha sa mac address bilang unang argumento at magtiwala at kumonekta sa device na iyon.
Lumikha ng isang file na pinangalanang trust_and_connect.expect
itakda ang timeout 30 spawn bluetoothctl asahan ang "#" ipadala "ang ahente \ r" asahan "? naibigay na" ipadala "\ r" asahan "#" ipadala "ang ahente sa \ r" asahan ang "Rehistradong ahente" ipadala "\ r" asahan "# " send" default-agent \ r " asahan" Ang default na kahilingan ng ahente ay matagumpay na " send" \ r " asahan" # " ipadala" trust \ r " asahan ang" Pagbabago " ipadala" kumonekta \ r " asahan" Matagumpay ang koneksyon " ipadala" exit \ r "
Kopyahin ang code sa itaas sa file na iyon. Ginagawa nito ang pagtitiwala at pagkonekta ng bahagi nang awtomatiko.
Ipaalam sa amin ngayon ilagay ang lahat ng ito sa isang file ng script ng Python upang ang buong proseso ng pagpapares ay maaaring awtomatiko.
Hayaan mo kaming lumikha ng isang file na pares_and_trust_blu Bluetooth_device.sh
cd $ (dirname $ 0) echo "Pairing…" asahan ang pair_blu Bluetooth_device.expect> expect_script.log chmod 777 expect_script.log sleep 2 echo "Pagkatiwalaan at pagkonekta.." device_mac_address = $ (cat expect_script.log - grep -Pom 1 " (? <= Device). * (? = Nakakonekta) ") ang echo mac address ay $ device_mac_address kung]; pagkatapos asahan ang trust_and_connect.expect $ aparato_mac_address iba pa ang echo na "Walang konektadong aparato" fi rm expect_script.log
Kaya ang bash script,
- Tumatawag ng isang inaasahang script (na ang output ay mai-print sa isang file na pinangalanang expect_script.log) na,
- Pinasimulan ang ahente ng NoInputNoOutput
- Ginagawa itong default-ahente
- Binuksan ang kakayahang matuklasan ng pi
- Naghihintay para sa isang tao na kumonekta at lumabas kapag ang isang tao ay nag-o-timeout
- Matulog ng 2 segundo
- Grab ang file na expect_script.log para sa address ng mac ng aparato
- Nagtitiwala at kumokonekta sa aparato kung ang mac_address ay null
- Tinatanggal ang natitirang file na inaasahan na_script.log
Trigger ang Bluetooth Pairing Script gamit ang isang Button
Ngayon ay mayroon kaming script upang i-automate ang proseso ng pagpapares. Ngunit ang script na ito ay kailangang tumakbo nang madali, tuwing nais ng gumagamit. Hinahayaan mong i-hook ang script na ito ng isang pisikal na pindutan upang ang script na ito ay matawag sa tuwing pinipilit ang pindutan. Ang makagambala ay isa sa mahahalagang bahagi ng naka-embed na programa. Para sa mga nagsisimula, nakakagambala kapag naramdaman na ilagay ang regular na gawain ng programa at nagpapatakbo ng isang paunang natukoy na ISR na kilala bilang Interrupt Service Routine.
Kaya't ikonekta namin ang pindutan ng push sa gpio pin 11 at magtalaga ng isang ISR sa pareho. Sa loob ng ISR, tatawagin namin ang script.
Lumikha tayo ng isang python file na pinangalanang Bluetooth-speaker-main.py at idagdag ang code sa ibaba dito. Naidagdag ko ang mga komento sa programa kung sakali kung gagamitin mo ang code na ito, mayroon ka pa ring mga ito
#import kinakailangang mga pakete import subprocess import RPi.GPIO bilang gpio import time import os import logging pair_pin = 11 #fetch the file Directory from where the python script is run fileDirectory = os.path.dirname (os.path.realpath (__ file__)) #Itakda ang lokasyon ng file ng log na kapareho ng lokasyon ng python script logFile = fileDirectory + "/ bluetoothSpeaker.log" logging.basicConfig (filename = logFile, filmode = 'w', format = '% (name) s -% (levelname) s -% (message) s ', level = logging.INFO) def pairNewDevice (channel): #ISR para sa pin 11 print ("Naghihintay na ipares") logging.info ("Naghihintay na ipares") output = subprocess.call () gpio.setmode (gpio.BOARD) gpio.setup (pares_pin, gpio.IN, pull_up_down = gpio.PUD_UP) subukan: #Itakda ang pares_pin bilang isang makagambala na pin na nakita ang bumabagsak na gilid at kapag ginawa ito, tawagan ang function ng pairNewDevice gpio.add_event_detect (pair_pin, gpio.FALLING, callback = pairNewDevice, bouncetime = 1000) print ("Nagsimula ang programa ng Bluetooth") logging.info ("Nagsimula ang programa ng Bluetooth") habang True : time.s Sleep (5) maliban sa KeyboardInterrupt: gpio.cleanup ()
Diagram ng Circuit
Nasa ibaba ang circuit diagram upang ikonekta ang isang pindutan sa GPIO11 ng Raspberry Pi upang ma-trigger ang proseso ng pagpapares ng Bluetooth para sa paglilipat ng audio sa pamamagitan ng Bluetooth.
Mag-set up ng Cron Job upang simulan ang Bluetooth Speaker Python Program sa Boot
Ngayon sa wakas hayaan mo kaming magtakda ng isang cron job na magsisimula sa programang sawa na ito tuwing naka-boot ang pi.
crontab -e
Piliin ang iyong paboritong editor at idagdag ang linya sa ibaba sa dulo ng file
@reboot python3 /home/pi/blueooth-speaker/Blu Bluetooth-speaker-main.py
Ito ay tumawag sa aming python program tuwing ang pi boots up.
At ito na. Ang agila ay nakadaong na. Gumawa ka ng isang Headless Raspberry Pi Bluetooth Speaker.
I-restart ang iyong Pi, ipares ang iyong telepono at i-stream ang audio.:)
Ang lahat ng mga script para sa Raspberry Pi Bluetooth Speaker na ito ay maaaring ma-download mula sa GitHub Account. Suriin din ang video na ibinigay sa ibaba.