RaspberryPi2 を使ってbluetoothオーディオレシーバーを作る
ラズパイ2でbluetoothレシーバーを作った。
Youtubeの再生は重いので、bluetoohレシーバーとして活用することにした。
<参考にした記事>
blog.bnikka.com
d.hatena.ne.jp
<用意したもの>
①Raspberry Pi 2 Model B +(rasbianインストール済み)
②Blutoothレシーバー(BUFFALO社製)
③ラズパイ用ボタン、配線
<作り方>
①必要なソフトをインストール(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)}'`