MP3プレーヤ第16作

ソフトウエアデコーダ+I2S接続DACによるMP3プレーヤ。媒体としてUSBメモリ。

更新: 2020/09/07, 2020/10/03, 2020/10/23, 2020/11/19, 2020/11/30, 2020/12/13, 2023/10/22


試作0(LPC1768からUSBメモリにアクセス)

  • LPCXpresso v8.2.2 で開発。
  • テストプログラムのプロジェクトファイル一式はこちら。USBメモリ上のファイルをUSBメモリ上でコピーするだけのプログラム。CMSIS_CORE_LPC17xxライブラリとリンクする。
  • プロジェクト内サブフォルダ"USBHost"はNXPが配布しているサンプルプロジェクト"MP3 Player"から取った。(このサンプルをどこで入手したか失念したが、おそらくアプリケーションノード "AN11178" である。DAC:UDA1380をターゲットにしている。)
  • このサンプルプロジェクトでも"FatFs"を使っているが、普段使っている R0.10a に置き換えた。
  • USBHostとFatFsとのインターフェース関数(Storage.c/.h)も上記サンプルプロジェクトから取ったが、FatFsのR0.10aに合わせて修正した。
(ここまで 2020/09/07)

試作1(libmad / I2S-DAC)

  • LPC1768+USBメモリ+I2S-DAC(PCM5102A) による試作(回路は試作1〜4で共通)
  • MP3デコーダは libmad。それとI2S操作部分はMP3プレーヤ第12作(MP3_12)のものをコピーした。
  • テストプログラムのプロジェクトファイル一式はこちら。ファイルパスがハードコードされたMP3ファイルを再生するだけのもの。CMSIS_CORE_LPC17xxライブラリとリンクする。

試作2(Helix Decoder / I2S-DAC)

  • MP3デコーダは Helix MP3 Decoder。サンプルプロジェクト"MP3 Player"のサブフォルダ mp3codec をコピーした。何も変更していない。
  • I2S操作部分はサンプルプロジェクトではDMAを使っているが、それをそのままコピーしただけでは動かなかった。DMAによる方法をあきらめ(試作3で成功した)、試作1と同じくMP3プレーヤ第12作(MP3_12)のものを使う。
  • テストプログラムのプロジェクトファイル一式はこちら。ファイルパスがハードコードされたMP3ファイルを再生するだけのもの。CMSIS_CORE_LPC17xxライブラリとリンクする。

試作3(Helix Decoder / I2S-DAC / DMA)

  • 試作2をDMA方式にしてみる。
  • I2S+DMA操作部分をサンプルプロジェクトからコピーしてきただけでは動かない。I2S設定部分は試作1、2と同様にMP3プレーヤ第12作(MP3_12)のものを使い、DMA操作部分だけをサンプルプロジェクトからコピーしてきた。
  • テストプログラムのプロジェクトファイル一式はこちら。ファイルパスがハードコードされたMP3ファイルを再生するだけのもの。CMSIS_CORE_LPC17xxライブラリとリンクする。
  • 試作2と3を同一のプロジェクトファイルに共通化し、サンプルプロジェクトには無かった音量調節機能を追加してみた。MP3_16a.c冒頭の #define USE_I2S_DMA が有効なら試作3、無効なら試作2。(2020/10/23)
(ここまで 2020/09/26)

試作4(libmad / I2S-DAC / DMA)

  • 試作1をDMA方式にしてみる。
  • DMA操作部分だけをサンプルプロジェクトからコピーしてきた。
  • テストプログラムのプロジェクトファイルは試作1と共通化した(プロジェクトファイル一式)。 MP3_16.c冒頭の #define USE_I2S_DMA が有効なら試作4、無効なら試作1。

試作のテスト

  • 手持ちのMP3ファイルの他、いくつかのフリー音源サイトから取ってきたファイルでテストした。
  • Helix Decoderを使う試作2と3は、VS1063(第5作)が生成するMP3ファイルでエラーを起こすことが判明
    具体的には再生開始でいきなりエラーになるのではなくて、再生開始から50秒ぐらいで MP3Decode関数(mp3dec.c)がERR_MP3_INVALID_HUFFCODESを返してくる。 さらにそれは、DecodeHuffman関数(huffman.c)がエラーを起こした結果
  • これ以外の音源ファイルはどの試作も再生できている。
  • 試作4の構成で製作を進めることにする。

本製作の回路

  • スピーカはモノラルとする。
  • イヤホンジャックも付ける。スピーカとの切り替えをリレーで行っています。これはスピーカとイヤホンそれぞれのボリュームレベルを管理したいため。
  • 表示器は秋月の「0.96インチ 128×64ドット有機ELディスプレイ(OLED)」(制御チップSSD1306)
  • スピーカは秋月の「8Ω7Wフルレンジ(広帯域)スピーカーユニット LSE77−20R」

ケースの製作

  • 回路の主な部分をユニバーサル基板に作成し、ケースに実装する部品を決めて入手したところでケースの製作に着手する。
  • タカチのMB11-7-11を選択。
  • 加工もタカチへ注文してみます(3回目)。依頼する窓口は「共立エレショップ」。

