RaspberryPi2 を使ってbluetoothオーディオレシーバーを作る

ラズパイ2でbluetoothレシーバーを作った。
Youtubeの再生は重いので、bluetoohレシーバーとして活用することにした。


<参考にした記事>
blog.bnikka.com
d.hatena.ne.jp

<用意したもの>

Raspberry Pi 2 Model B +(rasbianインストール済み)
f:id:yfp5521:20170929184131j:plain:w400

②Blutoothレシーバー(BUFFALO社製)
f:id:yfp5521:20170929184135j:plain:w400

③ラズパイ用ボタン、配線
f:id:yfp5521:20170929184139j:plain:w400
 
<作り方>

①必要なソフトをインストール(pulseaudio, bluez, )

$ sudo apt-get install bluez pulseaudio-module-bluetooth python-gobject python-gobject-2

 

②pulseaudioを再起動する

$ sudo pulseaudio -k
$ sudo pulseaudio -D

 

*今後、ラズパイをrebootした場合はpulseaudioの起動コマンドを実行してみると良い。bluetoothが繋がっても音が出ないときはpulseaudioが起動していない可能性がある。

$ sudo pulsesudio -D

または

$ sudo service pulseaudio start

 

 

②Piユーザーをlpグループに追加。(これによってBluetoothデーモンにアクセスできるようになる)

$ sudo usermod -a -G lp pi

 


Bluetoothの設定

$ sudo vi /etc/bluetooth/main.conf
$ sudo vi /etc/bluetooth/


[General]に以下を追記する(参考にした記事ではSocketも書いてあるが、Source,Sink,Mediaの3つで再生することができた。pulseaudioと同様に接続ができない場合は,Enable=Source,Sink,Media,Socketと書いて試してみると良い)

[General]
Enable=Source,Sink,Media


④サンプリングの設定

$ sudo vi /etc/pulse/daemon.conf
; resample-method = speex-float-3

 resample-method = trivial

 


⑤接続を実行するファイルを作成
(bluetoothctlを起動→ペアリング→接続までを行うconnect.shを作成する)

$ vi /home/pi/connect.sh 

一般的なラズパイのペアリングでは、接続相手のMACアドレスが必要になる。
しかし今回は、ラズパイをボタン1つで操作したいため、MACアドレスの入力が不要なスクリプトを作成する。

<参考>
raspberrypi.stackexchange.com

#!/usr/bin/expect

set timeout 60
set prompt "#"
spawn sudo bluetoothctl -a NoInputNoOutput

expect -re $prompt
send "power on\r"

expect -re $prompt
send "discoverable on\r"

expect -re $prompt
send "pairable on\r"

expect -re $prompt
send "agent on\r"

expect -re $prompt
send "agent NoInputNoOutput\r"

expect -re $prompt
send "default-agent\r"

# sleep 5

expect {
    "(yes/no)?" {send "yes\r"
                 exp_continue
                }
    "(yes/no)?" {send "yes\r"
                 exp_continue
                }
    "(yes/no)?" {send "yes\r"
                 exp_continue


⑥ボタンが押されたらconnect.shが実行されるpythonを作成

$ vi /home/pi/button_check.py
import RPi.GPIO as GPIO
from time import sleep
import os
from datetime import datetime
import os.path
 GPIO.setmode(GPIO.BCM)
button_pin = 21 #GPIO 21 = #40


def onSwitch():
    print('Button pressed')

    result = os.system('sudo service bluetooth restart && /home/pi/connect.sh')

    if result == 0:
        print('Python is running...')
    sleep(3)


def main():
    GPIO.setup(button_pin,GPIO.IN, pull_up_down =GPIO.PUD_UP)

    try:
        while True:
            channel = GPIO.wait_for_edge(button_pin, GPIO.RISING, timeout=5000)
            if channel is None:
                print('Please push the button if you want to pair.')
            else:
                onSwitch()
                sleep(1)

    except KeyboardInterrupt:
        print(KeyboardInterrupt)

    GPIO.cleanup()

if __name__ == '__main__':
    main()


⑦ボタンをラズパイに接続
今回はGPIO21(39)とGND(40)に接続した。他の箇所に接続した場合はbutton_check.pyのGPIO番号を変える。



<参考>
www.atmarkit.co.jp



⑧再起動

$ sudo reboot


⑨ボタンを押して、接続


*****************
ボタンを押してからラズパイを検出できるようになるまで40秒程度のタイムラグが発生することがあった。何回か試しているとすぐに接続できる場合もあったが、最終的には接続できたのでコマンドに問題はなさそう。
(ボタンを押してから60秒経過した場合はラズパイのペアリングモードが切れるので、再度押す必要あり)

また今回のやり方では、接続端末側で「ペアリングの設定解除」をしてしまうとラズパイ側にペアリング設定が残ってしまい、今後の接続がうまくいかなくなる。その場合は以下のコマンドを打って、ラズパイのペアリング設定を削除する。(Doneがでなくなるまで行う)

$ bt-device --remove `bt-device  --list | awk 'match($0, /\(([A-F0-9:]+)\)/){print substr($0, RSTART+1, RLENGTH-2)}'`