Raspberry Pi ZeroでBluetooth A2DP接続可能なFMトランスミッタを拵える、試み

- 購入品

こいつ買いました。ヒートシンクはケースを固定してから貼り付けたほうが良いでしょう。ネジ穴に遊びがあるので、先にヒートシンクを固定するとケースのネジが入らなくなることもあります。HDMIケーブルはMiniでした。

 

- 準備

Rasbian BusterのイメージをSDに焼いてブートします。GUIが立ち上げるのでマウスを接続して、またあるときはキーボードを接続してネットワークの設定を終えます。

メインメニューからRasbianの設定つうとこで、次回ブート以降はCUISSH有効としておいてからリブート。こっから先は全てSSH経由で行います。

 

- 注意

あちこちのサイトにGPIOに20cmの電線つなげと書いてますが、やっちゃ駄目です。久しぶりに太字にしたな。もう一度。やっちゃ駄目です。

野良FM局として認められる出力を簡単に超えちゃいます。アンテナは接続せず、受信側のラジオのアンテナを近づけてテストしましょう。

asliceofraspberrypi.blogspot.com

もうひとつ、テストが終わったらraspiはshutdownするかrebootしましょう。じゃないと搬送波が出力されっぱなしです。

私は最終的にFMトランスミッタとしての使用を諦めました。そうで無い方はバンドパスフィルタを入れたほうが安全でしょう。GPIOを矩形波で駆動しているので奇数次の高調波がモリモリ出てます。飽くまでも自分で何やってるか分かってる人が自己責任でやっちゃってつかあさい。人に迷惑をかける前にバカは帰ってください。

 

- 情報収集

お題目のようなことは誰かが何処かでもうやっちまってるんでパクりゃあええんです、パクりゃあ。

mickey-happygolucky.hatenablog.com

割と分かりやすかった。誰にでもわかるBluetooth A2DPの拵え方。PulseaudioでSinkを作ってます。で、ほぼこの通りにA2DPレシーバを設定して、pifmで飛ばしてみたのだが、あまり芳しくなかった。Pulseaudioのバッファリングに問題があるのだろうと予想するが、どもっちゃうんだ、吃音、stutter。

実際、/etc/pulse/daemon.confのrealtime-scheduling、resample-method、avoid-resampling、default-fragments、default-fragment-size-msecをいじくり回すとやや改善するんだが、数十秒に一度程度の頻度で吃音しよる。

Pulseaudioって便利に使ってるけど、造りが大仰な分レスポンス悪いイメージだよねえ。しかし、我々にはALSAがあるさ。しかーし、

stackoverflow.com

質問は2012年、回答が2014年、フォローが2017年というご長寿で且つ示唆に富むスレッド。回答の中にあったリンクが面白かったので読んでみよう。

From the desk of James - Powered by SJPPLOG

 読んだ?隔靴掻痒感がひっしひしと伝わってくる。ともかく、bluez4から5にバージョンアップした際にA2DPシンク対応は外されたらしい。んで、話にには続きがあって、

From the desk of James - Powered by SJPPLOG

/etc/bluetooth/audio.confのSocketってどういう意味だよ、ってんで分かんねえんだよ、資料は何処だよ、つって騒いでいる。bluezはそもそもIntel主導で開発が始まり、その後Nokiaに渡り、と出生がややこしい。んで、必要な資料さえままならない。

加えて、SourceとSinkの考えが混乱している。Sinkが欲しいのに、audio.confにはSourceと書かなきゃならない理由がはっきり書いてあった。頭おかしい。

で、時は流れて。bluealsa (かつてはbluez-alsa)が生まれた。

qiita.com

このとおりにやって上手く行く人は上手く行くでしょう。そうじゃない方は恐らく、bluetoothctl showとやってもSinkが列挙されていないのではないでしょうか。手持ちのスマートフォンからRaspiのbluetoothが見えていて、connectボタンを押せるのに、接続されたかと思うとすぐに切断される。bluealsaのサービスがデフォルトではSinkが有効になっていないんです〜、おー怖っ。/lib/systemd/system/bluealsa.serviceをさっさと書き換えましょう。

 

[Unit]
Description=BluezALSA proxy
Requires=bluetooth.service
After=bluetooth.service

[Service]
Type=simple
User=root
ExecStart=/usr/bin/bluealsa -p a2dp-sink

 

 - 使えるのか?

bluetooth A2DP経由でpifmへ流し込んでFM放送できます。でも使えません。pifmが音痴なんです。CPUに負荷が掛かるとdistortion、歪が耳障りなレベルで発生します。

Clock output & FM transmitter - Raspberry Pi Forums

pulseaudioの時は吃音がひどくて歪には気が回りませんでしたが、確認したら音痴でドモリでした。

音楽を聞かないのならありかも。