MP3プレーヤ第13作

ソフトウエアデコーダ(Raspberry PI zero上で動作)+I2S接続DACによるMP3プレーヤ。
昨年(2018年)10月にRaspberry PI zeroを購入して以来、5カ月かけてようやく完成。

更新: 2018/12/03, 2018/12/09, 2018/12/15, 2018/12/23, 2019/02/11, 2019/02/16, 2019/02/16, 2019/02/24, 2019/03/02, 2019/03/09, 2019/03/30, 2024/05/21, 2024/07/14

概要

回路1(電源とデジタル系)

  • 電源とLCD(TG12864B)の制御はPIC(18F26K22)で行う。
  • 音源データ/メニューデータ/フォントファイルなどはRaspberry PI のマイクロSDに置く。
  • 電源以外のSWはすべてRaspberry PIに接続する。
  • Raspberry PIからPICへのLCD表示データの転送はSPIを使う。Raspberry PIがマスタ、PICがスレーブ。
  • PICからRaspberry PIへの指令としては電源オフにおけるRaspberry PIのシャットダウンがあるが、その仕掛けは検討中。
    →左回路図の"DIRECT_PDOWN"のラインでPICからRaspberry PIへの停止指示。Raspberry PIのスクリプト(mp3_13.sh)でshutdown。PICは十分な時間をおいてから(Raspberry PIの完全停止を確認することはなく)、全体の電源を遮断。(2019/02/11加筆)
  • 回路図更新(2019/02/11)
  • PICはLCDの電源電圧に合わせて5Vで動作させているが、Raspberry PIは5V tolerantではないらしい、ということを後になって知った。(2019/03/30)

製作1(電源とPIC,LCD)

PICのプログラムソース中で埋め込んだイメージデータの表示テスト。イメージデータは秋月のsampleデータを使用。
PIC,LCDともにソケットを使わないで直にはんだ付けしているので、まめに動作確認していきます。

製作2(電源とPIC,LCD/SPIのテスト)

Raspberry PIとの連携に着手する前に、別のPICをSPIのマスタとしてイメージデータをSPI経由で送信し表示させるテストを行う。
これでPICに盛り込む機能の基本的な動作確認はできた。

ケース加工発注

  • 第12作に続いてケースの加工をタカチに発注した。窓口は前回と同様、共立エレショップ。
  • ケースの型番は今回も(個人的にお気に入りの)YM-150。図面データはこちら
  • ケース代+加工費用は11,170円
  • できてきたケースに部品を仮付けしてみた。しかしここでLCDとタクトスイッチがケース内でぶつかることが判明。しかたなくタクトスイッチの個数を10から9に減らし、並びを3列から2列に変更した。スイッチの機能割り当ての再検討が必要。使わなくなった穴はスイッチの機能名ラベルなどを貼ってふさぐことにする。

製作3(Rapberry PI - PIC 間SPI通信)

次にRaspberry PIをSPIマスタとするテストを行う。この時点のプログラムはこれ。PICのプログラムはCCS-Cで作成。Raspberry PIのプログラムとともにかなり粗削りで、参考にしたプログラムの痕跡が明確に残っています。
RaspberryPIで参考にしたサイトは、
Raspberry Pi 2でSPI接続のグラフィック液晶の制御
・raspberrypi.orgのSPI、 このページで配布されているLoopback testプログラム

回路2(アナログ系)

  • アナログ部分についてこだわりはないので定番のキーパーツで簡単にした。
  • PCM5102まわりの回路は以下のページを参考にした。
    Raspberry Pi PC化基板回路図
    Rapberry Pi2 B+ の DAC I2S の製作回路図
    TIの資料(PCM510xA 2.1 VRMS, 112/106/100 dB Audio Stereo DAC with PLL and 32-bit, 384 kHz PCM Interface)のなかの回路(10.1.1 Typical Applications)
  • 回路図更新(2019/02/11)
  • モノラルで聴くことが多いので、その場合片チャンネルのオーディオアンプの電源を遮断できるようにしている。

製作4

製作の最終盤

OS/基本ソフト

  • 2017-03-02-raspbian-jessie-lite
  • wiringPi-8d188fa.tar.gz
  • libid3tag-0.15.1b.tar.gz
  • libmad-0.15.1b.tar.gz
  • alsa-lib-1.0.28.tar.bz2
  • 設定などの試行錯誤はこちら。I2Sオーディオの基本的な設定のほか、起動時間を最小化するための設定をしている(少し前のraspbianをつかっているのもそのため)。

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

