- A2DP
- Preparació de Raspberry Pi per a la configuració sense cap
- Requisits previs per instal·lar a Raspberry Pi
- Emparellament de dispositius Bluetooth amb Raspberry Pi
- Automatitzeu el procés de sincronització Bluetooth amb scripts Python
- Activeu l’escript de sincronització Bluetooth amb un botó
- Esquema de connexions
- Configureu un treball Cron per iniciar el programa Python de l’altaveu Bluetooth a l’arrencada
Raspberry Pi és un ordinador de mida palmera amb Bluetooth, Wi-Fi, port Ethernet, port de càmera, etc. que el converteix en el microcontrolador més adequat per a aplicacions incrustades basades en IoT. També s’utilitza per fabricar molts tipus de servidors com a servidor d’impressió, servidor de suports, servidor web, etc. Avui aprendrem com un Raspberry Pi pot convertir un altaveu normal que tingui un jack de 3,5 mm en un altaveu bluetooth sense fils.
En aquest post, crearem un altaveu Bluetooth basat en Raspberry Pi fusionant la potència del còdec A2DP, Linux i d’àudio per transmetre sense fils els paquets de dades des d’una font d’àudio fins a una pica d’àudio. Per fer-ho piratejarem una mica el sistema Linux i escriurem un tros de codi en bash i python i estarem al negoci.
A2DP
A2DP és l'acrònim de Advanced Audio Distribution Profile. Es tracta d’un protocol que està present a gairebé tots els dispositius compatibles amb Bluetooth. S’obre camí per a la transmissió de dades de so d’un dispositiu a l’altre sempre que estiguin connectats entre ells mitjançant Bluetooth. A2dp utilitza l'algorisme de compressió sense pèrdues per comprimir els paquets d'àudio abans de la transmissió per reduir la latència, però les pèrdues a causa d'aquesta compressió són difícilment perceptibles per a les orelles humanes.

Preparació de Raspberry Pi per a la configuració sense cap
Per convertir el Raspberry Pi en un altaveu sense fils, primer instal·leu el sistema operatiu (Raspbian Stretch) a la targeta SD Raspberry PI, si no sou nou a Raspberry Pi, seguiu aquest article per començar a utilitzar Raspberry Pi.
La majoria de nosaltres posseïm un Raspberry Pi i un ordinador portàtil, però no tenim un monitor. Però per connectar-nos a Raspberry Pi volem que el mateix estigui connectat a la mateixa xarxa a la qual està connectat el nostre equip. Necessitem un monitor connectat a Pi mitjançant el qual puguem seleccionar el Wi-Fi i connectar-nos?
En realitat no ho fem. Raspberry Pi es pot connectar a Wi-Fi afegint una entrada a un fitxer anomenat wpa_supplicant.conf
Per fer-ho, connecteu la targeta SD a l'ordinador i obriu el fitxer rootfs / etc / wpa_supplicant / wpa_supplicant.conf i afegiu-hi la següent entrada. No oblideu obrir el fitxer amb privilegis d'administrador (arrel).
network = {ssid = "wifi_ssid" psk = "wifi_passkey" key_mgmt = WPA-PSK}
L’entrada hauria de ser semblant a aquesta.

L'entrada anterior ens hauria de connectar a la Wi-Fi, però això no és suficient per crear i mantenir una connexió SSH entre Raspberry Pi i l'ordinador. Per defecte, SSH està desactivat a Raspberry Pi, de manera que, per habilitar-lo, creeu un fitxer buit anomenat ssh al directori d'arrencada.
Ara Raspberry Pi està tècnicament habilitat per accedir-hi remotament. Connecteu el raspberry pi a la font d’energia. Ara pi es connectaria automàticament a la xarxa Wi-Fi, però es requereix la seva adreça IP per poder accedir-hi. Hi ha diverses maneres d’esbrinar el mateix. Faig servir l’ ordre nmap
nmap -sn / 24
Aquesta ordre ens proporcionaria les adreces IP de tots els dispositius connectats a la nostra xarxa. Per exemple,

Un d’ells és de pi de gerds. Ara sabem que l'adreça IP del pi ens permet connectar-nos-hi
ssh pi @ pi_ip_address

També hi ha altres maneres de començar amb Raspberry Pi sense cap capçal, consulteu l’enllaç per obtenir el mateix.
Requisits previs per instal·lar a Raspberry Pi
BlueZ
BlueZ és l'aplicació predeterminada que ve amb la distribució Raspbian. S'utilitza per accedir als controls bluetooth del sistema. També es pot instal·lar en cas que no el tingueu disponible a pi per motius que només coneixeu.
A sota de l’ordre s’instal·la l’aplicació d’interfície Bluetooth al nostre pi.
apt-get install bluez

PulseAudio
Pulse Audio és una aplicació que converteix els bytes de dades de l’ordinador en percepció humana. També s’anomena reproductor de música. El protocol A2DP està disponible als connectors d’aplicacions PulseAudio. Per tant, anem a instal·lar totes les aplicacions relacionades amb l’àudio de pols fent servir l’ordre següent:
apt-get install pulseaudio- *.

