Raspberry Pi 3B にはBluetoothが搭載されている。
このBluetoothでGoogle Nest mini と接続し、
cronで定時チャイムを鳴らしたかったのだがなかなかうまくいかなかったメモ。
環境
Raspberry Pi3 Model B
% cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)"
NAME="Raspbian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
% uname -srvmpio
Linux 5.10.103-v7+ #1530 SMP Tue Mar 8 13:02:44 GMT 2022 armv7l unknown unknown GNU/Linux
まず結論
- pulseaudio を system モードで起動する
-
system.pa
に bluetooth モジュールと switch-on-connect モジュールを有効化する設定を入れる
仕組み(自分の理解)
Linuxは低レイヤーではALSAという仕組みで音を鳴らしている。
これを高レイヤーに抽象化しているのが pulseaudio
cf. https://ja.wikipedia.org/wiki/PulseAudio
cf. https://wiki.archlinux.jp/index.php/PulseAudio
cf. https://mickey-happygolucky.hatenablog.com/entry/2015/04/04/105512
ALSAはカーネルランドの仕組みなので、Linuxが起動すれば特に何もしなくても使える。
一方で、pulseaudio はユーザランドの仕組みであり、通常はユーザ毎に起動が必要。
ただし、この起動は systemd で自動化されているので、ユーザが気付くことは通常ない。
また、システムグローバルで pulseaudio を実行することも可能。(しかし、セキュリティの問題で推奨されない模様)
そして、pulseaudio がユーザ毎に起動するときに読み込む設定ファイル /etc/pulse/default.pa
と、
システムグローバルで起動する時に読み込む設定ファイル /etc/pulse/system.pa
は違う。
そしてそして、default.pa
にはBluetoothを利用するための設定が入っているが、system.pa
にはそれがない。
あと、ユーザ起動した pulseaudio は Bluetooth 接続するとデフォルトの出力先がそちらに切り替わるのだが、
システム起動するとデフォルトの設定では切り替わらない。
これを切り替えられるようにするため、system.pa
を修正するのだが、
なぜかdefault.pa
にはその設定がなくても前述の通り自動で切り替わる・・・謎。
なお、pulseaudio のモジュールは、下記ディレクトリに格納されている。
/usr/lib/pulse-14.2/modules/
実際やること
必要なパッケージのインストール
sudo apt install pulseaudio-module-bluetooth sox libsox-fmt-all
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 autodetect_mtu=yes
.endif
### Automatically switch to newly-connected devices
load-module module-switch-on-connect.so
前半のブロックがBluetoothモジュールの読み込み、
後半のブロックが接続された機器に自動的に切り替える設定。
cf. https://wiki.archlinux.jp/index.php/Bluetooth_%E3%83%98%E3%83%83%E3%83%89%E3%82%BB%E3%83%83%E3%83%88
pulseaudio をシステムモードで起動
sudo pulseaudio -D --system --disallow-exit
--disallow-module-loading
オプションを付けるとうまくいかない??
Bluetooth 接続
こちらの記事も参照: https://qiita.com/takashi53/items/f6a866f0081609dbb8d6
bluetoothctl
scan on
scan off
pair <MACアドレス>
connect <MACアドレス>
trust <MACアドレス>
exit
connect
を打ったタイミングで、Bluetoothスピーカーとの接続が確立されるハズ。
もし確立できない場合は、pulseaudio がきちんと立ち上がっていないか、Bluetoothモジュールが入っていない可能性がある。
試す
play /usr/share/sounds/alsa/Front_Center.wav
そのほか、今後の展望
- もしかしたら、 pulse ユーザを適切なグループに属させないといけない?
- pulseaudio のシステム起動を systemd 化したい。要調査。
- VOICELOIDとかと連携させたいがキツそうなのでVOICEVOXにチャレンジしてみる。