MP3プレーヤ第19作

Raspberry PI ZeroW 上のソフトウエアデコーダ+BluetoothによるMP3/AACプレーヤ。

更新: 2024/04/13, 2024/05/17


概要

  • Raspberry PI zeroのBluetooth設定についてはこちらのサイトを参照
  • bluetoothの接続先アドレスはテキストファイルに持たせる。新しい接続先の追加を本機のUIで実現するのは面倒だし頻度も無いので手動管理する。
  • Raspberry PI zeroのI/O制御はpigpiodを使った
  • MP3のデコードはlibmad 0.15.1b
  • libmadを利用するアプリケーション(madplay)を改造
  • AACのデコードはfaad2を少し改造
  • faad2のサンプルアプリケーションfrontendを元にAACプレーヤプログラムを作成

本製作の回路

  • PICはあり合わせのもので、電源管理用
  • 表示器は秋月の「0.96インチ 128×64ドット有機ELディスプレイ(OLED)」(制御チップSSD1306)

OS/各種ソフトのインストール

  • OS
    • 最初は8GBのマイクロSD。システムが完成してきたら大容量のマイクロSDにコピーする。
    • imager 1.8.4 (Windows10)
    • Raspberry Pi OS (Legacy , 32-bit) Lite / リリース:2024-03-12
    • ホスト名:mp3-19.local
    • ユーザ名:pi
    • Wi-Fi:SSID/パスワード, wifiを使う国:JP
    • タイムゾーン:Asia/TOKYO, キーボードレイアウト:JP
    • SSHを有効化する / パスワード認証を使う
    • テレメトリーを有効化
  • SDカードをRaspberry Piにセットして起動
  • TeraTerm接続
    • 新しい接続 - TCP/IP(IPアドレス直指定) - SSH
      最初はmp3-19.localでアクセス不可。wifiルータの管理機能でIPアドレスを確認。後にはmp3-19.localでアクセス可になる。
    • セキュリティ警告 - 既存のカギを新しいカギで上書きする
    • SSH認証 - パスワードをメモリ上に記憶する - プレインパスワードを使う
    • ログイン成功
  • シリアルポート有効化
    • シリアルポート設定 - (1)sudo raspi-config (2)Interface Options (3)Serial Port (4)Would you like a login shell to be accessible over serial ? (5)Yes (6)Finish
    • 停止 - sudo shutdown -h now
    • USB-Serial変換器接続 - GPIO14(TX) / GPIO15(RX)
    • TeraTerm設定 - (1)シリアル:COM5 (2)設定 - シリアルポート - スピード:115200 等
    • 起動 - (1)UNIXらしい起動プロセス表示 (2)mp3_19 login/password (3)ログイン成功
  • WinSCP接続確認 - 転送プロトコル:SFTP - ホスト名:mp3-19.local - ポート番号:22 - 接続OK
  • OS Update (1)sudo apt update (2)sudo apt full-upgrade (3)sudo apt clean
  • 再起動 - sudo reboot
  • Bluetooth設定
    • こちらのサイトに従う
    • インストール - (1)sudo apt-get install pulseaudio pulseaudio-module-bluetooth - continue? Y - 所要5分程度 (2)sudo usermod -G bluetooth -a pi (3)再起動 - sudo reboot (4)pulseaudio起動確認 - ps -ael | grep pulse
    • bluetoothctl - (1)power on (2)agent on (3)scan on (4)pair (5)trust (6)connect (7)quit
    • 再生確認 - aplay ~.wav
    • 再起動 - sudo reboot
    • 接続確認 - bluetoothctl connect AA:BB:CC:DD:EE:FF
    • 再生確認 - aplay ~.wav
  • pigpio library
    • こちらのサイトに従う
    • インストール - (1)wget https://github.com/joan2937/pigpio/archive/master.zip (2)unzip master.zip (3)cd pigpio-master (4)make (5)sudo make install
    • エラー発生:ModuleNotFoundError: No module named 'distutils.core'
    • エラー対処・インストール続き - (1)sudo apt install python-setuptools python3-setuptools - continue? Y (2)sudo make install
    • check the library - (1)sudo pigpiod (2)./x_pigpiod_if2 (3)すべてPASS
  • libid3tag-0.15.1b.tar.gz - (1)tar -xvf ... (2)cd ... (3)./configure (4)make (5)sudo make install
  • libmad-0.15.1b.tar.gz - (1)tar -xvf ... (2)cd ... (3)./configure (4)sudo vi Makefile (-fforce-mem を削除して保存) (5)make (6)sudo make install
  • alsa-lib-1.2.4.tar.bz2 - (1)tar -xvf ... (2)cd ... (3)./configure (4)make (5)sudo make install (6)sudo /sbin/ldconfig
  • madplay-0.15.2b.tar.gz - (1)tar -xvf ... (2)cd ... (3)./configure --with-alsa (4)ソースとMakefileをダウンロード (5)改修ソースとMakefileをアップロード (6)make (7)sudo make install (8)which madplay
  • cmake - (1)sudo apt update (2)sudo apt install -y cmake (3)cmake --version (4)表示:cmake version 3.18.4
  • faad2-master.zip - (1)Windows上で展開 (2)CMakeLists.txt改修 (3)ソース改修 (4)ディレクトリfaad2-master転送 (5)cd faad2-master (6)mkdir build (7)cd build (8)cmake .. (9)make (10)sudo make install
  • WIFI設定
    • NetworkManager有効化 - (1) sudo raspi-config (2)Advanced Options (3)Network Config (4)NetworkManager (5)"NetworkManager is active" メッセージ (6)Finish (7)reboot now? - Yes
    • nmcli radio wifi
    • nmcli dev wifi list
    • sudo nmcli --ask dev wifi connect ***********
    • nmcli dev wifi list
    • sudo reboot
    • WinSCP接続確認 / TeraTerm wifiログイン確認
  • I2C - (1)sudo raspi-config (2)Interface Options (3)I2C (4)Yes
  • ここまでの動作確認 - (1)再起動 (2)bluetoothctl connect AA:BB:CC:DD:EE:FF (3)再生確認 aplay ~.wav
  • ここまでのSDイメージ作成 (Win32 Disk Imager)

