loading

Let's make a bluetooth audio receiver allowing you hook up your R-Pi to your stereo and use your phone as the sound source.

To be honest, this is not a unique project. Plenty of people have attempted to get a bluetooth receiver working, some (less) have succeeded. After spending way to much time on trying to get the features that I want by combining sniplets from various guides I eventually got it right. In fact, I would like to give credit to Google and everybody on the internet for sharing their pain and experience. Without you I couldn't have done it!

The wish list:

  1. R-Pi Bluetooth and Airplay audio receiver: I want to be able to stream Spotify and other audio sources from a phone to my stereo. We have both Android and iOS-devices in our household so both should work.
  2. The receiver shall auto-pair and auto-trust phones trying to connect
  3. There should be a synthesized voice connect announcement (This is new, I think. I haven't seen anyone else doing this).
  4. There should be support for A2DP and A2CP profiles for meta data and playback control.
  5. Stand-alone operation. No display required. No login and manual steps, i. e. just plug it in and use it.
  6. Easy, predictable scripted install


As it turns out, A2DP and A2CP profiles mandate the use of Bluez 5 which in turn needs Pulse Audio 5.

What is Bluez? Bluez is the Linux bluetooth stack. It handles all the low level bluetooth stuff (pairing, audio data transfer, etc.)

What is Pulse Audio? It is a sound proxy. It will take the digital bluetooth audio stream, resample it and send it through to the analog headphone jack.

Step 1: What You Need

This is what you need to complete this project:

  • Raspberry Pi (B+ v2 or Pi 2)
  • Bluez-compatible bluetooth 4.0 dongle
  • 8GB MicroSD
  • A good solid power source for the Raspberry Pi
  • A keyboard and display for initial setup
  • Optional: R-Pi compatible WiFi dongle, e. g. Realtek RTL8188CUS

A note on the Pi version. I have used a Pi 2 during installation since it saves time. Then I move the completed MicroSD to a B+ V2. Running this application on a Pi 2 is a bit of a waste of CPU cycles.

Step 2: Basic Prep

  • Download Raspbian image here
  • Transfer image to sdcard using Win32 Disk Imager following instructions on www.raspberrypi.org.
  • Insert sdcard and power up
  • Important! Expand file system to full 8GB capacity (see screenshots)
  • Reboot
  • Login as user pi (password: raspberry). Please note that for the rest of this guide it is assumed that you are logged in as "pi".
  • Update operating system and reboot:
sudo apt-get update
sudo apt-get -y upgrade
sudo reboot

Step 3: Install Helper-scripts

After too many manyal trial and error attempts of trying to get this working I realized I had to script the install. That way I will get the same result every time. The scripts can be found on bitbucket.

This is how to install:

pi@raspberrypi ~ $ cd ~
pi@raspberrypi ~ $ git clone https://ehsmaes@bitbucket.org/ehsmaes/raspberry-pi-audio-receiver-install.git
pi@raspberrypi ~ $ cd raspberry-pi-audio-receiver-install/
pi@raspberrypi ~/raspberry-pi-audio-receiver-install $ 

Are you lazy? Skip to step 10!

Step 4: Bluez & Pulse - Install Dependencies

Next, you need to install required packages for Bluez 5 and Pulse Audio 5. Usually you don't need to worry about dependencies because the debian installer does it for you. We will install our software from source.

Simply run the script "bt_pa_prep.sh":

pi@raspberrypi ~/raspberry-pi-audio-receiver-install $ ./bt_pa_prep.sh

Step 5: Bluez & Pulse - Install From Source

Neither Bluez 5 or Pulse Audio 5 are available in the Raspbian repositories; hence they have to be downloaded, built (compiled) and installed. In addition, the two software packages need to interact. For this purpose users and permissions have to be set up right. Run "bt_pa_prep.sh".

pi@raspberrypi ~/raspberry-pi-audio-receiver-install $ ./bt_pa_install.sh

Did anything go wrong? The first thing to check - are you on a 8 GB card and did you remember to expand the file system? Not that? Start over and run each part of the script manually.

Step 6: Bluez & Pulse - Configure

The next script configures the following:

  • Creates the file /etc/udev/rules.d/99-input.rules. This file triggers execution of /usr/local/bin/bluez-udev when bluetooth devices are connected or disconnected.
  • Copies custom utility files to /usr/local/bin:
    • simple-agent.autotrust: Python script mostly stolen from Bluez sample code. I modified a few lines to have it auto-accept any connection attempt. The script is depending on bluezutils.py, which is also copied.
    • bluez-udev: Executes when devices are connected and links the incoming bluetooth source (input) with the pulseaudio sink (output) and reverses the process on disconnect. The script also triggers voice annoucements: "Device XYZ Connected" using supplied script say.sh.
    • say.sh: Text to voice script. If the RPi is on-line, the TTS-voice from Google Translate is used. Off-line fall back uses espeak.
  • Creates a startup script for Pulse Audio (/etc/init.d/pulseaduio)
  • Creates a startup script for Bluez (/etc/init.d/bluetooth)
  • Creates a startup script for simple-agent.autotrust as described above (/etc/init.d/bluetooth-agent)
  • Modifies /etc/bluetooth/main.conf for:
    • Device name
    • Bluetooth Class (Portable audio)
    • Disable discoverable timer so the device stays discoverable
  • Modifies /etc/pulse/daemon.conf for:
    • Resample method. The default resample method is not suitable for Raspberry Pi.
    • Various parameter adjustments to improve sound quality (I used to have problems with crackles and poor sound).
Run the script and enter the device name (what you will see when you attach from your phone):
pi@raspberrypi ~/raspberry-pi-audio-receiver-install $ ./bt_pa_config.sh
Bluetooth device name: RpiAudio

Now, reboot!

Step 7: Shairport - Install From Source

The software package used for Airplay audio streaming is called Shairport. This is also best done by downloading the source and building it:

pi@raspberrypi ~/raspberry-pi-audio-receiver-install $ ./airplay_install.sh

Step 8: Shairport - Configure

The script does the following;

  • Creates a /etc/init.d/shairport startup file
  • Edits the device name into the startup file
  • Creates the shairport user and adds it to the audio group
pi@raspberrypi ~/raspberry-pi-audio-receiver-install $ ./airplay_config.sh
Airplay device name: RpiAudio

Now, reboot!

Step 9: Usage

Hook the Pi up to a sound system. If you will be using the voice announcements, I suggest you put your Pi on the network, either by cable or WiFi. You will get announcements even if you stay off-line but the script will fall back to espeak which produces a robot-style voice.

Android: Scan for bluetooth devices and the device name you specified should appear among discoverable devices. Connect and press OK on the pop-up.

iOS: Open your music player and attach it to the airplay player with the name you specified. I would have shared a couple of screenshots but my wife is out of town and so is her iPhone.

Play some sound and you should hear it through the sound system!

Step 10: Cheating! (all at Once)

So, why not put it all together? Either do the steps above one by one or run all scripts in sequence:

pi@raspberrypi ~/raspberry-pi-audio-receiver-install $ ./runall.sh
Device name: RpiAudio
I would suggest you go cook dinner while this finishes. The script takes around 45min on a Rpi 2. Probably a lot longer on the B+. Output is saved to runall.log if you want to see the progress in retrospect.

Step 11: Final Words

Things that work well (for me, anyway) are:

  • Autopairing
  • Bluetooth and Airplay playback
  • Voice announcements for Bluetooth devices
  • Sound quality is as good as it can be on the Pi 11-bit D/A analog out. Keep output volume on the Pi as close to max as possible and turn the volume down a little on the Amp if needed. That way you will be using most of the 11 bits for sound. Doing the opposite (low vol on the Pi and high on the Amp) will give you a hissing background noise and distorted music. Do this: turn the Amp volume down, turn the Pi-volume up to max (using your phone), play a song and crank the Amp up to about max of what you will be wanting to use, then turn the Pi vol down to comfortable listening.

This is what can be improved or is not working:

  • Bluetooth volume control on some devices doesn't work. As far as I can tell, this is a limitation in Bluez 5 or possibly in the bluetooth implementations on some phones. In fact, I couldn't get volume control to work for iPhone 5 which is one of the reasons I wanted Airplay support.
  • Airplay connect/disconnect announcement. I haven't found a way to do this yet. There is nothing in the Shairplay logs to indicate a device connection. There is plenty about playback, meta data, etc but nothing about the connection. Please help me to figure this out! Leave comments.
  • Sound quality. I will try a USB soundcard and probably the hifi-addon board.
  • With Bluez 5 I have access to meta data and playback control but I haven't figured out what to do with it yet. I am pretty happy using the phone display for all that. For a brief moment I wanted to make a script to have the speech-script announce track and artist but I think that would start driving me nuts after about three songs. I thought about adding a display but for my application I am hiding the device.
  • I will probably use the voice engine to announce alerts from my home automation server (running Openhab)
  • I may add one or more GPIO-connected hardware buttons. One idea is to have a button to force disconnect a phone which is hogging the bluetooth connection.
  • Inactivity timer disconnect of devices

Step 12: Update Feb 2017: Raspbian Jessie

Good news! A couple of readers have updated code for Raspbian Jessie and added features (see comments for details). I want to highlight it here for stickiness.

Thanks a lot to adenbeckitt and BaReinhard!

First fork:

https://bitbucket.org/adenbeckitt/raspberry-pi-audio-receiver-install

Second fork:

https://github.com/BaReinhard/Super-Simple-Raspberry-Pi-Audio-Receiver-Install

<p>This no longer works on Raspbian Jessie.</p><p>I've fixed all the code here;<br><a href="https://bitbucket.org/adenbeckitt/raspberry-pi-audio-receiver-install" rel="nofollow">https://bitbucket.org/adenbeckitt/raspberry-pi-aud...</a></p><p>You should be able to follow the normal instructions.</p>
<p>Is this easy to do on a Pi3? I am very inexperienced in this area and need some help.</p>
<p>Hey thanks, I've tried that on RPI zero but no success. Maybe just because I used runall.sh... I will try it on my old pi which had this back on wheezy if your update works and if not I will post here logs.</p><p>Thank you for your update, this is one of best solutions currently available.</p>
Should work perfectly fine on the newest raspbian jessie. Any idea what the errors are?
<p>@<a href="https://www.instructables.com/member/adenbeckitt" rel="nofollow">adenbeckitt</a>, well bluetooth works well after I've manually patched some configs (there are rejects even when using clear raspbian lite), but airplay doesn't work for me, I will look at it when I have time but it seems that this service doesn't autostart at all (btw. author changed some comments in shairport config so there are also rejects because it looks for whole line).</p>
<p>What manual patches did you do? I am really inexperienced with this. I got Airplay to work but no bluetooth. Pi 3</p>
<p>does this update allow for automated connection to bluetooth, aka no need for Pin code?</p>
It works in my version, yes.
<p>Hey @adenbeckitt I just wanted to say thank you for doing much of the leg work for this project and making it usable again. I'm sure you've seen by now but I have updated a few things to include sound card support and have moved it over to github. I believe I gave you collaboration rights to it, I'm still pretty new to github and bitbucket so I am still learning. Also, I wasn't sure whether I should have forked the repo or just cloned it. Anyway, I made sure to give credit where it was due. If you would like we can create something that merges the two repo's and allows for some choices before runall.sh begins, or allow for the choices as runall.sh begins. Let me know what you think. I am find with either two separate repo's or merging into one.</p><p>Thanks again!</p>
I think many people will be happy about that! Thanks a lot for your contribution!
<p>Thanks very much for this project! I've run the install routines from both forks (first adenbeckitt's and then BaReinhard's, and when I pair my phone with the raspberry pi and play music, it comes through garbled for a few seconds then stops. The phone seems to keep happily streaming the music over the connection after it stops. Any idea what could be going on?</p>
<p>Great project I was wondering if there is anyway that the info for the music playing through Bluetooth could appear in Kodi? </p>
<p>I've managed to install it all sucesfully, but none of my devices can pick up the bluetooth. if i run hciconfig it shows the adapter is there. Any Ideas?</p>
<p>Same here. No Bluetooth discoverable device appearing anywhere!</p><p>Shairport works perfectly.</p>
<p>Did you get it working?</p>
<p>No, never did. I recently bought a Rpi3 (WiFi and BT built in) so I aim to try it on that in the near future. Will let you know if I have any joy with that.</p>
<p>did it work using the Rpi 3?</p>
<p>No! But I haven't tried the updated the most up to date instructions (Feb 2017 above) yet.</p>
<p>same here, i installed from runall.sh, so i can't wrong nothing, and shairport and other stuff i guess that are installed, but in raspbian i can't see in start, internet or other categories, any new programs installed.</p><p>i tried with my phone to see this bluetooth of my raspberry pi2 with asus bt400 without success. anyway bluetooth works, but to listen music my phone doesn't recognize the name of bluetooth that i insert when i installed this script to stream music into raspberry.</p><p>some help to do it ? seems that this tutorial is old or something like that</p>
<p>Really keen to get this script working on Jesse, Pi 3 model B. Any pointers on what needs updating? I'm going to look through the scripts but I'm nervous I'll miss something and bork.</p>
<p>im using a RPI 3 and i need some help</p>
<p>I have added a few of these add-ons,</p><p>Bluetooth Volume control to work with iPhone 6S (configuration will depend on sound card being used, but it works)</p><p>AirPlay connect/disconnect (ish) seems possible, havent gotten espeak to work yet.</p><p>Added auxillary line input for those old schoolers out there.</p><p>Included addition of usb sound card, soon to try hifiberry dac+ pro</p><p>Added, car implementation to create an Access Point to connect to to get AirPlay to work.</p><p>all can be found here:</p><p><a href="https://github.com/BaReinhard/Raspberry-Pi-Audio-Receiver-Install-Car-Install#raspberry-pi-audio-receiver-install---car-deployment-version" rel="nofollow">https://github.com/BaReinhard/Raspberry-Pi-Audio-R...</a></p><p>Keeps with the original </p><p>```</p><p>sudo ./runall.sh</p><p>```</p>
thanks it does not work
<p>sir any suggestions for which bluetooth dongle we should buy</p>
sorry, can't really offer any good suggestions right now. I wrote this a while ago. Actually, now you don't even need a dongle. Use a raspberry pi 3 with built in bluetooth. However, the scripts are dated and need a brush up for newer raspbian versions.
<p>I managed before with an older version. It worked like magic. Great work! I tried to get it to work on the newest Jessie with an external soundblaster play! 2 but sadly no luck. I hope to find some time to modify your scripts some time soon. It would really make my CarPc a whole lot better :)</p>
<p>How about update those scripts? I am still using it, but I need to downgrade my home pi server back to older version in order to make this work again and I need it mainly for my new rpi zero setup and there is better to use Jessie lite dist.</p><p>Thanks for amazing script BTW! :-)</p>
<p>Can I stream audio and execute ssh commands at the same time via the bluetooth ?</p>
<p>Hi, I gave a try today on your instructable. Thank you. I have used the lazy method on step 10. But I have a problem connecting my Raspberry Pi 3.</p><p>bluetoothctl give me:</p><p>[NEW] Controller AA:AA:AA:AA:AA:AA raspberrypi [default]</p><p>Can someone help me?</p>
<p>Hey.</p><p>So I'm having issues where I can't see my pi from my phone, and my pi can't see my phone, or any other bluetooth devices.</p><p>I'm using a pi 3 Model B with the built in bluetooth.<br></p><p>Has anyone tried this on the Pi 3 Model B?<br><br>Cheers!<br>Hunt</p>
<p>Also - it deleted my Kodi install? What the???</p>
<p>Further to this - if I go into bluetoothctl I get the following:</p><p>bluetoothctl </p><p>[NEW] Controller AA:AA:AA:AA:AA:AA suprapi [default]<br><br>Seems odd the mac address is AA:AA:AA:AA:AA:AA ??</p>
<p>Output from one of the scripts that removed a whole bunch of stuff:<br><br>&quot;The following packages will be REMOVED:</p><p> espeak kodi kodi-bin libasound2-plugins libespeak1 libpulse0 libpulsedsp</p><p> libsdl1.2debian mplayer2 pulseaudio pulseaudio-module-x11 pulseaudio-utils&quot;</p>
<p>where you running open elec? if so, reflashing the sd card would of wiped out kodi</p>
Thanks. I'll follow your instructions tonight re: reinstalling bluez and see how I get on. <br><br>I didn't reflash my sd card. Using Raspbian. One of the install scripts output had &quot;removing packages as no longer needed: kodi (and a bunch of other ones as well). I'll copy the output tonight and put it up. <br><br>Cheers
<p>ok</p>
<p>i am currently in the process of doing it on a raspberry pi 1b, not a 1b+, does anyone know how long it will take? i so am doing the install thing where it is printing cc and ccld, is this what it is suppose to be doing? </p>
<p>Great, thank you, it works fine on my Raspberry Pi B+ and the Inateck BTA CSR4B5 Bluetooth adapter.</p>
<p>i tried ./runall.sh but anyway i can't see bluetooth of my rasp :( i have rpi2 with raspbian last version</p>
<p>Glad to hear it works!</p>
<p>i tried but i can see bluetooth with my phone. i have rpi2 and raspbian, asus bt400 dongle and nexus 5.</p>
<p>OMSC doesn't have xz-utils installed by defaults and so throws an error. Just need to add this to the list off packages to install at the start.</p>
<p>Also doesn't have a c compiler installed so adding: 'sudo apt-get install build-essential xz-utils' would fix these.</p>
<p>After doing everything, I keep getting &quot;Connection failed- No usable services on this device.&quot; on my Raspberry Pi when I try and connect with my phone. Can someone help me?</p>
<p>Installed! (2nd time now)<br>First time, amixer use to be full volume. Now with the 2nd install, I have to ssh into pi and use &quot;amixer cset numid=1 -- 400&quot;. What do I need to do to set it max (or near) at boot?</p>
<p>Unfortunately doesn't work for me on RP3. Pulseaudio seems to be broken after running all scripts. Perhaps because OS already had it. It would be great if someone made such script for RP3. Great work, though. </p><p>P.S. Will try to grab pulseaudio configs from this repo and manually config my system </p>
<p>Why does you need another Bluetooth dongle with Raspberry Pi 3 ? Doing that installation disabled my inboard dongle. I need to reinstall everything. Did you know if it was another tutorial with Inboard Bluetooth on RASPB 3 ?</p>
<p>Can somebody help me? My raspberrypi 3 can connect bluetooth, but sound is muted. </p>
<p>You might want to edit this post as both Bluez and pulse audio are now available in Raspbian repos.</p>
<p>Thanks! worked perfectly!! </p><p>I have a question. This makes my RaspberryPi into a bluetooth headset. It works ok for music. </p><p>But what I have to do to receive a phone-calls audio also? or anyone has a tutorial or a pointer? Thanks in advance for sharing!</p>

About This Instructable

153,857views

805favorites

License:

Bio: IT-professional by day, DIY hobbyist (among other things) on my free time. I always have one or more projects going on. Usually something to do ... More »
More by ehsmaes:Motorized WiFi IKEA Roller Blind Cheap 3D Delta Printer Improvements Motorize IoT with ESP8266 
Add instructable to: