MP3プレーヤ第14作


更新: 2019/12/15, 2019/12/21, 2019/12/28, 2020/06/06, 2020/08/06

概要

  • Raspberry PI zero W と USB-DAC によるMP3プレーヤ
  • デコーダは Raspberry PI 上の "madplay"
  • 外部アンプ+スピーカに接続して使うことを想定
  • 操作はWindows PCから。それ用のプログラムも開発した
  • 接続先となるミニコンポのUSB端子を電源の一部として利用
  • インターネットラジオ第1作のリモート再生機能追加 (2020/06/06)

ホスト/デジタル&電源部分回路

  • 接続先ミニコンポの起動と同時にPICと赤外線センサーの部分も起動する。
  • 赤外線センサーの機能は全体(RaspberryPIとアナログ部分)の起動に限っている。赤外線リモコンの長押しで全体が起動する。
  • PICの機能は電源の管理と赤外線センサーぐらい。

ホスト/アナログ部分回路

  • DACは「ヘッドホンアンプ製作実例集(CQ出版)」に付属のUSB-DAC。
  • このUSB-DAC基板の3つのピンしか使わない(電源はRaspberry PIのUSBバスパワー)。他はオープン。
  • FM放送やCDを聴くときと同じボリュームレベルで本MP3プレーヤを使えるようにしたいのでオーディオアンプを追加している。

Raspbian のインストールと設定

  • 2017-03-02-raspbian-jessie-lite (書き込みソフトは Etcher-1.4.4-x64/Windows10)
    起動速度を考慮してあえて古いバージョンを使っている。
  • Windows上でRaspbianの設定
     ・config.txtを編集する(末尾に dtoverlay=dwc2 の行を追加)。
     ・cmdline.txtを編集する(行途中、rootwaitの後ろあたりに modules-load=dwc2,g_ether を追加)。
     ・bootディレクトリにsshファイルを作成する。(エクスプローラで新規作成→テキストファイル→ファイル名をssh)
  • USBケーブル経由でログインできることを確認 (ターミナルソフトはTeraTerm。ケーブルは"USB"のポートに接続。ホスト:raspberrypi.local ID/パスワードはpi/raspberry)
  • 起動時間短縮のための各種設定(おもにこちらのサイトを参考にした)
    • sudo systemctl disable dphys-swapfile
    • sudo systemctl disable keyboard-setup
    • sudo systemctl disable kbd
    • sudo systemctl disable triggerhappy
    • sudo systemctl disable plymouth
    • sudo systemctl disable plymouth-start
    • sudo systemctl disable ntp
    • /boot/cmdline.txt の行末に quiet を追加 (sudo vi /boot/cmdline.txt)
    • /boot/config.txt に force_turbo=1 を追加 (sudo vi /boot/config.txt)
    • 固定IP化:/etc/network/interfaces に以下を追記
      allow-hotplug usb0
      iface usb0 inet static
      address 192.168.137.9
      netmask 255.255.255.0
      (gatewayの記述なし)
    • sudo systemctl disable dhcpcd
    • 再起動してUSBケーブル経由のログインができることを確認。(sudo reboot / ケーブルは"USB"ポート)
  • WIFI設定(dhcpcdは無効のまま)
    • sudo iwlist wlan0 scan
      を実行してwifiネットワークを検出できるかを確認(出力結果に "ESSID:Buffalo ...."が出ている)。
    • wpa_passphrase "Buffalo-G-...(SSID)" を実行し、暗号化キーを入力。
      出力結果をコピーする。
    • sudo vi /etc/wpa_supplicant/wpa_supplicant.conf 実行。
    • ファイルの末尾にペーストする。
    • 平文で残されている暗号化キーの行を削除してから保存する。
    • sudo wpa_cli -i wlan0 reconfigure
    • sudo raspi-config → 4 Localisation Options → I4 Change Wi-Fi Country → JP を選択して再起動
    • USBケーブル経由でログイン
    • 固定IPを振る。sudo vi /etc/network/interfaces
      allow-hotplug wlan0
      #iface wlan0 inet manual
      iface wlan0 inet static
      address 192.168.11.9
      netmask 255.255.255.0
      wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
    • 再起動後(sudo reboot)、USBケーブル経由でログイン
    • ifconfig wlan0 を実行してIPアドレスを確認。
    • 停止(sudo shutdown -h now) → USBケーブルをバスパワー専用(PWR)につなぎかえて再起動
    • 設定したIPでログインできること確認。
    • WinSCPもつながることを確認。
  • 以下、各種ソフトをインストール(各圧縮ファイルを/home/piにWinSCPでコピーしてからインストール)
  • wiringPi-8d188fa.tar.gz [(1)tar -xvf ... (2)cd ... (3)./build]
  • 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)Makefile編集 (-fforce-mem を削除して保存) (5)make (6)sudo make install]
  • UARTの無効化 [(1)sudo raspi-config (2)5 Interfacing Options (3)P6 Serial (4)No/login shell disable (5)No/serial port disable (6)reboot ]
  • BLUETOOTHの無効化 [ /boot/config.txt に dtoverlay=pi3-disable-bt を追記 ]
  • alsa-lib-1.0.28.tar.bz2 [(1)tar -xvf ... (2)cd ... (3)./configure (4)make (5)sudo make install ]
    alsa-libのバージョンはraspbian-jessie-liteにインストール済みのaplayのバージョンに合わせた。
  • madplay-0.15.2b.tar.gz [(1)tar -xvf ... (2)cd ... (3)./configure --with-alsa (4)make (5)sudo make install ]
  • ここでmadplayを引数なしで実行すると"madplay: error while loading shared libraries: libmad.so.0: cannot open shared object file: ...."のようなエラーがでる。次のコマンドが必要。
  • sudo /sbin/ldconfig
  • madplay --version (動くこと確認)
  • USB Audio設定
    • /lib/modprobe.d/aliases.conf を編集
      options snd-usb-audio index=-2 をコメントアウト
    • /boot/config.txt を編集
      dtparam=audio=on をコメントアウト
    • USB-DACをraspberry piに接続
    • 再起動
    • madplayでmp3ファイルを再生できることを確認
      madplay MP3ファイル名
  • ここまででSDカードのイメージを作成しておく。(Win32 disk imager)
    大容量SDカードに焼いたときのパーティションサイズ拡大は sudo raspi-config --expand-rootfs

