Raspberry Pi Zero Wと人感センサを使って、妻が帰ってきたときに「おかえり」と言わせる装置を作りたかったのですが、Raspberry Pi Zero Wにはあいにく3.5 mm ジャック出力がありません。。少し考えた結果、Bluetoothスピーカーが便利なんじゃないか(スマホでも使えるし)と思い、この組み合わせで作ることにしました。CUIで安定して鳴らせるまで、思いのほか難航しました。
#買ったスピーカー
Anker SoundCore
#参考にしたサイト
https://github.com/ev3dev/ev3dev/issues/198
http://mickey-happygolucky.hatenablog.com/entry/2015/04/04/105512
導入が終わった後に気が付いたが、以下もとても役に立ちそう。
https://wiki.archlinuxjp.org/index.php/Bluetooth_%E3%83%98%E3%83%83%E3%83%89%E3%82%BB%E3%83%83%E3%83%88
#手順
基本的には上記のGitHubでのディスカッションの手順を実行していくだけです。途中躓いた点とか、試行錯誤して気付いた点などを補足していく形で記述していきます。
##バージョン情報
$ bluetoothctl --version
5.23
$ pulseaudio --version
pulseaudio 5.0
$ pactl --version
pactl 5.0
libpulse 5.0.0 でコンパイル
libpulse 5.0.0 でリンク
##bluetoothctlでの操作
Bluetoothデバイスに接続するためのツールのようです。
https://wiki.archlinuxjp.org/index.php/Bluetooth#Bluetoothctl
- helpでコマンド一覧が出てくるが、"Controller", "ctrl"というのはRaspberry Pi側のこと。"Device", "dev"というのは接続対象側のこと。
- <ctrl>, <dev>には対象のBD_ADDR(MACアドレスみたいな機器固有の数値、例: "12:34:56:AB:CD:EF")を入れる。
- scan onで対象の機器を探し、見つかったらscan offで止める。
- 一度scan onをやると、しばらくバックグラウンドで動き続けているようなのでscan offしてあげたほうがいいかも?
- いろいろ調べるために便利だったコマンド
- list、Raspberry Piが使えるコントローラ一覧の表示(普通一個しか出てこないと思う)
- show、コントローラ詳細の表示
- devices、使えるデバイス一覧の表示("使える"の本当の意味はまだよく分かっていない)
- paired-devices、ペアリングしたデバイス一覧の表示
- info、デバイス詳細の表示
ここで苦労したのは、connectがうまくいったりうまくいかなかったりしたことでした。いろいろ試行錯誤した結果、接続できなかった場合、私の環境では一度removeでスピーカーの情報をすべて削除して最初からやり直すとうまくいくことが分かりました。結局のところスピーカー側の癖なのではないかと思っています。スマホとの接続でも同じような現象になったので。。
##pactlの操作
PulseAudioをコントロールするためのコマンドのようです。
- pactlの操作に入る前に一度rebootが必要だった。
- man pactlでoptionをいろいろ確認。
- "sink"はスピーカーのこと、"source"はマイクのことだと思われる。
- pactl infoに表示されるデフォルトシンクが標準の再生デバイスみたい。
- デフォルトシンクはpactl set-default-sinkで変えられる。
- ボリュームの変更はpactl set-sink-volume "シンクインデックス番号" 50%でできた。
- シンクインデックス番号はpactl listで調べられる。
##その他
- PulseAudioがスタートしていないと、bluetoothctlでのconnectがうまくいかない。
- Linuxでのファイル再生ではaplay(ALSA経由?)をよく見かけるが、paplay(PulseAudio経由?)を使う。
- aplayで再生していると、最初のうちは動くが何回か再生していると無反応になる。
- paplayを使っている限りでは問題は起きていない。