ケース加工発注の流れ

(過去2度の注文のときの流れはMP3プレーヤ第12作にまとめているが、今回は少し違ったので改めて経過を記録します)
  • 共立エレショップのサイトから最初の申し込みをします。
  • 「返信メールが届く」はずなのだが来ない。夜に一度、平日の日中にもう一度注文入力をしたが届かない。
  • 共立のトップページにある「【通販営業部】お問い合わせフォーム」から確認依頼を送信。
  • 共立から「注文情報が届いてないので、返信でタカチの型番と個数を送ってほしい」とのメールが来た。
  • 返信メールで型番MB11-7-11と個数1を共立に伝える。
  • ふたたび共立からメールが来て、図面データを送ってほしい、とのこと
  • 返信メールでPDFを共立に送ります(金曜日の夜)。送ったPDFはこれ
  • 翌週水曜日に共立から見積メールが来た。金額は16,000円。そのメールにはタカチで書き直した図面データと、「公差」に関する資料とがどちらもPDFで添付されていた。
  • その図面データをチェックした上で正式に注文することにします。必要なアクションは2つ。
    • タカチで書き直した図面データに「押印またはサイン」をして返信する。「押印またはサイン」はAdobe Acrobat Reader DC の署名機能で名前と日付を普通に入力しました。それを見積メールの返信で共立に送ります。
    • 見積メールにある手順に従って共立のサイトで注文入力。タカチ以外の部品もいっしょに注文できるみたいだが今回はケースだけにする。
      なおここで宅配会社、配送時間帯を選択できるが、ケースの加工注文に対しては無効だった(ヤマトを選択したのに実際の到着便は佐川)。
  • 注文受付メールが共立から来る。これはいつもの自動返信メールだろう。
  • 振込先のご案内メールが来る。これに最終的な金額と振込先が記載されている。金額は見積通り16,000円で、振込先はいつもの共立の口座である。
    見積メールが来てからここまで1日で済んだ。
  • 振込後、入金確認メールが来る。
  • 振込の13日後、タカチからケースが届いた。
  • 部品を仮付けして出来栄えを確認します。
  • さらに数日後、共立から納品書だけが送られてきた。
  • インプレッション
    • 最初の注文ができなかった理由は不明。共立サイドの問題なのか、こちらの問題なのか?。 ブラウザはchromeだったが、次回注文するとすればIEまたはEdgeを使ってみる。(2023/10時点では改善されている。chromeで注文できた。2023/10/22加筆)
    • タカチで書き直した図面に承認サインを求めるところが前回との大きな違いです。顧客との間でトラブルがあった?。
    • 費用について。過去2回の注文では10,000円前後だったのが、今回は穴数が多いためか16,000円です。それでも「そんなものかな」という額だと思います。

ケース組み込み

製作の途中経過。問題なくすべての部品を組み込めた。

結果

スピーカーを内蔵しつつコンパクトにまとめる、という妥協の一つの形

再生中の表示

1行目にアルバム名、2〜4行目に曲名を表示する。長い名前は表示しきれません。
全角文字と半角文字が混在する名前では空白を適当に追加しています(左図の「主 題」)。

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

  • ソース一式はこちら。(LPCXpresso v8.2.2_650 で開発)
  • 今回初めてロングファイルネームに対応した(FatFs R0.10a)。
  • Windowsのプログラムで前処理データを作成しておき、それに基づいて動作する仕組みは今までの製作と同じ。
    (FatFsのf_readdir関数を使って存在するサブディレクトリやMP3ファイルを取得する、というような処理はまったくやっていない。またOLEDに文字を表示するためにFONTXフォントファイルを読みだすこともやっていない。)

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

  • ソース一式はこちら(VC++ 2019 で開発)。EXEをUSBメモリのルートに置き、MP3ファイルを追加した後などにコマンドプロンプトで実行する。
  • 処理内容:ディレクトリ構成ファイル・MP3ファイルリストの作成。ディレクトリ名・ファイル名・曲名のOLED表示イメージの作成。ランダム再生の再生順作成。
  • 曲名については、MP3ファイルのタグ情報から曲名を取得できる場合にはそれを使い、取得できない場合はファイル名そのものを曲名とする。
    (タグ情報から取得できる曲目はときに"アルバム名+曲名"の形式になっていることがある。"アルバム名"の部分は全曲共通なので、その部分を削除して曲名だけにする処理もしている。また、曲名に最初から連番がついている場合とついていない場合がある。ついていない場合だけ連番を付加する。)
  • タグ情報取得のため、libid3tag-0.15.1b と zlib-1.1.4 をリンクしている。どちらもそれぞれに付属のmsvc++用dspファイルでコンパイルできた。
    ただ、libid3tagライブラリについては対象MP3ファイルをオープンするのにfopen関数を使っている。Windowsでロングファイルネームに対応するために_wfopen_s関数を使う処理を追加した。

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