作成したプログラム(Raspberry PI)

  • mp3_19.sh
    • メインシェル
    • OS起動時に自動起動される(systemd)
    • pigpiodの起動と停止、mp3_19_menuの起動、mp3_19_menuの戻り値に基づいてRaspberry PIのシャットダウンまたはリブート
  • mp3_19_menu
    • メインメニュー
    • ディレクトリ構造を表示し、再生対象を選択する
    • 以下のプログラム(mp3_19_mkfl/mp3_19_bt.sh/madplay/fadplay)を起動する
  • mp3_19_mkfl
    • ディレクトリ構造、音源ファイル一覧、ランダム再生順などを記述するマスタファイルを生成
    • OLEDに表示するイメージもここで作成してマスタファイルに保存する
  • mp3_19_bt.sh
    • Bluetooth接続スクリプト
    • pulseaudioの再起動もできるようにしている。そこからしないとBluetooth接続ができないことがあるため。
  • 以上4点のソースはここ
  • madplay
    • MP3プレーヤ
    • オリジナルのmadplayにsocket pairを通じてmp3_19_menuと通信する機能、音量調整する機能、などを追加
    • 改修されたソースはここ。改修箇所はソース中の#if defined(MP3_19)。
  • libfaad
    • AACデコードライブラリ
    • オリジナルのlibfaadに音量調整の機能を追加
    • 改修されたソースはここ(libfaadは今も更新されているが、ここでは手を加えたソースだけ)。改修箇所はソース中の#ifdef MP3_19。
  • fadplay
    • AACプレーヤ
    • faad2のサンプルプログラムfrontendにmadplayのALSA処理(audio_alsa.c)を流用して新規作成
    • ソース一式ここ

作成したプログラム(PIC)

  • 電源の管理。電源OFFの際にはRaspberry PIにシャットダウン指示し、全体の電源を切る。
  • 再生中であってもタイムアウト時間が来たら電源を切る(再生中は連続3時間、非再生中は10分)。
  • CCS社のPIC18用コンパイラ(PCH V5.046)+MPLAB X IDE(v5.05)で開発した。ソース
  • PICへの書き込みはPicKit3

Bluetooth接続のトラブル

  • ときどきBluetooth接続がエラーになる。再接続を試みると成功することも多いが。
  • pulseaudioがなぜか自動起動しないことがあり、それが接続エラーの原因の一つになっている。
  • mp3_19_bt.shはpulseaudioが起動していなければ起動するようにしたが、今度はpulseaudioが重複実行状態になることがある。
  • そのような場合はpulseaudioのkillと再起動、bluetooth接続を行う(そのためのオプション機能を作成した)。
  • bluetooth接続が出来たとしても音が出ないことがある。音だしの確認のため、接続成功時にMP3のチャイム音を再生する。
  • チャイム音が出ないときは接続からやり直す。
  • チャイム音が出てもその後の音源ファイルの再生でなぜか音が出ないことがある。その場合も接続からやり直す。

結果

  • 256GBのマイクロSD(量販店の店頭で最も安かったKIOXIAのもの)にシステムをコピー
  • 所有する音源の大部分を転送したが、システム+音源でメディアの使用量は90GB程度
  • Bluetooth接続で上記のようなこともあるが、音が出るようなれば安定して動作する。
MP3プレーヤのページに戻る トップページに戻る