Skip to content

Instantly share code, notes, and snippets.

@actuino
Last active April 19, 2024 04:57
Show Gist options
  • Star 83 You must be signed in to star a gist
  • Fork 11 You must be signed in to fork a gist
  • Save actuino/9548329d1bba6663a63886067af5e4cb to your computer and use it in GitHub Desktop.
Save actuino/9548329d1bba6663a63886067af5e4cb to your computer and use it in GitHub Desktop.
Setting up a Bluetooth Speaker from the command line on a raspberry Pi Zero W

The setup of a bluetooth speaker on a Pi Zero W is pretty touchy.

Please get in touch via Twitter @actuino or http://www.actuino.fr/ if you've got comments or improvements to this quick draft.

First checks

  • Use a solid power source
  • check the speaker works on another hardware (android phone f.i.)
  • make sure you've updated your Raspbian, install and run rpi-update just in case.

In case of compatibility doubt

  • Use a raspbian Pixel, run sudo apt-get update then sudo apt-get dist-upgrade and reboot.
  • use the graphical widget to pair and connect your speaker. You may have to try twice or more.

What to install?

pi-bluetooth and bluez are already installed on recent Raspbian.

Install:

sudo apt-get install pulseaudio pulseaudio-module-bluetooth

(without this module, you get messages like "bluetoothd[5556]: a2dp-sink profile connect failed for 00:1D:43:6D:03:26: Protocol not available")

Extra steps

Add your pi user to the bluetooth group

sudo usermod -G bluetooth -a pi

sudo reboot

Start a pulseaudio server

pulseaudio --start

If it complains about not being able to spawn a local server, run

pax11publish -r; /usr/bin/pulseaudio --start

Pair and connect

run bluetoothctl

use "help" if you want more details about the available commands. The first time, you'll have to run the following:

  • power on
  • agent on
  • scan on
  • wait for the device to be discovered, note it's address (you can then use tab for auto-completion)
  • pair <dev>
  • trust <dev>
  • connect <dev> wait for the confirmation, then
  • quit

test : aplay something.wav

edit /etc/pulse/default.pa , add

# automatically switch to newly-connected devices
load-module module-switch-on-connect

edit /etc/bluetooth/main.conf, at the end of the file, add AutoEnable in the existing Policy section :

[Policy]
AutoEnable=true

After a reboot

You may need to:

  • pulseaudio --start

(This last step was not useful for me):

  • bluetoothctl -a then wait and quit when (auto) connected

Still have to sort out

  • Sometimes, the BT speaker disconnects itself, but it's still viewed as "connected" from the Pi. From this point, nothing will fix it exept a Pi reboot.
@striderssoftware
Copy link

Sorry my mistake, here is the command to send USB MIC input to the connected bluetooth device:
arecord --device hw:1,0 -c1 -d 0 -r 48100 -f S16_LE -V mono | aplay

@sirhopcount
Copy link

By default the audio played over my HDMI, I "fixed" this by disabling it in /boot/config.txt

# Enable audio (loads snd_bcm2835)
#dtparam=audio=on

If anybody knows a better way of doing this please let me know.

@donundeen
Copy link

donundeen commented Nov 3, 2022

this is fantastic, and is working great for me, connecting and playing audio, if I'm logged in to the Pi. Thanks!

I've set up my pi to auto-login, so I can connect the bluetooth headphones to the pi just by turning the headphones on.

However, when I try to use a crontab (pi user) to play an audio file it still plays through the audio jack, not the bluetooth

Using mpg123 on the command-line to play an audio file WILL however play the audio file over bluetooth.

Amy thoughts? Ultimately I want a headless pi running a node app that will use mpg123 to play audio, and this app will start on boot, probably from cron.

Thanks again for these great instructions!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment