久しぶりのMP3プレーヤの製作です。MP3プレーヤはそれまでのオーディオ・プレーヤと違って、複雑・高精度なメカを持たず、半導体部品だけで構成されるのが大きな特徴です。このため、アマチュアでもキットなりフル・スクラッチなりで、外見はともかく性能面ではメーカー製と同等の物を自作できるのです。
最初のプロジェクトはMP3黎明期の90年代終わり頃で、偶然MP3チップ・セットを入手した勢いでMP3プレーヤをポケット・サイズで自作していました。しかし、その後は仕事でいくつかMP3応用システムを手がけてはいましたが、趣味で自作ることはありませんでした。そもそも外で音楽を聴くという習慣が無いもので...(汗)。え、アレはどうしたかって? クルマに積んでカーMP3プレーヤとして現役ですよ。
最近のMP3チップ・セットは、ワン・チップにDSP、DAC、アンプまで集積した便利なものが主流です。そのため今では電子工作の定番となり、多くの人が思い思いにオリジナルのMP3プレーヤを楽しんでいるようです。私も最近あるきっかけ(後述)でまた作りたくなり、製作してみることにしました。まとまったプロジェクトとしては、実に8年ぶりということになります。でも、携帯型で自作ってもしょうがないので、今回は右の写真のように机上型としてみました。
右に製作したMP3プレーヤのブロック図と、全体の回路図を示します。大画面(?)のカラーLCDとタッチ・パネルを備えているのが本機の特徴になっています。次に各ブロックの説明をします。
システム全体の制御に32ビット・マイコンV850ES/JG2(NECエレクトロニクス)を使用しています。電子工作向けとしてはマイナーですが、I/F誌の付録に付いたので知っている方も多いでしょう。普通のMP3プレーヤなら8ビット・マイコンで十分なのですが、今回はある程度の量のグラフィック・データを扱うため、外部メモリ空間のあるマイコンが必要になります。必要とされるメモリ・サイズや処理能力からすれば、SH2はもちろん H8/300Hでも余裕でしょう。電子工作で定番のH8系でなくV850を選んだのは、ローパワーで周辺が使いやすいからというだけで、それ以上の理由はありません。まぁ、仕事では使っていますけどね。とにかく安い(H8の半値以下)ですから...。V850ES/JG2は20MHz動作が可能ですが、MP3デコーダとLCDCにも動作クロックを供給する関係上、14.7MHz動作(3.68MHzを内蔵PLLで4逓倍)としています。
メモリ・カードの中で最も普及しているSDメモリ・カードを使用します。これはシリアル・インターフェースなので、少ない信号線数で接続できます。ファイル・システムにはFATが採用されているので、利用機器はこれに対応しなければなりません。最近はフリーの組み込み用FAT制御モジュールがたくさん現れていて、手軽にメモリ・カードを使用できるようになっています。
4インチQVGA解像度(320H×240Vピクセル)のカラーSTN LCDモジュールです。最近はTFTカラーLCDの価格が下がってきたせいか、STNカラーは絶滅寸前のようです。実は、ジャンク箱で眠っていたこのLCDモジュールが陳腐化する前に何とか活用してやろう、というのがこのプロジェクトのきっかけだったりします...(汗)。
LCDモジュールには、タッチ・パネルが取り付けられているため、これを利用することで操作スイッチ類を省略できます。バックライトはCCFLなので、これを駆動するためのインバータが別途必要になります。インバータは極細CCFLキット(秋月電子)のを流用しています。
この程度の解像度になるとVRAMを内蔵したLCDモジュールは無く、CRTディスプレイと同様に外部から常時リフレッシュしてやる必要があります。このため、別途LCDコントローラが必要になるなど、小型グラフィックLCDに比べてやや大がかりになってしまうのは仕方ないでしょう。LCDコントローラにはVRAMを内蔵したものと外付けのものあります。今回使用したのは、汎用LCDコントローラS1D13705(エプソン)です。これは80KバイトのVRAMを内蔵し、320×240ピクセルのカラーLCDを使用した場合は、8ビット・カラー(4096色中256色)での表示が可能です。今回はこのモードで使用します。ホスト・コントローラとは16ビット幅のSRAMライクなインターフェースで接続されます。
このLCDモジュールにはロジック電源(3.3V)に加え、LCD駆動電源(21〜25V程度)が必要です。LCD電源の電流は数mA程度です。一般的に、駆動デューティの高いSTN LCDは、コントラストが温度の影響を強く受けるので、コントラスト調整ダイヤルが必須になります。これは、LCD駆動電源の電圧を変えることにより行います。本機ではLCDパネル裏側に貼り付けたサーミスタで温度を測定して、ソフトウェアでLCD電圧を調整することでコントラストを自動補正するようにしました。
最近の自作MP3プレーヤの多くは、入手性と使い勝手の良いVS10xxファミリ(VLSI Solutions)を使っています。これらはポータブル・セット向けのため、DACからアンプまで1チップに集積しています。直接ヘッドホンを駆動できるのは良いのですが、アナログ出力しかないためデジタル出力が欲しい場合には物足りなくなってきます(そのアナログ特性もSN比が実測50dB程度(VS1011e)とかなり悪い)。
今回は単体MP3デコーダのSTA013(ST Microelectronics)を使用してみました。MP3黎明期からあり、現在に至るまで現役の古株です。出力はデジタルのみでDACは内蔵していないので、適当なオーディオDACを接続して使用することになります。そのため、DACを取っ替え引っ替え試してみたり、DAIエンコーダを接続してSPDIFで出したりと、いろいろオデオタ好み(笑)な応用が利きます。
STA013にはDSPの動作クロックおよびサンプリング系クロック(384fs)を生成するためのPLL発振器が内蔵されています。サンプリング・クロックにジッタが含まれると、特にSigma-Delta方式DACでS/Nを悪化させてしまうので、PLL電源はしっかりデカップリングし、ループ・フィルタ周りの実装にも注意を払う必要があります。
DACにはPCM1748KE(BurrBrown)を使用しています。スペック性能は、悪くはなくまた特に良くもなく、まぁそこそこといったところでしょうか。それよりも、Sigma-Delta方式のため、ラフに組むとスペック通りの性能を出すのが難しい石でもあります。
DACは内蔵されている8倍オーバー・サンプリング・フィルタによって、出力の処理は簡単なLPFを通すだけで済みます。DACからのアナログ出力はバッファを兼ねたアクティブLPFを通して、ライン出力として出力されます。パワー・アンプは使用していないので、このMP3プレーヤ単体ではスピーカを鳴らせません。基本的には手頃なステレオ・セットやアンプ付きスピーカに接続して使うことになります。
ライン出力はマイコンのADCにも接続されています。これは、再生中の音声信号の振幅を取得してLCDにグラフィック表示するためです。レベル検出は一般的には整流・包絡線検波してからA-D変換するものですが、回路簡略化のため波形を連続サンプリングして一定期間のP-P値を得るようにしています。これだとサンプリング周期によっては周波数特性にディップ点が生じますが、単なる映像効果のためなのでこれでよいでしょう。
基板はケース内の10mm程度の隙間に組み込む必要があるため、許容される部品の高さは6mm程度しかありません。そのため、特にコネクタや電解コンデンサには低背品を使用します。その他、使用した部品は全て面実装タイプで、蛇の目基板にそれらを直接マウントしてウレタン線(UEW)で配線していきます。この方法でうまく組み立てられるようになるには、多少の練習とコツが必要になりますが、両面基板かそれ以上の実装密度が簡単に実現できるというアドバンテージがあります。それ以外の注意点は、電源ラインは格子状にするとか、アナログ部とデジタル部をレイアウトで分離するとか、ごくありふれたものだけです。
FPCコネクタ(0.5mmピッチ)は端子の構造上非常にブリッジしやすいので、UEWを直接はんだ付けせず、サンハヤトのストライプ基板(ICB-063)を介してを端子に接続すると失敗せずうまく付けられます。
基板はLCDモジュールとともにケースに納めます。ケースは秋月のアクリル・ケースSK-16(110×78×32)を使用しました。このままでは高さがありすぎて透明で見栄えも悪いので、高さは切り詰めて25mmにして、色は内側から黒く塗っています。塗装の上にさらにアルミ箔を貼って基板取り付け部でグランドと接続して、シールド効果を持たせます。
このプロジェクトでは単なるMP3プレーヤとしての機能のほか、再生動作に同期してグラフィック表示を行うなど、組み込みソフトはいくつかの機能を同時に処理しなければなりません。もちろん、単一の流れでそれらを処理することも可能ですが、異なる機能はコード上で独立している方がコーディングやデバッグ等の開発効率が格段に向上します。このようなときに便利なのがマルチタスク処理で、組み込みプログラミングにおいては基本テクニックになっています。
組み込み系で言うマルチタスクはPC系のマルチタスクとは少し意味が違い、簡単に言えばシステムの機能をプログラム・フロー上で独立したルーチン(タスク)に分割してコーディングする手法のことです。でも、それぞれのタスクが勝手に動いているだけではシステムとして意味のある動作にならないし、共通の資源を同時に使用しないようそれらを管理する機能も必要になってきます。そこで、各タスクの実行スケジュールやタスク間の同期・排他制御をうまく管理する仕組みを設けてやることにより、複数のタスクが互いに協調しながら見かけ上同時に、また実用上遅延無く動作できるようになります。これらを管理する仕組みをリアルタイムOS (RTOS)といいます。
MP3プレーヤ程度なら、個々のタスクの動作に高度なリアルタイム性は要求されないので、本格的なリアルタイムOSは必要ありませんし、従来の手法でもコーディングは可能でしょう。しかし、主立った機能毎に分割してマルチタスク処理にすれば各機能の独立性が高まり、コーディングが楽になるので、簡単なタスク・スイッチャを作ってみました。システム・コールは6種類だけで、カーネル・サイズは200バイト程度になっています。各タスクの同期はタスク間でメッセージを交わすことによって行っています。
タッチ・パネルの入力を処理して、押されたボタンに対応するコマンドを再生制御タスクへ送ります。また、ボタンの押された状態をLCDに反映するなど、入力機能に関する視覚効果も受け持っています。
MP3プレーヤとしての機能のうち中核をなすタスクです。このタスクの中身は、他のプロジェクトからのコピペだったりします(汗)。基本的な再生機能は一回作ってしまえばそう大きく変わるわけではないですからね。もちろん、他のタスクとの連携動作などは追加してあります。
トラック管理は右の図に示すように、ルート・ディレクトリ直下のディレクトリそれぞれをアルバムとして扱います。アルバム数は最大40個とし、各アルバムには99トラックまで格納できるようにしています。各アルバムとアルバム中のトラック(MP3ファイル)は、それぞれ名前でソートされます。
今回組み込んだFATファイル・システムは長いファイル名に対応していませんが、代替の短いファイル名(8.3形式)を使ってそれらにアクセスが可能です。長いファイル名の場合でも、名前の頭に番号を振ることで確実に順番を設定できます。ディレクトリ内にプレイリスト(M3Uファイル)が存在するときは、それに従います。この場合、MP3ファイルは8.3形式に収まる名前でなければなりません。
ユーザI/Fから再生開始コマンドが来ると、メモリ・カードを初期化したあとルート・ディレクトリ直下のディレクトリそれぞれの中を検索して、MP3ファイルの格納されたディレクトリを有効なアルバムとしてリストに登録します。過去に使用したカード(8枚分まで記憶)と同じときは、そのカードで停止したトラックからスタートします。新しいカードまたはファイル構成が変わっている場合は、先頭アルバムの先頭トラックからスタートします。アルバムの最終トラックの再生が終了したとき、次のアルバムへ移るかそのアルバムの先頭に戻るかは、リピート・モードの設定(全トラック or アルバム内)によって変わります。
トラックの再生中は、ファイルからオーディオ・データを読み出してFIFOバッファへ書き込んでいます。FIFOから読み出してDSPへ送信する処理は、DSPからのデータ要求割り込みによって行われます。
再生動作に関連する情報のLCDへの表示を行うタスクです。主に再生制御タスクからのメッセージによって起動されます。再生中はレベル・メータの表示をリアルタイムに更新する必要があるため、タイマによる定期起動もされます。
再生開始が知らされると、設定ファイルから画面構成を取得し、必要なら背景画像も読み込みます。設定ファイルは各アルバム中に置くようにしているので、アルバムが切り替わる毎に構成が読み込まれることになります。これによりアルバム毎に違った映像効果を持たせることができます。
日本語フォント・データは、フリーの12ドット・フォント(FONTX2形式ファイル)をそのままフラッシュ・メモリの後ろの方へ書き込んで使用しています。
システムの各種機能を個別操作したり、状態を調べたりできるデバッグ・コンソールを提供するタスクで、プログラム開発の過程で最初に実装されます。通信ポートを介してこのタスクにアクセスしてハードウェアを操作するなどして正常に動作しているか、また作成した各種関数が意図した動作をするか確認しながらデバッグしていきます。システム・モニタはプロジェクトが完成してしまえば不要になりますが、資源を圧迫する程の大きさではないので、完成後もそのままにしておきます。
1ms間隔で発生するタイマ割り込みを処理します。ハードウェア割り込みによるもので、プリエンプション(割り込みによるタスク切り替え)をサポートしない今回の簡易タスク管理システムでは、管理外のプロセスになっています。タッチ・パネルの制御や音声レベルのサンプリング、タスク管理で使用されるシステム・タイマなどがこのプロセスによって駆動されます。
再生ボタン(バックライトOFF時はスクリーン上の任意の場所)を押すかカードを挿入することにより、再生を開始します。再生中は画面左側に配置されたボタンでトラック・アルバムの切り替えや一時停止等の操作が行えます。この辺りは一般的なオーディオ・プレーヤと同じです。停止中はボタンの機能が一部変わって、リピート・モードの設定が行えます。再生動作時の消費電流は、約500mAになりますが、このうち8割近くをバック・ライトが占めています。このため、停止状態で一定時間が過ぎるとバック・ライトを消して消費電力を抑えます。
再生中に表示される項目は、タイトルとアーティスト、トラック番号、トラック数、再生時間、プログレス・バー、レベル・メータです。これらの項目の位置や色または表示の有無は各アルバム中の設定ファイルで自在に構成できるので、背景画像に合わせてデザインできます。操作ボタンは位置を変えると極端に使い勝手が悪くなるし、タッチ・パネルが指紋だらけになってしまう(汗)ので、左端に固定としました。
操作ボタン部を除く画面デザインは右に示すようにアルバム毎に変更できます。といっても、適当な画面をデザインして定義ファイルを書くのは意外に面倒な物なので、普通は右の図のようにジャケ画を取り込んで設定する程度がいいところでしょうか。手軽に作成できるデザイン・ツールが欲しいところです。まぁ、音楽プレーヤの表示画面なんて、どうでもいいって言えばそれまでなんですけどね。それを言ったら身も蓋もないですが...。なお、設定ファイルが無いときは、背景画像無しのデフォルトの画面構成で表示されることになります。
| 主要LSI | MCU:V850ES/JG2 (NEC) LCDC:S1D13705 (EPSON) DSP:STA013 (ST) DAC:FN1242A (新潟精密) |
| 記録メディア | MMC/SDSC/SDHC |
| 対応データ形式 | MPEG1/2/2.5, Layer-3 |
| ユーザI/F | 4″カラーSTN LCD、タッチ・パネル |
| サイズ・質量 | 110x80x25mm(WxHxD), 170g |
| 電源・消費電流 | DC 5V, 500mA max |
オーディオ・アナライザでアナログ特性を測ってみたところ、SNRは76dB、THD+Nは0.035%でした。歪率はMP3だから仕方ない(シングル・トーンでもエンコーダによって変わる)としても、SNRはDACのスペックより30dBも悪くなっています。どうもDACの性能が完全に引き出せていないようです。電源のデカップリングやグランド分離などいろいろノイズ対策は行っていますが、やはりSigma-Delta方式のDACは使いこなすのが難しいですね。抵抗ストリング式DACならラフに作っても軽く80dBはいく物なのですけど。こんど機会があったらDACを換えて試してみようと思います。こうしてオデオ地獄にハマっていくんだな...(笑)。
ということで、DACを換装してみました。今回使用したDAC ICは、最近秋月に現れたFN1242A(新潟精密)です。能書きにある「フルーエンシ型補間フィルタ」とか「DSD信号対応」などはどうでも良いですが、その中の「ジッタ耐量の向上」には期待できそうです。STA013のようにサンプリング・クロックをPLLで生成している場合ある程度のジッタが含まれるので、ジッタ・センシティブなDACは使いにくいのです。
単に載せ替えといっても、なにぶんアナログ出力が差動出力になっているので、外付け部品がかなり多くなってしまいます。何とか元のスペースに実装するため、20個のCR部品をストライプ基板(1.27mmピッチ)上に組んでいます。FN1242Aはシリアル・コマンド未使用で選択できる24bitフォーマットが右詰めだけなので、STA013の設定も変える必要があります。さっそく特性を測ってみたところ、SNRは90dB、THD+Nは0.004%と大幅な改善が見られました。