内容はシンプルで、全体の電源制御とLCDの表示である。LCDのイメージデータはRaspberry PIで生成されてSPIでPICに送られる。PICはそれをそのまま表示する。
ソースはこちら。CCS社のPIC18用コンパイラ(PCH V5.046)で開発

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

  • mp3_13.sh
    • crontabの@rebootに登録されてRaspbianの起動時に自動で起動される。
      @reboot /home/pi/mp3_13/mp3_13.sh
    • ここからmp3_13_menu/mp3_13_mkflに分岐。
    • 最後にshutdownを実行。
  • mp3_13_menu ... 新規作成したプログラムの中心。
    • 電源SW以外のSWの入力操作。
    • LCDの表示イメージを作成してPICに送信
    • MP3デコーダ(madplay)の実行と制御。
      • madplayとの通信はソケットで行う。socketpair()で生成したソケットをmadplayの起動時引数として渡します。
      • madplayの制御は起動時引数の付加、音量の調整、再生途中の終了。
      • 曲途中からの再生はmadplayの --startオプションで。
      • 曲途中での早送りと巻き戻しにも対応。madplayをいったん終了してから --startオプションを付けて再起動する方法で対処した。安直な方法だがタイムラグは全く気にならない。
    • 仕様変更(2024/07/14)
      • インデックス画面の廃止
      • ランダム再生の仕様変更。所定のフォルダはファイル単位のランダム再生とする。
  • mp3_13_mkfl
    • mp3_13_menuの入力ファイル(MP3ファイルを置くフォルダの構成を記述したデータファイル)を生成する。
    • LCDに表示するフォルダ名・曲名のイメージデータもここで作成してデータファイルに含める。
    • ランダム再生の再生順もこのプログラムで決めている。
    • このプログラムはRaspberryPIに依存しないので、WSL上のDebianで基本的な開発・テストを行ってからRaspberryPIで仕上げた。。
    • ランダム再生の仕様変更に対応(2024/07/14)
  • 以上の新規作成したプログラムはこちら

改造したプログラム(Raspberry PI)

  • madplay-0.15.2b
    • コマンドラインで実行するスタイルのMP3デコーダですが、バックグラウンドで実行して再生中にmp3_13_menuからコントロールできるように改造した。
    • オリジナルのmadplay-0.15.2bはこちら
    • 改造したmadplay-0.15.2bはこちら
    • オリジナルから ./configure --with-alsa で生成したソースに対して改造を加えた。
    • 手を加えたファイルは player.c/madplay.c/player.h/Makefile。
      ファイル中の"MP3_13"をたどることで変更箇所がわかります。

完成

  • 64GByteのSDカードで運用中。これでもルートパーティションの使用率が97%に達している。
  • 前回作(mp3_12)と比較して、操作ボタンを上面に配置したので使いやすくなりました。

課題

  • SDカードのメンテナンス。SDカードにMP3ファイルを追加するのに当初はExt2Fsdを使う予定だったが、現行バージョン(0.69)はまだ安定していなくて認識できないカードがあったりする。実験用&次回作用にRaspberry PI zeroをもう一つ買ったので、それを当面のSDカードメンテナンス用とする。
  • PICKIT3がなぜかPICを認識しなくなった。PIC部分のプログラムはほぼできていたが...
    認識しなくなったのはPICの周辺回路の影響なのか。全体を小さくまとめるためPICをICソケットなしで直にはんだ付したのですが、アマチュアの工作ではそれもリスクがあります。

LCD表示例

左上から下へ
  1. 初期画面(メインメニュー)
    • フォルダ ... フォルダ階層をたどって選択
    • インデックス ... フォルダの頭文字から選択
    • ランダム再生 ... 曲単位のランダムではなくフォルダ単位のランダム再生(特定のフォルダのみ曲単位のランダム再生とした。2024/07/14)
    • 停止 ... シャットダウン
    • フォルダ構成情報作成 ... mp3_13_mkflを実行。フォルダ/インデックス/ランダム再生のデータファイルを作成
  2. フォルダ選択画面(1) 5行2列の表示がディフォルト
  3. フォルダ選択画面(2) 順次フォルダ階層をたどる
  4. フォルダ選択画面(3) 5行1列の表示に変更できる
  5. インデックス画面 インデックス画面は廃止。(2024/07/14)
  6. インデックス"C"の画面
  7. 曲選択画面 曲選択では5行1列の表示がディフォルト
  8. 再生中 1行目にフォルダ名、2〜5行目に曲名、再生中の曲を反転表示。画面右下に曲ごとの再生進行時間を表示。

音源データメンテ(2024/05/21)

カバーを外してUSBケーブルを接続することにより音源データのメンテを行う。(カバーを外さないとできないのがこの製作のミス。) 最初の製作以来開発PCを代えているので、PC側の再設定が必要。
  • オンボードのスライドSWをオフ(電源回路からの供給を切る)。RaspberryPIをUSBの電源で動かす。
  • USBケーブルを接続
  • PCに接続するとCOM6となった。
  • Windows10のデバイスマネージャーでCOM6のドライバーを更新する。最初の開発時に入手したドライバーをそのまま使った。
  • Windows10にBonjourをインストール。これも最初の開発時に入手したBonjourPSSetup.exeを使った。
  • TeraTermでログイン可能。接続先:raspberrypi.local
  • 自動停止を防ぐためmp3_13のプロセス(mp3_13.sh/mp3_13_menu)をkillする。
  • WinSCPの接続もOK。これで音源データの転送が可能になった。
同時にSDを128Gに変更。前回開発時に作成した32Gのイメージをコピーして、その後の修正PGを上書き。


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