最終更新日
記事公開日

【ラズパイZERO2W】bluetoothスピーカーを改造してradiko専用プレイヤーを作る

スマホでradikoを流してると、

  • インスタやYouTubeを見るときに止まる
  • いちいちアプリを開くのが面倒

そんな不満、ありませんか?

ボタンを押すだけでradikoが流れる。

そんな専用機を、ダイソーのレトロスピーカーを改造して作ってみました。

adiko専用プレイヤー(前)
adiko専用プレイヤー(裏)

使用部品

ダイソーのレトロスピーカーの外箱

見た目は昔のラジオ風ですが、中身はBluetoothスピーカーです。

microSDカードの音楽再生にも対応していて、音量も十分。

これで700円という価格は、さすがダイソーです。

そして何より、このレトロなデザインが素晴らしい!

ラジオ専用機として改造するにはピッタリの雰囲気です。

Raspberry Pi Zero 2 W

さて、今回の改造の主役となるのが「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用ユニバーサル基板

回路図

radiko専用プレイヤーの回路図

動作解説

radiko専用プレイヤーの基板配線写真

リチウムイオン電池(18650)3.7VをMT3608搭載DCDC昇圧モジュールを使い、ラズパイZero2wの動作電圧である5Vへ変換しています。

その他の大部分の回路は、ラズパイZero2wが待機中に消費する電流を抑えるための回路です。

詳しくは下記の記事をご覧ください↓

ラズパイZero2Wの省電力回路(shutdownコマンド後に電源遮断)

ラズパイとスピーカーの電源スイッチ連動

ラズパイZero2wとレトロスピーカーは、bluetoothで接続しているので、配線はありません。

唯一、スライドスイッチをONにしたときに、連動してレトロスピーカーの電源をONにするための配線があります。

スライドスイッチを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に接続できない。
詳しくは下記の記事をご覧ください↓

【ラズパイZero2W】Lite版OSでWi-Fi接続できない問題

この記事のURLをコピー

メールアドレスは公開されませんのでご安心ください。また、* が付いている欄は必須項目となります。

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。

関連情報

  • 【2025年度版】マイコンおすすめランキングBEST5
運営者プロフィール
コダマ

職業はIT系フリーランス。過去、電子配線業務の経験が10年ある為、はんだづけも得意です。宮崎県在住、30代・2児の父親。

プロが教える!イチからわかるハンダ付けのコツ(工学社)の著者です。

カテゴリー