- A2DP
- Preparación de Raspberry Pi para configuración sin cabeza
- Requisitos previos para ser instalado en Raspberry Pi
- Emparejamiento de dispositivo Bluetooth con Raspberry Pi
- Automatice el proceso de emparejamiento de Bluetooth con scripts de Python
- Activar el script de emparejamiento de Bluetooth con un botón
- Diagrama de circuito
- Configure un trabajo Cron para iniciar el programa Python de altavoz Bluetooth en el arranque
Raspberry Pi es una computadora del tamaño de la palma de la mano que tiene Bluetooth, Wi-Fi, puerto Ethernet, puerto de cámara, etc. integrados, lo que lo convierte en el microcontrolador más adecuado para aplicaciones integradas basadas en IoT. También se utiliza para hacer muchos tipos de servidores como servidor de impresión, servidor multimedia, servidor web, etc. Hoy aprenderemos cómo una Raspberry Pi puede convertir un altavoz normal con conector de 3,5 mm en un altavoz bluetooth inalámbrico.
En esta publicación, crearemos un altavoz Bluetooth basado en Raspberry Pi fusionando la potencia de A2DP, Linux y el códec de audio para transmitir los paquetes de datos desde una fuente de audio a un receptor de audio de forma inalámbrica. Para hacerlo, vamos a piratear un poco el sistema Linux y escribir un fragmento de código en bash y python y estaremos en el negocio.
A2DP
A2DP es el acrónimo de Advanced Audio Distribution Profile. Este es un protocolo que está presente en casi todos los dispositivos habilitados para Bluetooth. Allana el camino para la transmisión de datos de sonido de un dispositivo a otro, siempre que ambos estén conectados entre sí a través de Bluetooth. A2dp utiliza un algoritmo de compresión sin pérdidas para comprimir los paquetes de audio antes de la transmisión para reducir la latencia, pero las pérdidas debidas a esta compresión son apenas perceptibles para el oído humano.
Preparación de Raspberry Pi para configuración sin cabeza
Para convertir la Raspberry Pi en un altavoz inalámbrico, primero instale el sistema operativo (Raspbian Stretch) en la tarjeta SD Raspberry PI, si es nuevo en Raspberry Pi, siga este artículo para comenzar con Raspberry Pi.
La mayoría de nosotros posee una Raspberry Pi y una computadora portátil, pero carecemos de un monitor. Pero para SSH en Raspberry Pi queremos que el mismo esté conectado en la misma red en la que está conectada nuestra computadora. ¿Necesitamos un monitor conectado a Pi a través del cual podamos seleccionar el Wi-Fi y conectarnos?
En realidad no lo hacemos. Raspberry Pi se puede conectar a Wi-Fi agregando una entrada a un archivo llamado wpa_supplicant.conf
Para hacerlo, conecte la tarjeta SD a la computadora y abra el archivo rootfs / etc / wpa_supplicant / wpa_supplicant.conf y agregue la siguiente entrada al mismo. No olvide abrir el archivo con privilegios de administrador (root).
network = {ssid = "wifi_ssid" psk = "wifi_passkey" key_mgmt = WPA-PSK}
La entrada debe tener un aspecto similar a esto.
La entrada anterior debería conectarnos a la red Wi-Fi, pero eso no es suficiente para crear y mantener una conexión SSH entre Raspberry Pi y la computadora. De forma predeterminada, SSH está deshabilitado en Raspberry Pi, por lo que para habilitarlo, cree un archivo vacío llamado ssh en el directorio de arranque.
Ahora Raspberry Pi está técnicamente habilitado para acceder de forma remota. Conecta la raspberry pi a la fuente de alimentación. Ahora pi se conectaría automáticamente a la red Wi-Fi, pero se requiere su dirección IP para conectarse mediante SSH. Hay varias formas de averiguar lo mismo. Yo uso el comando nmap
nmap -sn / 24
Este comando nos daría las direcciones IP de todos los dispositivos conectados en nuestra red. Por ejemplo,
Uno de ellos es de frambuesa pi. Ahora que conocemos la dirección IP del pi, permítanos conectarnos al
ssh pi @ pi_ip_address
También hay otras formas de comenzar con Raspberry Pi sin cabeza, verifique el enlace para aprender lo mismo.
Requisitos previos para ser instalado en Raspberry Pi
BlueZ
BlueZ es la aplicación predeterminada que viene con la distribución Raspbian. Se utiliza para acceder a los controles bluetooth del sistema. También se puede instalar en caso de que no lo tenga disponible en su pi por razones que solo usted puede conocer.
El siguiente comando obtiene la aplicación de interfaz Bluetooth instalada en nuestro pi.
apt-get install bluez
PulseAudio
Pulse Audio es una aplicación que convierte bytes de datos informáticos en percepción humana. También se le llama reproductor de música. El protocolo A2DP está disponible en los complementos de la aplicación PulseAudio. Así que instalemos todas las aplicaciones relacionadas con el audio de pulsos usando el siguiente comando:
apt-get install pulseaudio- *.
Emparejamiento de dispositivo Bluetooth con Raspberry Pi
Abra la aplicación BlueZ usando el comando
bluetoothctl
Un agente Bluetooth es un corredor que habla entre dos dispositivos habilitados para Bluetooth e inicializa una conexión entre ellos. Existen diferentes tipos de agentes bluetooth. El que usaremos es el agente NoInputNoOutput porque nos permite conectarnos sin intervención del usuario. Así que inicialicemos el agente ejecutando los siguientes comandos.
agente NoInputNoOutput
Debería recibir el mensaje " Agente registrado " como respuesta. Ahora que tenemos nuestro agente registrado, vamos a convertirlo en el predeterminado .
agente-predeterminado
Para lo cual la respuesta debe ser "Solicitud de agente predeterminada exitosa"
Ahora hagamos que nuestro dispositivo sea detectable
visible en
Para lo cual la respuesta debe ser "Cambio detectable en éxito"
Ahora intente conectar su teléfono móvil o la computadora a la Raspberry Pi
La aplicación nos pedirá que autoricemos los servicios y no es necesario que los hagamos. En su lugar, solo confiaremos en el dispositivo y lo conectaremos. Confiar en el dispositivo es muy importante porque cuando el dispositivo de confianza intenta conectarse con el pi, permite lo mismo sin la intervención del usuario.
confianza conectar
Después de todas estas acciones, su terminal debería verse similar a esta.
¡Hurra! Tenemos nuestro teléfono conectado con la Raspberry Pi mediante Bluetooth. ¿Pero es eso suficiente? Obviamente no, queremos que nuestros paquetes de datos de sonido se transfieran del teléfono al pi y luego del pi al altavoz que está conectado al puerto de audio del pi.
Asegurémonos de que tenemos nuestro teléfono en la lista de la fuente de audio de la aplicación PulseAudio ejecutando el siguiente comando:
lista pactl corta
Enumerará todos los módulos de sonido cargados, receptores de audio y fuentes de audio.
Mire los valores con el número de serie 30. Bluez_source significa la fuente de audio a través de la aplicación BlueZ, que es bluetooth. Verifique la dirección mac del dispositivo que se encuentra entre bluez_source y a2dp_source y la dirección que tiene en la aplicación BlueZ. En mi caso es bluez_source.3C_28_6D_FD_65_3D.a2dp_source que es el mismo que el de la aplicación BlueZ. Ahora, si reproduce una canción desde el dispositivo que está conectado al pi, debe enrutarse al altavoz que está conectado al puerto de audio de raspberry pi.
¡Eureka! Hemos construido con éxito un altavoz Bluetooth. Hemos encaminado el sonido pero eso no es todo. No podemos hacer todos los pasos anteriores manualmente, así que automatícelos usando el script de espera y la interfaz pi con un interruptor que, cuando se presiona, empareja el Pi con los dispositivos.
¿Frio? Vayamos ahora al grano.
Automatice el proceso de emparejamiento de Bluetooth con scripts de Python
Expect Scripts son como scripts bash pero automatizados. Busca la palabra dada en el terminal y cuando llega la misma envía el comando según el script. Automaticemos el proceso de emparejamiento. Cree un archivo llamado pair_bluetooth_device.expect
set timeout 30 spawn bluetoothctl esperan "#" enviar "agente desactivado \ r" esperar "? registrado" enviar "\ r" esperar "#" enviar "agente NoInputNoOutput \ r" esperar "Agente registrado" enviar "\ r" esperar "# "enviar" agente predeterminado \ r "esperar" Solicitud de agente predeterminada exitosa "enviar" \ r "esperar" # "enviar" detectable en \ r "esperar" Autorizar "enviar" sí \ r "enviar" salir \ r "
Copie el código y péguelo en el archivo. Simplemente hace automáticamente las acciones que hicimos al emparejar el móvil con raspberry pi. Simplemente permite que el dispositivo se conecte pero no confía en él. Para confiar en un dispositivo, necesitamos su dirección mac. Por lo tanto, imprimiremos la salida de este script de espera en un archivo de registro desde el que se puede obtener la dirección mac.
grep -Pom 1 "(? <= Dispositivo). * (? = Conectado)"
El comando anterior imprime el valor entre la cadena "Dispositivo" y "Conectado". En nuestro caso (Dispositivo 3C: 28: 6D: FD: 65: 3D Conectado: no) es la dirección mac del dispositivo.
Vamos a escribir un script Expect que se llevará en la dirección MAC como primer argumento y la confianza y conectarse a ese dispositivo.
Cree un archivo llamado trust_and_connect.expect
set timeout 30 spawn bluetoothctl espera "#" enviar "agente desactivado \ r" esperar "? registrado" enviar "\ r" esperar "#" enviar "agente en \ r" esperar "Agente registrado" enviar "\ r" esperar "# " enviar" agente predeterminado \ r " esperar" Solicitud de agente predeterminada exitosa " enviar" \ r " esperar" # " enviar" confianza \ r " esperar" Cambiar " enviar" conectar \ r " esperar" Conexión exitosa " enviar" salir \ r "
Copie el código anterior en ese archivo. Hace la parte de confianza y conexión automáticamente.
Pongamos ahora todo esto en un archivo de script de Python para que todo el proceso de emparejamiento pueda automatizarse.
He aquí, a crear un archivo pair_and_trust_bluetooth_device.sh
cd $ (dirname $ 0) echo "Emparejamiento…" espera pair_bluetooth_device.expect> espera_script.log chmod 777 espera_script.log sleep 2 echo "Confiando y conectando.." device_mac_address = $ (cat espera_script.log - grep -Pom 1 " (? <= Dispositivo). * (? = Conectado) ") echo la dirección mac es $ device_mac_address if]; luego espere trust_and_connect.expect $ device_mac_address else echo "Ningún dispositivo conectado" fi rm wait_script.log
Entonces, el guión de bash,
- Llama a un script de espera (cuya salida se imprimirá en un archivo llamado wait_script.log) que,
- Inicia el agente NoInputNoOutput
- Lo convierte en el agente predeterminado
- Activa la capacidad de descubrimiento de pi
- Espera a que alguien se conecte y sale cuando alguien lo hace o se agota el tiempo
- Duerme 2 segundos
- Coge el archivo wait_script.log para la dirección mac del dispositivo
- Confía y conecta el dispositivo si mac_address es nulo
- Elimina el archivo de residuos hope_script.log
Activar el script de emparejamiento de Bluetooth con un botón
Ahora tenemos el script para automatizar el proceso de emparejamiento. Pero este script debe ejecutarse a conveniencia, siempre que el usuario lo desee. Así que conectemos este script con un botón físico para que este script sea llamado cada vez que se presione el botón. La interrupción es una de las partes vitales de la programación integrada. Para empezar, las interrupciones cuando se detectan ponen la rutina regular del programa y ejecuta un ISR predefinido conocido como Rutina de servicio de interrupción.
Así que conectemos el pulsador al pin 11 de gpio y asignemos un ISR al mismo. Dentro del ISR, llamaremos al script.
Creemos un archivo de Python llamado Bluetooth-speaker-main.py y agreguemos el siguiente código. He agregado los comentarios en el programa, así que en caso de que use este código, aún los tiene
#importar paquetes requeridos importar subproceso importar RPi.GPIO como gpio import time import os import logging pair_pin = 11 #fetch el directorio de archivos desde el cual se ejecuta el script Python fileDirectory = os.path.dirname (os.path.realpath (__ file__)) # Establezca la ubicación del archivo de registro como la ubicación del script de Python logFile = fileDirectory + "/ bluetoothSpeaker.log" logging.basicConfig (filename = logFile, filemode = 'w', format = '% (name) s -% (levelname) s -% (mensaje) s ', nivel = logging.INFO) def pairNewDevice (canal): #ISR para el pin 11 print ("Esperando emparejar") logging.info ("Esperando emparejar") salida = subproceso.call () gpio.setmode (gpio.TABLERO) gpio.setup (pair_pin, gpio.IN, pull_up_down = gpio.PUD_UP) Probar: #Establecer la pair_pin como un pin de interrupción que detecta el flanco de bajada y cuando lo hace, llamar a la función pairNewDevice gpio.add_event_detect (pair_pin, gpio.FALLING, callback = pairNewDevice, bouncetime = 1000) print ("El programa Bluetooth ha comenzado") logging.info ("El programa Bluetooth ha comenzado") while True: time.sleep (5) excepto KeyboardInterrupt: gpio.cleanup ()
Diagrama de circuito
A continuación se muestra el diagrama del circuito para conectar un botón con GPIO11 de Raspberry Pi para activar el proceso de emparejamiento de Bluetooth para la transferencia de audio a través de Bluetooth.
Configure un trabajo Cron para iniciar el programa Python de altavoz Bluetooth en el arranque
Ahora, finalmente, configuremos un trabajo cron que iniciará este programa de Python cada vez que se inicie pi.
crontab -e
Seleccione su editor favorito y agregue la siguiente línea al final del archivo
@reboot python3 /home/pi/blueooth-speaker/Bluetooth-speaker-main.py
Esto llamará a nuestro programa Python cada vez que se inicie pi.
Y esto es todo. El águila ha aterrizado. Has hecho un altavoz Bluetooth Raspberry Pi sin cabeza.
Reinicie su Pi, empareje su teléfono y transmita el audio.:)
Todos los scripts para este altavoz Bluetooth Raspberry Pi se pueden descargar desde la cuenta de GitHub. También consulte el video que se muestra a continuación.