- A2DP
- Förbereder Raspberry Pi för huvudlös installation
- Förutsättningar som ska installeras i Raspberry Pi
- Para ihop Bluetooth-enhet med Raspberry Pi
- Automatisera Bluetooth-parningsprocessen med Python-skript
- Utlös Bluetooth-parningsskriptet med en knapp
- Kretsschema
- Ställ in ett Cron-jobb för att starta Bluetooth Speaker Python-programmet vid start
Raspberry Pi är en palmstor dator med inbyggd Bluetooth, Wi-Fi, Ethernet-port, kameraport etc. vilket gör den till den mest lämpliga mikrokontrollern för IoT-baserade inbäddade applikationer. Det används också för att skapa många typer av servrar som skrivarserver, mediaserver, webbserver etc. Idag lär vi oss hur en Raspberry Pi kan konvertera en vanlig högtalare med 3,5 mm-uttag till en trådlös Bluetooth-högtalare.
I det här inlägget kommer vi att bygga Raspberry Pi-baserad Bluetooth-högtalare genom att smälta samman kraften i A2DP, Linux och ljudkodek för att strömma datapaket från en ljudkälla till en ljudvatten trådlöst. För att göra det kommer vi att hacka lite Linux-system och skriva en kod i bash och python och vi kommer att vara i affärer.
A2DP
A2DP är förkortningen för Advanced Audio Distribution Profile. Detta är ett protokoll som finns i nästan alla Bluetooth-aktiverade enheter. Det banar väg för dataöverföring av ljud från en enhet till den andra förutsatt att de båda är anslutna till varandra via Bluetooth. A2dp använder förlustfri komprimeringsalgoritm för att komprimera ljudpaketen före överföring för att minska latens men förlusterna på grund av denna komprimering märks knappast för mänskliga öron.
Förbereder Raspberry Pi för huvudlös installation
För att konvertera Raspberry Pi till en trådlös högtalare, installera först OS (Raspbian Stretch) till Raspberry PI SD-kort, om du är ny på Raspberry Pi, följ sedan den här artikeln för att komma igång med Raspberry Pi.
De flesta av oss äger en Raspberry Pi och en bärbar dator men saknar en bildskärm. Men för att SSH till Raspberry Pi vill vi att samma ska anslutas i samma nätverk som vår dator är ansluten till. Vi behöver en bildskärm ansluten till Pi genom vilken vi kan välja Wi-Fi och bli ansluten?
Det gör vi faktiskt inte. Raspberry Pi kan anslutas till Wi-Fi genom att lägga till en post i en fil med namnet wpa_supplicant.conf
För att göra det, anslut SD-kortet till datorn och öppna filen rootfs / etc / wpa_supplicant / wpa_supplicant.conf och lägg till följande post i samma. Glöm inte att öppna filen med administratörsbehörighet (root).
nätverk = {ssid = "wifi_ssid" psk = "wifi_passkey" key_mgmt = WPA-PSK}
Entry ska se ut som denna.
Ovanstående post bör få oss anslutna till Wi-Fi men det räcker inte för att skapa och upprätthålla en SSH-anslutning mellan Raspberry Pi och dator. Som standard är SSH inaktiverat i Raspberry Pi, så för att aktivera det, skapa en tom fil med namnet ssh i startkatalogen.
Nu är Raspberry Pi tekniskt möjlig att fjärråtkomst. Anslut hallon pi till strömkällan. Nu skulle pi anslutas till Wi-Fi automatiskt men dess IP-adress krävs för att SSH in i den. Det finns flera sätt att ta reda på samma sak. Jag använder nmap- kommandot
nmap -sn / 24
Detta kommando skulle ge oss IP-adresserna till alla enheter som är anslutna i vårt nätverk. Till exempel,
En av dem är av hallon-pi. Nu vet vi IP-adressen för pi, låt oss ansluta till den
ssh pi @ pi_ip_address
Det finns också andra sätt att börja med Raspberry Pi utan huvud, kolla länken för att lära dig samma sak.
Förutsättningar som ska installeras i Raspberry Pi
BlueZ
BlueZ är standardprogrammet som kommer med Raspbian distro. Den används för att komma åt Bluetooth-kontrollerna i systemet. Den kan också installeras om du inte har den tillgänglig i din pi av skäl som du kanske vet.
Nedanför kommandot installeras Bluetooth-gränssnittsapplikationen i vårt pi.
apt-get install bluez
PulseAudio
Pulse Audio är ett program som omvandlar byte av datadata till mänsklig uppfattning. Det kallas också som musikspelare. A2DP-protokollet är tillgängligt i PulseAudio-applikationsinsticksprogram. Så låt oss installera alla pulsljudrelaterade applikationer med hjälp av kommandot nedan:
apt-get install pulseaudio- *.
Para ihop Bluetooth-enhet med Raspberry Pi
Öppna BlueZ-applikationen med kommandot
Bluetoothctl
En Bluetooth-agent är en mäklare som pratar mellan två Bluetooth-aktiverade enheter och initierar en anslutning mellan dem. Det finns olika typer av Bluetooth-agenter. Den som vi kommer att använda är NoInputNoOutput- agent eftersom den låter oss ansluta utan användarens ingripande. Så låt oss initiera agenten genom att köra följande kommandon.
agent NoInputNoOutput
Du får meddelandet ” Agent registrerad ” som svar. Nu när vi har registrerat vår agent, låt oss göra den till standard .
standardagent
För vilket svaret ska vara "Standardagentförfrågan lyckad"
Låt oss nu göra vår enhet synlig
upptäckbar den
För vilket svaret ska vara "Att ändra upptäckbart efter lyckats"
Nu försöka ansluta mobiltelefonen eller datorn till Raspberry Pi
Ansökan kommer att uppmana oss att godkänna tjänsterna och vi behöver inte göra dem. Istället litar vi bara på enheten och ansluter den. Att lita på enheten är mycket viktigt, för när den betrodda enheten försöker ansluta till pi, tillåter den samma utan någon användarintervention alls.
förtroende ansluta
Efter alla dessa åtgärder ska din terminal se ut som den här.
Jippie! Vi har vår telefon ansluten till Raspberry Pi via Bluetooth. Men räcker det? Uppenbarligen nej, vi vill att våra ljuddatapaket ska överföras från telefonen till pi och sedan från pi till högtalaren som är ansluten till pis ljudport.
Låt oss se till att vi har vår telefon listad i ljudkällan i PulseAudio- applikationen genom att köra kommandot nedan:
pactl lista kort
Den visar alla laddade ljudmoduler, ljudsänkor och ljudkällor
Titta på värdena mot serienumret 30. Bluez_source betyder ljudkällan via BlueZ-applikationen som är Bluetooth. Korskolla enhetens mac-adress som ligger mellan bluez_source och a2dp_source och adressen som du har i BlueZ-applikationen. I mitt fall är det bluez_source.3C_28_6D_FD_65_3D.a2dp_source som är densamma som den från BlueZ-applikationen. Om du nu spelar en låt från enheten som är ansluten till pi, ska den dirigeras till högtalaren som är ansluten till ljudporten på hallon pi.
Eureka! Vi har framgångsrikt byggt en Bluetooth-högtalare. Vi har dirigerat ljudet men det är inte allt. Vi kan inte göra alla ovanstående steg manuellt, så låt oss automatisera dem med förväntningsskript och gränssnitt pi med en omkopplare som när du trycker på, kopplar ihop Pi med enheter.
Häftigt? Låt oss nu gå ner i affärer.
Automatisera Bluetooth-parningsprocessen med Python-skript
Expect Scripts är som bash-skript men automatiserade. Det letar efter det givna ordet i terminalen och när detsamma kommer, skickar det kommandot enligt skriptet. Låt oss automatisera parningsprocessen. Skapa en fil som heter pair_bluetooth_device.expect
ställa in timeout 30 spawn bluetoothctl förvänta sig "#" skicka "agent av \ r" förvänta "? registrerad" skicka "\ r" förvänta "#" skicka "agent NoInputNoOutput \ r" förvänta "Agent registrerad" skicka "\ r" förvänta "# "skicka" standardagent \ r "förvänta" Standardagentbegäran lyckad "skicka" \ r "förvänta" # "skicka" upptäckbar på \ r "förvänta" Auktorisera "skicka" ja \ r "skicka" utgång \ r "
Kopiera koden och klistra in densamma i filen. Det gör bara automatiskt, de åtgärder som vi gjorde när vi parade ihop mobilen med hallon pi. Det låter bara enheten ansluta men litar inte på den. För att lita på en enhet behöver vi mac-adressen till den. Så vi ska skriva ut resultatet av detta förväntningsskript till en loggfil från vilken mac-adressen kan gripas.
grep -Pom 1 "(? <= Enhet). * (? = Ansluten)"
Ovanstående kommando skriver ut värdet mellan strängen "Enhet" och "Ansluten". I vårt fall (Enhet 3C: 28: 6D: FD: 65: 3D-ansluten: nej) är det enhetens mac-adress.
Låt oss skriva ett förväntningsskript som tar in mac-adressen som det första argumentet och litar på och ansluter till den enheten.
Skapa en fil med namnet trust_and_connect.expect
ställa in timeout 30 spawn bluetoothctl förvänta dig "#" skicka "agent av \ r" förvänta dig? egisterad " skicka" \ r " förvänta dig" # " skicka" agent på \ r " förvänta dig" Agent registrerad " skicka" \ r " förvänta" # " skicka" standardagent \ r " förvänta" Standardagentförfrågan lyckad " skicka" \ r " förvänta" # " skicka" förtroende \ r " förvänta" Ändra " skicka" ansluta \ r " förvänta" Anslutning lyckad " skicka" avsluta \ r "
Kopiera ovanstående kod till den filen. Det gör den förtroende och anslutande delen automatiskt.
Låt oss nu lägga allt detta i en Python-skriptfil så att hela parningsprocessen kan automatiseras.
Låt oss a skapa en fil pair_and_trust_bluetooth_device.sh
cd $ (dirname $ 0) echo "Pairing…" förvänta par_bluetooth_device.expect> expect_script.log chmod 777 expect_script.log sleep 2 echo "Trusting and connecting.." device_mac_address = $ (cat expect_script.log - grep -Pom 1 " (? <= Enhet). * (? = Ansluten) ") echo mac-adress är $ device_mac_address if]; förvänta dig sedan trust_and_connect.expect $ device_mac_address annars echo "Ingen enhet ansluten" fi rm expect_script.log
Så bash-skriptet,
- Anropar ett förväntningsskript (vars utdata kommer att skrivas ut till en fil med namnet expect_script.log) som,
- Initierar NoInputNoOutput- agenten
- Gör det till standardagenten
- Slår på upptäckbarheten av pi
- Väntar på att någon ska ansluta och avslutar när någon gör eller tar en timeout
- Sov i 2 sekunder
- Ta tag i expect_script.log-filen för enhetens mac-adress
- Litar på och ansluter enheten om mac_adressen är null
- Tar bort restfilen expect_script.log
Utlös Bluetooth-parningsskriptet med en knapp
Nu har vi skriptet för att automatisera parningsprocessen. Men det här skriptet måste köras när det passar, när användaren önskar. Så kan vi ansluta detta skript med en fysisk knapp så att det här skriptet kallas varje gång när du trycker på knappen. Interrupt är en av de viktigaste delarna av inbäddad programmering. Till att börja med avbryter avkänningar när de känner av programmet den vanliga rutinen och kör en fördefinierad ISR som kallas Interrupt Service Routine.
Så låt oss ansluta tryckknappen till gpio pin 11 och tilldela en ISR till densamma. Inuti ISR ska vi kalla skriptet.
Låt oss skapa en pythonfil med namnet Bluetooth-speaker-main.py och lägga till koden nedan. Jag har lagt till kommentarerna i programmet så om du använder den här koden har du dem fortfarande
#import obligatoriska paket importera underprocess import RPi.GPIO som gpio importtid import os import loggning pair_pin = 11 #hämta filkatalogen från vilken python-skriptet körs fileDirectory = os.path.dirname (os.path.realpath (__ file__)) # Ställ in loggplatsens plats som samma som python-skriptets plats logFile = fileDirectory + "/ bluetoothSpeaker.log" logging.basicConfig (filnamn = logFile, filemode = 'w', format = '% (namn) s -% (nivånamn) s -% (meddelande) s ', level = logging.INFO) def pairNewDevice (channel): #ISR for pin 11 print ("Waiting to pair") logging.info ("Waiting to pair") output = subprocess.call () gpio.setmode (gpio.STYRELSE) gpio.setup (pair_pin, gpio.IN, pull_up_down = gpio.PUD_UP) försök: # Ställ in pair_pin som en avbrottsstift som upptäcker den fallande kanten och när den gör det, ring paret NewDevice-funktionen gpio.add_event_detect (pair_pin, gpio.FALLING, callback = pairNewDevice, bouncetime = 1000) skriv ut ("Bluetooth-programmet har startat") logging.info ("Bluetooth-programmet har startat") medan True: time.sleep (5) utom KeyboardInterrupt: gpio.cleanup ()
Kretsschema
Nedan är kretsschemat för att ansluta en knapp med GPIO11 på Raspberry Pi för att utlösa Bluetooth-parningsprocessen för ljudöverföring via Bluetooth.
Ställ in ett Cron-jobb för att starta Bluetooth Speaker Python-programmet vid start
Låt oss äntligen ställa in ett cron-jobb som startar detta pythonprogram varje gång pi startar upp.
crontab -e
Välj din favoritredigerare och lägg till nedanstående rad i slutet av filen
@reboot python3 /home/pi/blueooth-speaker/Bluetooth-speaker-main.py
Detta kommer att kalla vårt pythonprogram varje gång pi startar upp.
Och det är det. Örnen har landat. Du har skapat en Headless Raspberry Pi Bluetooth-högtalare.
Starta om din Pi, para ihop din telefon och strömma ljudet.:)
Alla skript för denna Raspberry Pi Bluetooth-högtalare kan laddas ner från GitHub-kontot. Kolla även videon nedan.