- 最終更新日
- 記事公開日
【ラズパイZERO2W】bluetoothスピーカーを改造してradiko専用プレイヤーを作る
スマホでradikoを流してると、
- インスタやYouTubeを見るときに止まる
- いちいちアプリを開くのが面倒
そんな不満、ありませんか?
ボタンを押すだけでradikoが流れる。
そんな専用機を、ダイソーのレトロスピーカーを改造して作ってみました。
使用部品
見た目は昔のラジオ風ですが、中身はBluetoothスピーカーです。
microSDカードの音楽再生にも対応していて、音量も十分。
これで700円という価格は、さすがダイソーです。
そして何より、このレトロなデザインが素晴らしい!
ラジオ専用機として改造するにはピッタリの雰囲気です。
さて、今回の改造の主役となるのが「Raspberry Pi Zero 2 W」
今回は、SSL通信やストリーミング再生が必要になるので、マイコンではちょっと力不足。
OSを搭載したラズパイZero2wを使用することにしました。
その他の使用部品
- スライドスイッチ(1回路2接点)
- 炭素被膜抵抗 1/4(10kΩ)
- 炭素被膜抵抗 1/4(47kΩ)
- 炭素被膜抵抗 1/4(330Ω)
- 炭素被膜抵抗 1/4(1kΩ)
- 炭素被膜抵抗 1/4(300Ω)
- 積層セラミックコンデンサ 104k(0.1uF)
- 電解コンデンサ(4.7uF/50V)
- IC(74HC74)
- トランジスタ(2SC1815)
- PchパワーMOSFET(MTP4835I3)
- フォトリレー(TLP241A)
- Raspberry Pi ZERO用ユニバーサル基板
回路図
動作解説
リチウムイオン電池(18650)3.7VをMT3608搭載DCDC昇圧モジュールを使い、ラズパイZero2wの動作電圧である5Vへ変換しています。
その他の大部分の回路は、ラズパイZero2wが待機中に消費する電流を抑えるための回路です。
詳しくは下記の記事をご覧ください↓
ラズパイとスピーカーの電源スイッチ連動
ラズパイZero2wとレトロスピーカーは、bluetoothで接続しているので、配線はありません。
唯一、スライドスイッチをONにしたときに、連動してレトロスピーカーの電源をONにするための配線があります。
レトロスピーカーは電源ONとOFFボタンが共通で、3秒長押しすることで、電源のON・OFFを行います。
そこで、GPIO17とレトロスピーカーのスイッチを配線でつなぎ、ラズパイZeroの起動時・シャットダウン時に、下記のコマンドが実行されるように設定しています。
起動時
#!/bin/bash
# GPIO17を出力に設定
raspi-gpio set 17 op dh
# 3秒待機
sleep 3
# LOWに戻す
raspi-gpio set 17 op dl
シャットダウン
#!/bin/bash
# シャットダウン直前に GPIO17 を3秒High
raspi-gpio set 17 op dh # High
sleep 3
raspi-gpio set 17 op dl # Low(戻す、なくてもOK)
radiko再生プログラム
#!/usr/bin/env bash
set -euo pipefail
DEVICE_MAC="4F:B7:DB:F7:7D:EA"
RADIKO_STATION="LFR"
export YT_DLP_PLUGIN_DIR="$HOME/.config/yt-dlp/plugins"
# ===== チューニング(起動時間短縮用) =====
BT_RETRIES=10 # BT接続リトライ回数
BT_SLEEP=1 # BTリトライ間隔(秒)
SINK_WAIT_LOOPS=40 # sink待ち回数
SINK_WAIT_STEP=0.5 # sink待ち間隔(秒)
URL_RETRIES=12 # URL取得リトライ回数
URL_SLEEP=1 # URLリトライ間隔(秒)
VOL="85%"
log(){ echo "radiko_fast: $*"; logger -t radiko_fast -- "$*"; }
# 0) pulseaudio を確実に起動(速やかに)
pulseaudio --check || pulseaudio --start || true
# 1) BT接続(短い間隔でテンポよくリトライ)
for i in $(seq 1 $BT_RETRIES); do
if echo -e "connect ${DEVICE_MAC}\nexit" | bluetoothctl >/dev/null 2>&1; then
log "bluetooth connected (try $i)"
break
fi
sleep "$BT_SLEEP"
done
# 1.5) A2DPへ(カードが見えたら即切替)
card=$(pactl list short cards | awk "/bluez_card\.${DEVICE_MAC//:/_}/ {print \$2; exit}" || true)
[[ -n "${card:-}" ]] && pactl set-card-profile "$card" a2dp-sink || true
# 2) sinkが出るまで素早く待つ(0.5秒刻み)
SINK=""
for i in $(seq 1 $SINK_WAIT_LOOPS); do
SINK=$(pactl list short sinks | awk "/bluez_(sink|output)\.${DEVICE_MAC//:/_}.*a2dp[-_]sink/ {print \$2; exit}" || true)
if [[ -n "$SINK" ]]; then
log "sink detected: $SINK (try $i)"
pactl set-default-sink "$SINK" || true
pactl set-sink-mute "$SINK" 0 || true
pactl set-sink-volume "$SINK" "$VOL" || true
break
fi
# 0.5秒スリープ
python3 - <<'PY' 2>/dev/null || sleep "$SINK_WAIT_STEP"
import time; time.sleep(float("$SINK_WAIT_STEP"))
PY
done
if [[ -z "$SINK" ]]; then
log "ERROR: bluetooth sink not found. abort."
exit 1
fi
# 3) Radiko URL をすぐ取りに行く(ネットが上がり切る前提でリトライ)
RADIKO_URL=""
for i in $(seq 1 $URL_RETRIES); do
RADIKO_URL="$(yt-dlp -q -g 'https://radiko.jp/#!/live/'"$RADIKO_STATION" | tail -n1 || true)"
if [[ -n "$RADIKO_URL" ]]; then
log "url ok (try $i)"
break
fi
sleep "$URL_SLEEP"
done
if [[ -z "$RADIKO_URL" ]]; then
log "ERROR: radiko url fetch failed."
exit 2
fi
log "play: $RADIKO_STATION via $SINK"
# キャッシュは切って“鳴り始め”を早く
exec mpv --no-video --ao=pulse --audio-device="pulse/$SINK" "$RADIKO_URL"
事前準備
対象の Bluetooth スピーカーは ペアリング&trust(信頼済み) にしておいてください。
(bluetoothctl で pair → trust → connect の流れ)
使っているコマンド
radikoの再生URL取得には、「yt-dlp-rajiko」というコマンドを使用し、取得したURLを mpv に渡してストリーミング再生しています↓
https://github.com/garret1317/yt-dlp-rajiko.git
地域設定の注意
yt-dlp-rajiko は 既定で「areafree(エリアフリー)」 が有効になっています。
このままだと、本来は有料プランでしか聞けない全国のラジオ局が再生できてしまうため、実運用では居住地域に合わせた地域フィルタを設定してください。
【番外編】YouTube音声再生
ちなみに、YouTubeの再生リストを指定して音声のみを再生することも試しましたが、動画から音声への変換に時間がかかりすぎて実用的ではありませんでした。
結局、一度すべての音声をRaspberry Pi Zero内に保存してから再生する方法が、最も現実的な選択肢でした。
トラブルの記録
今回の改造で起きたトラブル情報を残しておきます。
スピーカーと接続できなくなった
突然、ラズパイとスピーカーが接続できなりましたが、下記のコマンドを実行し、Bluetoothをリセットすることで解決。
sudo systemctl stop bluetooth
sudo /usr/libexec/bluetooth/bluetoothd -n -d
ラズパイZero2Wが起動しない
リチウムイオン電池18650で起動させるには、電圧降下にかなり気を遣う必要がある。
詳しくは下記の記事をご覧ください↓
ラズパイZero2Wがリチウムイオン(18650)で動かない場合の対処法5選
ラズパイZero2WがWi-Fi接続できない
Raspberry Pi OS Liteは、古いバージョンをインストールしないとWi-Fiに接続できない。
詳しくは下記の記事をご覧ください↓