Raspberry Pi 2からBluetoothでスピーカーに音を飛ばす

2017-03-25 17:48 | 技術 | § 0

用意するもの

  • Raspberry Pi 2 Model B
  • Bluetoothアダプタ IODATA USB-BT40LE
  • Bluetoothスピーカー ELECOM LBT-SPP20
  • オーディオケーブル(有線接続の確認用。省略可)

動作確認環境

  • Raspbian GNU/Linux 8.0 Lite (Jessie)
  • Bluetoothd 5.23 ※今回導入します
  • PulseAudio 5.0 ※今回導入します

有線で接続確認する

使用したスピーカーは外部入力端子を備えており、有線でも使用可能なのでひとまず有線での接続確認をします。

はじめに、MP3を再生したいのでmpg321パッケージを導入します。
(音を出すだけならここを省略して標準のaplayとかに置き換えても構いません)

sudo aptitude install mpg321

piユーザが音を出すにはaudioグループに所属している必要があるので、以下のコマンドで確認します。

id

普通はaudioグループに所属しているはずですが、なければ以下のコマンドでaudioグループに追加します。

sudo gpasswd -a pi audio

実行権限を付与します。

sudo chmod o+rw /dev/snd/*

Bluetoothスピーカーの外部入力端子にオーディオケーブルを接続します。
Raspberry Piに再生用のmp3ファイルを用意します。ここではtest_pattern.mp3というファイルを用意しました。scpコマンドやWinSCPなどのソフトを利用してRaspberry Pi上に転送しておきます。

以下のコマンドで、mpg321から音を鳴らしてみます。

mpg321 test_pattern.mp3

音が鳴れば成功です。
もし音が大きすぎたり小さすぎたりする場合はalsamixerコマンドで音量を調節しましょう。

確認が完了したらオーディオケーブルは抜いておきます。

※”sudo chmod o+rw /dev/snd/*”を忘れると以下のようなメッセージでエラーになります。

$ mpg321 test_pattern.mp3 
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2, and 3.
Version 0.3.2-1 (2012/03/25). Written and copyrights by Joe Drew,
now maintained by Nanakos Chrysostomos and others.
Uses code from various people. See 'README' for more!
THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK!
 
Playing MPEG stream from test_pattern.mp3 ...
MPEG 1.0 layer III, 128 kbit/s, 44100 Hz stereo
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.front
ALSA lib confmisc.c:768:(parse_card) cannot find card '0'
ALSA lib conf.c:4259:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings
ALSA lib conf.c:4259:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1251:(snd_func_refer) error evaluating name
ALSA lib conf.c:4259:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:4738:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM default
Can't find a suitable libao driver. (Is device in use?)

Bluetoothアダプタを有効化してスピーカーに接続する

ここでBluetoothアダプタ(ドングル)をRaspberry Piに接続しておきます。

続いてBluetoothとPulseAudioを導入していきます。この記事を参考にしました。
以下のコマンドでBluetoothパッケージとPulseAudioパッケージをインストールします。

sudo aptitude install bluetooth pulseaudio-module-bluetooth

以下のコマンドでPulseAudioをsystemdに登録します。

sudo vi /etc/systemd/system/pulseaudio.service

pulseaudio.serviceファイルは以下の内容で作成します。

1
2
3
4
5
6
7
8
9
[Unit]
Description=Pulse Audio
 
[Service]
Type=simple
ExecStart=/usr/bin/pulseaudio --system --disallow-exit --disable-shm
 
[Install]
WantedBy=multi-user.target

以下のコマンドでpulseaudio-bluetooth.confファイルを作成します。

sudo vi /etc/dbus-1/system.d/pulseaudio-bluetooth.conf

pulseaudio-bluetooth.confファイルは以下の内容で作成します。

1
2
3
4
5
6
7
<busconfig>
 
  <policy user="pulse">
    <allow send_destination="org.bluez"/> 
  </policy>
 
</busconfig>

以下のコマンドでsystem.paファイルを編集します。

sudo vi /etc/pulse/system.pa

system.paファイルの最後に以下の内容を追記します。

### Automatically load driver modules for Bluetooth hardware
.ifexists module-bluetooth-policy.so
load-module module-bluetooth-policy
.endif
 
.ifexists module-bluetooth-discover.so
load-module module-bluetooth-discover
.endif

以下のコマンドでpulseaudioサービスを起動します。

sudo systemctl start pulseaudio.service

以下のコマンドでpulseaudioサービスを自動起動するよう設定します。

sudo systemctl enable pulseaudio.service

以下のコマンドでpiユーザがPulseAudioで音を出せるようにします。

sudo gpasswd -a pi pulse-access

※”sudo gpasswd -a pi pulse-access”を忘れると以下のようなメッセージでエラーになります。

$ mpg321 test_pattern.mp3
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2, and 3.
Version 0.3.2-1 (2012/03/25). Written and copyrights by Joe Drew,
now maintained by Nanakos Chrysostomos and others.
Uses code from various people. See 'README' for more!
THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK!
 
Playing MPEG stream from test_pattern.mp3 ...
MPEG 1.0 layer III, 128 kbit/s, 44100 Hz stereo
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.front
ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Access denied
 
Can't find a suitable libao driver. (Is device in use?)

以下のコマンドでBluetoothを制御するためのプロンプトに入ります。

sudo bluetoothctl

Bluetoothアダプタが認識されていれば、以下のように表示されます。
(xxの部分はMACアドレスです)

$ sudo bluetoothctl
[NEW] Controller xx:xx:xx:xx:xx:xx raspberrypi [default]
[bluetooth]#

ここからはbluetoothctlのプロンプトです。
以下のコマンドでスキャンを開始します。

# scan on

以下のように「LBT-SPP20」が検知されます。

[bluetooth]# scan on
Discovery started
[CHG] Controller xx:xx:xx:xx:xx:xx Discovering: yes
[NEW] Device xx:xx:xx:xx:xx:xx LBT-SPP20
[bluetooth]#

以下のコマンドでスキャンを終了します。

# scan off

以下のようにスキャンが停止します。

[bluetooth]# scan off
Discovery stopped
[CHG] Controller xx:xx:xx:xx:xx:xx Discovering: no
[bluetooth]#

以下のコマンドでペアリングします。xxの部分は上で出てきたLBT-SPP20のMACアドレスです。

# pair xx:xx:xx:xx:xx:xx

ペアリングが成功すると、Bluetoothスピーカーからピーと音が出ます。(LBT-SPP20の場合)

[bluetooth]# pair xx:xx:xx:xx:xx:xx
Attempting to pair with xx:xx:xx:xx:xx:xx
[CHG] Device xx:xx:xx:xx:xx:xx Connected: yes
[CHG] Device xx:xx:xx:xx:xx:xx UUIDs:
        0000110b-0000-1000-8000-0080xxxxxxxx
        0000110c-0000-1000-8000-0080xxxxxxxx
        0000110e-0000-1000-8000-0080xxxxxxxx
[CHG] Device xx:xx:xx:xx:xx:xx Paired: yes
Pairing successful
[CHG] Device xx:xx:xx:xx:xx:xx Connected: no
[bluetooth]#

ペアリングと同時に自動的に接続されますが、もし上記のように最後にConnected:noと続いている場合は以下のコマンドで手動接続します。出てない場合は不要です。

# connect xx:xx:xx:xx:xx:xx

手動接続に成功すると以下の結果が返ってきます。

[bluetooth]# connect xx:xx:xx:xx:xx:xx
Attempting to connect to xx:xx:xx:xx:xx:xx
[CHG] Device xx:xx:xx:xx:xx:xx Connected: yes
Connection successful
[bluetooth]#

以下のコマンドで今後も自動接続するようデバイスを信頼します。

# trust xx:xx:xx:xx:xx:xx

以下のような結果になります。

[bluetooth]# trust xx:xx:xx:xx:xx:xx
[CHG] Device xx:xx:xx:xx:xx:xx Trusted: yes
Changing xx:xx:xx:xx:xx:xx trust succeeded
[bluetooth]#

以下のコマンドでbluetoothctlを終了します。

# quit

以下のコマンドでmpg321から音を鳴らしてみます。

mpg321 test_pattern.mp3

音が鳴れば成功です。おつかれさまでした。

自動接続されない場合

私の環境では以下の問題が発生しました。

  • OS起動時にBluetoothスピーカーが自動接続されない
  • Bluetoothスピーカーに手動接続するたびに音量が最大になってしまう

これを解決するためにいろいろ調べたのですが回避方法がよく分かりませんでした。
結局、OS再起動時に自動的に接続し、音量を無理やり調整するためのシェルスクリプトを用意しました。

1
2
3
4
5
6
7
8
9
10
#/bin/bash
 
sleep 7s
bluetoothctl << EOF
connect xx:xx:xx:xx:xx:xx
quit
EOF
 
sleep 7s
pactl set-sink-volume 1 26000 #最大音量の40%程度に調整するコマンド

上記のファイルを適当な場所に作成して実行権限を付け、systemdに登録してOS起動時に毎回読み込まれるようにしました。

関連

Raspberry Pi 2でNFCタグを読み取って音を鳴らす
Raspberry Pi 2とnetatmoで室温を声でお知らせ
Raspberry Pi 2を赤外線リモコンで操作可能にする
Raspberry Pi 2をリモコン操作してNHKラジオを聴く
Raspberry Pi 2で実現するスマートハウス



§ コメントをどうぞ

  • このページについて

    yagitchの日本語練習帳です。本のレビューとか技術的なメモとか。詳細≫
  • 過去の記事