Emparellament de dispositius Bluetooth amb Raspberry Pi
Obriu l'aplicació BlueZ mitjançant l'ordre
bluetoothctl
Un agent Bluetooth és un agent que parla entre dos dispositius compatibles amb Bluetooth i inicialitza una connexió entre ells. Hi ha diferents tipus d’agents bluetooth. El que farem servir és l' agent NoInputNoOutput perquè ens permet connectar-nos sense la intervenció de l'usuari. Per tant, inicialitzem l'agent executant les ordres següents.
agent NoInputNoOutput
Haureu de rebre el missatge " Agent registrat " com a resposta. Ara que tenim el nostre agent registrat, fem que sigui el predeterminat .
agent per defecte
Per a la qual la resposta hauria de ser "Sol·licitud d'agent per defecte satisfactòria"
Ara fem que el nostre dispositiu pugui ser descobert
es pot descobrir el
Per a la qual la resposta hauria de ser "Canvi que es pot descobrir si s'ha realitzat correctament"
Ara proveu de connectar el vostre telèfon mòbil o l'ordinador al Raspberry Pi
L’aplicació ens demanarà que autoritzem els serveis i no cal que els fem. En lloc d'això, només confiarem en el dispositiu i el connectarem. Confiar en el dispositiu és molt important perquè quan el dispositiu de confiança intenta connectar-se amb el pi, permet el mateix sense cap intervenció de l'usuari.
confiança connectar
Després de totes aquestes accions, el terminal hauria de tenir un aspecte similar a aquest.

Visca! Tenim el nostre telèfon connectat amb el Raspberry Pi mitjançant Bluetooth. Però és suficient? Viouslybviament, no, volem que els nostres paquets de dades de so es transfereixin del telèfon a pi i, a continuació, del pi a l’altaveu connectat al port d’àudio del pi.
Assegureu-nos que tenim el nostre telèfon a la font d'àudio de l' aplicació PulseAudio executant l'ordre següent:
llista pactl curta
Enumerarà tots els mòduls de so carregats, disipadors d’àudio i fonts d’àudio

