ソフトウエアデコーダ式MP3プレーヤ(試作)

マイコンボード「mbed LPC1768」にソフトウエアデコーダを移植してMP3プレーヤを試作。
ソフトウエア開発環境は LPCExpresso(CQ出版のこの本に付属のバージョン。現在は v8.2.2)またはmbed。

更新: 2018/05/12, 2018/05/20, 2018/05/29, 2018/07/22, 2020/09/07, 2020/09/26


[LPCExpresso]試作

LPCマイコンのI2Sの資料としてNXP社のアプリケーションノート「AN11178 MP3 player solution on NXP LPC1700 series」がある。
これの方針に沿って、ハードコードされたPCMデータで正弦波を発生させるプログラムを作成した。この時点のソース一式

その後MP3デコーダlibmadの組み込みを試みたがうまくいかない(プログラムの実行が思いもよらない箇所でハングする...。)

[mbed]サンプルプログラムの移植

mbedへのlibmadの移植例としてmadplayerがある(この例はLPC1768の内蔵DACを利用している)。

この例を試してみたところ動作しました。この時点のソース一式(開発はすべてのmbedのオンライン環境で行った。このソースはエクスポート機能で落としたもの)。
内蔵DACを利用するところは同じですが、ファイルシステムはFatFs+SDカードに変更してある。

[mbed]I2S-DACの利用

mbedからI2Sを操作するためI2Sクラスを利用した。このクラスの利用例として flash_audio_playerI2Sがある(この例はハードコードされたPCMデータを再生する)。

flash_audio_playerI2Sの例に沿ってI2Sクラスをmadplayerに組み込み動作を確認した。この時点のソース一式(これもmbedのオンライン環境からエクスポートしたもの)。
I2Sクラスにはunsigned shortの配列を引数にとるwrite関数を追加してあります。

[mbed]高ビットレート MP3への対応

手持ちのMP3データで試したところ、通常使っているビットレート128kbpsのものは問題なく再生できた。しかしダウンロード購入した高ビットレート(286kbpsとか)は再生できなかった(無音)。
原因の深いところまでは追い切れなかったが、input関数(main.cpp)のバッファメモリのサイズを2100バイトまで増やしたら再生できるようになった。 メモリのやりくりの対策を施したソース一式

[LPCExpresso]試作再開

mbed版madplayerを参照しつつLPCExpresso版の開発を再開した。その結果、再生できるところまでたどり着いた。この時点のソースはこれ。Releaseコンパイルでないと速度が間に合いません。

[LPCExpresso]スイッチ追加

再生中止、音量変更などのテスト。
ここまでの成果を元にMP3プレーヤ第12作を製作した。

LPC1768からUSBメモリにアクセス (2020/09/07)

  • 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に合わせて修正した。

PCM5102A 試作1(libmad / I2S) (以下 2020/09/26)

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

PCM5102A 試作2(Helix Decoder / I2S)

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