プログラム間連携の概要

  • コントローラ(mp3_14_ctrl/windows)からは再生対象のディレクトリ/MP3ファイルの選択、再生開始・停止、音量変更、ホストの電源遮断、データファイルの更新指示(mp3_14_mkflの実行指示)などを行える。
  • mp3_14_ctrlはローカルのデータファイルに基づいてディレクトリ構造と曲目リストを表示する。
  • mp3_14_menuはホスト側の中心。mp3_14_ctrlからの指示に基づいてmadplay/mp3_14_mkflの実行を制御する。
  • mp3_14_servはmp3_14_menuとmp3_14_ctrlとの通信の中継のみ行う。
  • mp3_14_mkflはデータファイルの作成を行う。このプログラムの実行はMP3ファイルを追加したときなどだけ。ディレクトリ構造を直接読み取るのはこのプログラムだけ。Windows側データファイルとの同期チェックのため、ヘッダレコードにタイムスタンプを記録している。
  • ホストのデータファイルをWindowsにコピーするのにWinSCPをコンソールモードで実行する。

作成したプログラム(ホスト/Raspberry PI)

  • mp3_14.sh ... crontabの@rebootに登録して自動起動する。[(1) sudo crontab -e (2)テキストエディタ選択 (3) @reboot /home/pi/mp3_14/mp3_14.sh 追記 (4) 保存 ]
  • mp3_14_menu ... メイン処理
  • mp3_14_serv ... 通信中継
  • mp3_14_mkfl ... ディレクトリ構造・曲目リストのデータファイル作成
  • Makefile ... 以上のコンパイル
  • 以上のソースはこちら
  • madplay ... オープンソースのコマンドライン版デコーダ。socketを通じてコントロールするための改造を加えている。手を加えたソースは次の通り。ソース中の "MP3_14" をたどれば手を加えた箇所がわかる
    • madplay.c
    • player.h
    • player.c
    • Makefile ... コンパイルはこれを使って sudo make install
    • ソースはこちら。オリジナルのソースはこちら

作成したプログラム(ホスト/PIC)

  • 機能は割とシンプル。電源の管理と赤外線リモコンの受信である。
  • 赤外線リモコンの長押しで全体の電源が起動する。信号の中身はチェックしてないのでリモコンは何でもよい。
  • CCS社のPIC18用コンパイラ(PCH V5.046)+MPLAB X IDE(v5.05)で開発した。ソースの一式、こちら
  • PICへの書き込みはPicKit3を使っている。

作成したプログラム(コントローラ/Windows)

  • 再生対象のディレクトリ/MP3ファイルの選択、再生開始・停止、ランダム再生の開始、同一ディレクトリ内の次の曲・前の曲への移行、再生中の曲の中での先送り・後戻り、音量変更、ホストのシャットダウン、データファイルの更新指示(mp3_14_mkflの実行指示)
  • C#2019(Visual Studio Community 2019)で開発した。ソースの一式、こちら
  • データファイルをホストからコピーするためのWinSCPのスクリプトはこちら。
  • 左は実行中の画面。画面左にディレクトリ構造をTreeViewで表示、画面右上に選択中のディレクトリ内の曲目リストを表示、画面右下に制御用のボタンなどを配置している。

ホスト実装

  • USB-DACはUSBケーブルとともにケース(タカチ SY-190)に組み込んだ。
  • 前作(MP3_13)以来の経験からOSが破損することはあまりないのと、MP3ファイルのコピーはWIFIを通じてできるので、Raspberry PIもケース内に完全に組み込んでいる。

結果

  • 128GByteのSDカードで運用中。まだ半分ぐらい容量に空きがある。
  • オーディオアンプのゲインがもう少しあってもよかった。
  • PICからRaspberry PI zeroへのシャットダウン指示は機能していない。そのため実行中に前面パネルのスイッチを押すとRaspberry PIは正常な終了処理を経ることなく電源が落とされることになる。PIC->Raspberry PIのI2C通信など検討してもよかった。(通常はWindows上のコントローラから停止指示が出され、Raspberry PIの正常な終了処理が行われるので大きな問題ではないが。)

インターネットラジオ第1作(IR01)のリモート再生機能追加(2020/06/06)

  • インターネットラジオ第1作からPCを経由することなく直接本機にMP3ファイルを転送して再生できる
  • 本機のWindows版コントローラが管理しているディレクトリではない専用のディレクトリを使うので、リモート再生の制御はすべてIR01から。
  • 現時点のソースはこちら

専用コントローラ作成(2020/08/06)

TCP/IP通信にESP-WROOM-02を使う専用コントローラも作成してみた。詳細はこちら
これに伴いホスト側のプログラムも変更した。現時点のソースはこちら


MP3プレーヤのページに戻る トップページに戻る