Mireu els valors del número de sèrie 30. Bluez_source significa la font d'àudio a través de l'aplicació BlueZ que és bluetooth. Comproveu l' adreça mac del dispositiu que es troba entre bluez_source i a2dp_source i l'adreça que teniu a l'aplicació BlueZ. En el meu cas, és bluez_source.3C_28_6D_FD_65_3D.a2dp_source que és el mateix que el de l’aplicació BlueZ. Ara, si reproduïu una cançó des del dispositiu que està connectat al pi, s’hauria d’encaminar a l’altaveu connectat al port d’àudio del raspberry pi.
Eureka! Hem creat amb èxit un altaveu Bluetooth. Hem encaminat el so, però això no és tot. No podem fer tots els passos anteriors de manera manual, així que deixeu-nos automatitzar-los mitjançant l’ escriptura expect i la interfície pi amb un commutador que, quan es prem, combina el Pi amb els dispositius.
Guai? Passem ara als nostres negocis.
Automatitzeu el procés de sincronització Bluetooth amb scripts Python
Els scripts Expect són com scripts bash, però automatitzats. Cerca la paraula donada al terminal i, quan arriba la mateixa, envia l'ordre segons l'script. Automatitzem el procés de sincronització. Creeu un fitxer anomenat pair_bluetooth_device.expect
set timeout 30 spawn bluetoothctl expect "#" send "agent off \ r" expect "? gistered" send "\ r" expect "#" send "agent NoInputNoOutput \ r" expect "Agent registered" send "\ r" expect "# "enviar" l'agent per defecte \ r "esperar" La sol·licitud per defecte de l'agent "enviar" \ r "esperar" # "enviar" detectable el \ r "esperar" Autoritzar "enviar" sí \ r "enviar" sortir \ r "
Copieu el codi i enganxeu-lo al fitxer. Simplement fa les accions que vam fer de manera automàtica en emparellar el mòbil amb el raspberry pi. Simplement permet que el dispositiu es connecti, però no hi confia. Per confiar en un dispositiu, necessitem la seva adreça Mac. Per tant, imprimirem la sortida d’aquest script expect en un fitxer de registre des del qual es pot obtenir l’adreça mac.
grep -Pom 1 "(? <= Dispositiu). * (? = Connectat)"
L'ordre anterior imprimeix el valor entre la cadena "Dispositiu" i "Connectat". En el nostre cas (Dispositiu 3C: 28: 6D: FD: 65: 3D connectat: no) és l’adreça mac del dispositiu.
Anem a escriure un script Expect que es durà a l'adreça MAC com a primer argument i la confiança i connectar-se a aquest dispositiu.
Creeu un fitxer anomenat trust_and_connect.expect
set timeout 30 spawn bluetoothctl expect "#" send "agent off \ r" expect "? egistered" send "\ r" expect "#" send "agent on \ r" expect "Agent registered" send "\ r" expect "# " enviar" agent per defecte \ r " esperar" La sol·licitud per defecte de l'agent " enviar" \ r " esperar" # " enviar" confiar \ r " esperar" Canviar " enviar" connectar \ r " esperar" Connexió correcta " enviar" sortir \ r "
Copieu el codi anterior a aquest fitxer. Fa la part de confiança i connexió automàticament.
Posem ara tot això en un fitxer de seqüència Python perquè es pugui automatitzar tot el procés de sincronització.
Heus aquí, a crear un arxiu pair_and_trust_bluetooth_device.sh
cd $ (dirname $ 0) echo " Sincronització …" expect pair_bluetooth_device.expect> expect_script.log chmod 777 expect_script.log sleep 2 echo "Confiança i connexió.." device_mac_address = $ (cat expect_script.log - grep -Pom 1 " (? <= Dispositiu). * (? = Connectat) ") l' adreça echo mac és $ device_mac_address if]; llavors espereu trust_and_connect.expect $ device_mac_address else echo "No hi ha cap dispositiu connectat" fi rm expect_script.log
Així que l’escriptura bash,
- Crida a un script expect (la sortida del qual s'imprimirà en un fitxer anomenat expect_script.log) que,
- Inicia l' agent NoInputNoOutput
- El converteix en l'agent per defecte
- Activa la visibilitat de pi
- Espera que algú es connecti i surt quan algú ho fa o s’espera
- Dorm durant 2 segons
- Agafeu el fitxer expect_script.log per a l'adreça mac del dispositiu
- Confia i connecta el dispositiu si l’adreça mac_ és nul·la
- Elimina el fitxer de residus expect_script.log
Activeu l’escript de sincronització Bluetooth amb un botó
Ara tenim l’script per automatitzar el procés d’aparellament. Però aquest script ha d’executar-se còmodament, sempre que l’usuari ho desitgi. De manera que permetem connectar aquest script amb un botó físic perquè es cridi aquest script cada vegada que es prem el botó. La interrupció és una de les parts vitals de la programació incrustada. Per començar, les interrupcions quan es detecten posen la rutina habitual del programa i executa una ISR predefinida coneguda com a rutina de servei d’interrupció.
Així que anem a connectar el polsador a pin GPIO 11 i assignem un ISR a la mateixa. Dins de la ISR, anomenarem el guió.
Anem a crear un arxiu anomenat pitó Bluetooth-speaker-main.py i afegim el següent codi per a això. He afegit els comentaris al programa, de manera que si utilitzeu aquest codi, encara els teniu
#import paquets obligatoris importació subprocés importació RPi.GPIO com a temps d' importació gpio importació registre d'importació pair_pin = 11 #fetch el directori de fitxers des del qual s'executa l'escriptura python fileDirectory = os.path.dirname (os.path.realpath (__ file__)) #Estableix la ubicació del fitxer de registre de la mateixa manera que la ubicació de l'script de Python logFile = FileDirectory + "/ bluetoothSpeaker.log" logging.basicConfig (filename = logFile, filemode = 'w', format = '% (name) s -% (levelname) s -% (message) s ', level = logging.INFO) def pairNewDevice (canal): #ISR per a la impressió del pin 11 ("Esperant el vincle ") logging.info ("Esperant el vincle") output = subprocess.call () gpio.setmode (gpio.PISSARRA) gpio.setup (pair_pin, gpio.IN, pull_up_down = gpio.PUD_UP) intenta: #Set el pair_pin com a pin d'interrupció que detecta la vora descendent i, quan ho fa, truca a la funció pairNewDevice gpio.add_event_detect (pair_pin, gpio.FALLING, callback = pairNewDevice, bouncetime = 1000) print ("S'ha iniciat el programa Bluetooth") logging.info ("El programa Bluetooth s'ha iniciat") mentre és True: time.sleep (5) excepte KeyboardInterrupt: gpio.cleanup ()
Esquema de connexions
A continuació es mostra el diagrama de circuits per connectar un botó amb GPIO11 de Raspberry Pi per activar el procés d’aparellament Bluetooth per a la transferència d’àudio mitjançant Bluetooth.


Configureu un treball Cron per iniciar el programa Python de l’altaveu Bluetooth a l’arrencada
Ara, finalment, definim un treball cron que iniciarà aquest programa python cada vegada que arrenci el pi.
crontab -e
Seleccioneu el vostre editor preferit i afegiu la línia següent al final del fitxer
@reboot python3 /home/pi/blueooth-speaker/Bluetooth-speaker-main.py

Això cridarà al nostre programa Python cada vegada que arrenci el pi.
I això és tot. L’àguila ha aterrat. Heu fabricat un altaveu Bluetooth Headless Raspberry Pi.
Reinicieu el Pi, vincleu el telèfon i transmeteu l'àudio.:)

Tots els scripts d’aquest altaveu Bluetooth Raspberry Pi es poden descarregar des del compte de GitHub. Consulteu també el vídeo que es mostra a continuació.
