- A2DP
- Préparation du Raspberry Pi pour la configuration sans tête
- Prérequis pour être installé dans Raspberry Pi
- Couplage d'un appareil Bluetooth avec Raspberry Pi
- Automatisez le processus de couplage Bluetooth avec des scripts Python
- Déclenchez le script de couplage Bluetooth avec un bouton
- Schéma
- Configurer une tâche Cron pour démarrer le programme Python de haut-parleur Bluetooth au démarrage
Le Raspberry Pi est un ordinateur de la taille d'une paume doté de Bluetooth, Wi-Fi, port Ethernet intégré, port de caméra, etc., ce qui en fait le microcontrôleur le plus approprié pour les applications embarquées basées sur l'IoT. Il est également utilisé pour fabriquer de nombreux types de serveurs tels que le serveur d'impression, le serveur multimédia, le serveur Web, etc. Aujourd'hui, nous allons apprendre comment un Raspberry Pi peut convertir un haut-parleur normal ayant une prise jack 3,5 mm en un haut-parleur Bluetooth sans fil.
Dans cet article, nous allons créer un haut-parleur Bluetooth basé sur Raspberry Pi en fusionnant la puissance d'A2DP, de Linux et du codec audio pour diffuser les paquets de données d'une source audio vers un récepteur audio sans fil. Pour ce faire, nous allons pirater un peu le système Linux et écrire un morceau de code en bash et python et nous serons en affaires.
A2DP
A2DP est l'acronyme de Advanced Audio Distribution Profile. Il s'agit d'un protocole présent dans presque tous les appareils compatibles Bluetooth. Il ouvre la voie à la transmission de données du son d'un appareil à l'autre à condition qu'ils soient tous deux connectés l'un à l'autre via Bluetooth. A2dp utilise un algorithme de compression sans perte pour compresser les paquets audio avant la transmission afin de réduire la latence, mais les pertes dues à cette compression sont à peine perceptibles par les oreilles humaines.
Préparation du Raspberry Pi pour la configuration sans tête
Pour convertir le Raspberry Pi en haut-parleur sans fil, installez tout d'abord le système d'exploitation (Raspbian Stretch) sur la carte SD Raspberry PI, si vous êtes nouveau sur Raspberry Pi, suivez cet article pour commencer avec Raspberry Pi.
La plupart d'entre nous possèdent un Raspberry Pi et un ordinateur portable, mais n'ont pas de moniteur. Mais pour SSH dans Raspberry Pi, nous voulons que le même soit connecté dans le même réseau dans lequel notre ordinateur est connecté. Nous avons besoin d'un moniteur connecté à Pi via lequel nous pouvons sélectionner le Wi-Fi et nous connecter?
En fait, non. Raspberry Pi peut être connecté au Wi-Fi en ajoutant une entrée à un fichier nommé wpa_supplicant.conf
Pour ce faire, connectez la carte SD à l'ordinateur et ouvrez le fichier rootfs / etc / wpa_supplicant / wpa_supplicant.conf et ajoutez l'entrée suivante à celui-ci. N'oubliez pas d'ouvrir le fichier avec les privilèges d'administrateur (root).
network = {ssid = "wifi_ssid" psk = "wifi_passkey" key_mgmt = WPA-PSK}
L'entrée doit ressembler à ceci.
L'entrée ci-dessus devrait nous connecter au Wi-Fi, mais cela ne suffit pas pour créer et maintenir une connexion SSH entre Raspberry Pi et l'ordinateur. Par défaut, SSH est désactivé dans Raspberry Pi, donc pour l'activer, créez un fichier vide nommé ssh dans le répertoire de démarrage.
Maintenant, Raspberry Pi est techniquement activé pour être accessible à distance. Connectez le Raspberry Pi à la source d'alimentation. Maintenant, pi se connecterait automatiquement au Wi-Fi, mais son adresse IP est requise pour s'y connecter en SSH. Il existe plusieurs façons de découvrir la même chose. J'utilise la commande nmap
nmap -sn / 24
Cette commande nous donnerait les adresses IP de tous les appareils connectés à notre réseau. Par exemple,
L'un d'eux est de Raspberry Pi. Maintenant, nous connaissons l'adresse IP du pi laissez-nous nous connecter à l'it
ssh pi @ pi_ip_address
Il existe également d'autres façons de démarrer sans tête avec Raspberry Pi, vérifiez le lien pour en savoir plus.
Prérequis pour être installé dans Raspberry Pi
BlueZ
BlueZ est l'application par défaut fournie avec la distribution Raspbian. Il est utilisé pour accéder aux commandes Bluetooth du système. Il peut également être installé au cas où vous ne l'avez pas disponible dans votre pi pour des raisons que vous seul connaissez peut-être.
La commande ci-dessous permet d'installer l'application d'interface Bluetooth dans notre pi.
apt-get installer bluez
PulseAudio
Pulse Audio est une application qui convertit des octets de données informatiques en perception humaine. Il est également appelé comme lecteur de musique. Le protocole A2DP est disponible dans les plugins d'application PulseAudio. Alors laissez-nous installer toutes les applications liées à l'audio pulsé en utilisant la commande ci-dessous:
apt-get install pulseaudio- *.
Couplage d'un appareil Bluetooth avec Raspberry Pi
Ouvrez l'application BlueZ à l'aide de la commande
bluetoothctl
Un agent Bluetooth est un courtier qui parle entre deux appareils compatibles Bluetooth et initialise une connexion entre eux. Il existe différents types d'agents Bluetooth. Celui que nous utiliserons est l' agent NoInputNoOutput car il nous permet de nous connecter sans intervention de l'utilisateur. Alors, initialisons l'agent en exécutant les commandes suivantes.
agent NoInputNoOutput
Vous devriez recevoir le message « Agent enregistré » comme réponse. Maintenant que notre agent est enregistré, faisons-en celui par défaut .
agent par défaut
Pour lequel la réponse doit être "Demande d'agent par défaut réussie"
Rendons maintenant notre appareil détectable
découvrable sur
Pour lequel la réponse doit être "Modification détectable en cas de réussite"
Maintenant, essayez de connecter votre téléphone mobile ou l'ordinateur au Raspberry Pi
L'application nous invitera à autoriser les services et nous n'avons pas besoin de les faire. Au lieu de cela, nous allons simplement faire confiance à l'appareil et le connecter. Faire confiance à l'appareil est très important car lorsque l'appareil de confiance tente de se connecter avec le pi, il permet la même chose sans aucune intervention de l'utilisateur.
confiance se connecter
Après toutes ces actions, votre terminal devrait ressembler à celui-ci.
Yay! Nous avons notre téléphone connecté au Raspberry Pi via Bluetooth. Mais est-ce suffisant? Évidemment non, nous voulons que nos paquets de données sonores soient transférés du téléphone vers pi, puis du pi vers le haut-parleur qui est connecté au port audio du pi.
Assurez-vous que notre téléphone est répertorié dans la source audio de l' application PulseAudio en exécutant la commande ci-dessous:
liste pactl courte
Il listera tous les modules sonores chargés, les puits audio et les sources audio
Regardez les valeurs par rapport au numéro de série 30. Bluez_source signifie la source audio via l'application BlueZ qui est bluetooth. Vérifiez l' adresse mac de l' appareil qui se trouve entre bluez_source et a2dp_source et l'adresse que vous avez dans l'application BlueZ. Dans mon cas, c'est bluez_source.3C_28_6D_FD_65_3D.a2dp_source qui est le même que celui de l'application BlueZ. Maintenant, si vous jouez une chanson depuis l'appareil connecté au pi, elle doit être acheminée vers le haut-parleur connecté au port audio du raspberry pi.
Eureka! Nous avons construit avec succès un haut-parleur Bluetooth. On a routé le son mais ce n'est pas tout. Nous ne pouvons pas effectuer toutes les étapes ci-dessus manuellement, alors automatisons-les à l'aide du script expect et de l'interface pi avec un commutateur qui, lorsqu'il est enfoncé, associe le Pi avec des appareils.
Cool? Passons maintenant aux choses sérieuses.
Automatisez le processus de couplage Bluetooth avec des scripts Python
Les scripts Expect sont comme des scripts bash mais automatisés. Il recherche le mot donné dans le terminal et quand le même arrive, il envoie la commande selon le script. Automatisons le processus d'appariement. Créez un fichier appelé 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 enregistré" send "\ r" expect "# "send" default-agent \ r "expect" Demande d'agent par défaut réussie "send" \ r "expect" # "send" détectable sur \ r "expect" Authorize "send" yes \ r "send" exit \ r "
Copiez le code et collez le même dans le fichier. Il fait simplement automatiquement les actions que nous avons effectuées lors de l'association du mobile avec le raspberry pi. Il permet simplement à l'appareil de se connecter mais ne lui fait pas confiance. Pour faire confiance à un appareil, nous avons besoin de l'adresse Mac de celui-ci. Nous allons donc imprimer la sortie de ce script expect dans un fichier journal à partir duquel l'adresse mac peut être saisie.
grep -Pom 1 "(? <= Périphérique). * (? = Connecté)"
La commande ci-dessus imprime la valeur entre la chaîne «Device» et «Connected». Dans notre cas (Device 3C: 28: 6D: FD: 65: 3D Connected: non) c'est l'adresse mac de l'appareil.
Écrivons un script attendu qui prendra l'adresse mac comme premier argument et approuvera et se connectera à cet appareil.
Créez un fichier nommé 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 enregistré" send "\ r" expect "# " send" default-agent \ r " expect" Demande d'agent par défaut réussie " send" \ r " expect" # " send" trust \ r " expect" Changement de " send" connect \ r " expect" Connexion réussie " send" exit \ r "
Copiez le code ci-dessus dans ce fichier. Il fait automatiquement la partie de confiance et de connexion.
Mettons maintenant tout cela dans un fichier de script Python afin que tout le processus d'appariement puisse être automatisé.
Créons un fichier pair_and_trust_bluetooth_device.sh
cd $ (dirname $ 0) echo "Pairing…" expect pair_bluetooth_device.expect> expect_script.log chmod 777 expect_script.log sleep 2 echo "Confiance et connexion.." device_mac_address = $ (cat expect_script.log - grep -Pom 1 " (? <= Périphérique). * (? = Connecté) ") l' adresse echo mac est $ device_mac_address if]; then expect trust_and_connect.expect $ device_mac_address else echo "Aucun périphérique connecté" fi rm expect_script.log
Donc le script bash,
- Appelle un script expect (dont la sortie sera imprimée dans un fichier nommé expect_script.log) qui,
- Lance l' agent NoInputNoOutput
- En fait l'agent par défaut
- Active la découvrabilité de pi
- Attend que quelqu'un se connecte et quitte quand quelqu'un le fait ou expire
- Dormez pendant 2 secondes
- Récupérez le fichier expect_script.log pour l'adresse mac de l'appareil
- Approuve et connecte le périphérique si l'adresse_mac est nulle
- Supprime le fichier résiduel expect_script.log
Déclenchez le script de couplage Bluetooth avec un bouton
Nous avons maintenant le script pour automatiser le processus d'appariement. Mais ce script doit s'exécuter à sa convenance, chaque fois que l'utilisateur le souhaite. Alors relions ce script à un bouton physique afin que ce script soit appelé à chaque fois que vous appuyez sur le bouton. L'interruption est l'une des parties vitales de la programmation intégrée. Pour commencer, les interruptions lorsqu'elles sont détectées placent la routine régulière du programme et exécutent un ISR prédéfini appelé Routine de service d'interruption.
Alors connectons le bouton poussoir à la broche 11 du gpio et attribuons un ISR au même. Dans l'ISR, nous appellerons le script.
Créons un fichier python nommé Bluetooth-speaker-main.py et ajoutons-y le code ci-dessous. J'ai ajouté les commentaires dans le programme, donc si vous utilisez ce code, vous les avez toujours
#import packages requis importation de sous-processus import RPi.GPIO comme gpio import time import os import logging pair_pin = 11 # récupère le répertoire de fichiers à partir duquel le script python est exécuté fileDirectory = os.path.dirname (os.path.realpath (__ file__)) #Définissez l'emplacement du fichier journal comme étant le même que l'emplacement du script python logFile = fileDirectory + "/ bluetoothSpeaker.log" logging.basicConfig (filename = logFile, filemode = 'w', format = '% (nom) s -% (levelname) s -% (message) 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.PLANCHE) gpio.setup (pair_pin, gpio.IN, pull_up_down = gpio.PUD_UP) essayez: #Définissez le pair_pin comme une broche d'interruption qui détecte le front descendant et quand c'est le cas, appelez la fonction pairNewDevice gpio.add_event_detect (pair_pin, gpio.FALLING, callback = pairNewDevice, bouncetime = 1000) print ("Le programme Bluetooth a démarré") logging.info ("Le programme Bluetooth a démarré") avec True: time.sleep (5) sauf KeyboardInterrupt: gpio.cleanup ()
Schéma
Vous trouverez ci-dessous le schéma de circuit pour connecter un bouton avec GPIO11 de Raspberry Pi pour déclencher le processus de couplage Bluetooth pour le transfert audio via Bluetooth.
Configurer une tâche Cron pour démarrer le programme Python de haut-parleur Bluetooth au démarrage
Maintenant, définissons enfin un travail cron qui lancera ce programme python à chaque démarrage du pi.
crontab -e
Sélectionnez votre éditeur préféré et ajoutez la ligne ci-dessous à la fin du fichier
@reboot python3 /home/pi/blueooth-speaker/Bluetooth-speaker-main.py
Cela appellera notre programme python à chaque fois que le pi démarre.
Et ça y est. L'aigle a atterri. Vous avez créé un haut-parleur Bluetooth sans tête Raspberry Pi.
Redémarrez votre Pi, associez votre téléphone et diffusez l'audio.:)
Tous les scripts de ce haut-parleur Bluetooth Raspberry Pi peuvent être téléchargés à partir du compte GitHub. Consultez également la vidéo ci-dessous.