My Works
- LEDチェッカ
- 太陽電池式回路テスタ
- TTL Pong
- DSP プリセットラジオ
- 電動式 CVCC 電源装置
- OLED MP3 プレーヤ
- etc.
Report
- MIDI のハードウェア
- aitendo DSPラジオ一覧表
- etc.
Parts Collection
- Logic IC
- Calculator LSI
- CMOS Melody IC
- etc.
主な更新のみ
24/09/11
- MCU-based Melody ICs
24/08/12
- MCU-based Melody ICs
24/03/10
- Logic IC Collection
初回更新:2012/07/01
最終更新:
2023/05/26
メインユースに堪えうるように、こだわりを持ってポータブルオーディオプレーヤを設計・製作しました。この手の制作にありがちな「ただ動くだけ」の装置ではありません。主な特徴は以下の通りです。
OLED の応答速度が非常に速いという特性を活かして、スペアナ機能もつけてみました。市販のプレーヤではあまり見かけない機能のように思います。上記写真のように、再生中にリアルタイムでオーディオスペクトルを表示するので、見ていて楽しいです。
レジューム機能も実用的なものになっています。電源を入れたとき、音量などの設定や再生中の曲に加えてシャッフル再生時の順番まで、前回の再生時の状態を再現します。
そのほか、日本語対応、シャッフル再生(ランダム再生ではない!)、フォルダ単位のプレイリスト作成、実用的なオーディオプレーヤに必要な一通りの機能は実装したつもりです。ファイルシステムも FAT32 や日本語ロングファイルネームに対応しています。ライブラリを使わず、ファイルシステム関係のファームウェアも自作しましたので、ソフトウェアのオリジナリティの純度(?)はけっこう高いと思います。
(以前記述した内容はこちら)
上図にブロックダイアグラムを示します。シンプルな回路構成になっています。
MP3 デコーダに VS1011E を採用した、シンプルな構成になっています。MCU には 8bit マイコンの AVR を使います。回路自体には特筆すべき点はないのですが、SMD 部品を多用してそこそこ小型に作り上げました。
VS1011 シリーズ は DAC の前段に音量調整が挿入された設計なので、普通に組むとカタログスペックほどの SNR は出ません。本来ならば VS1003 など後継デコーダを使用するべきなのですが、手持ちの関係で VS1011E を使用しています。今回の製作ではイヤホンと直列に 30 Ω程度の抵抗を挿入して、フロアノイズを減らしています。
OLED には aitendo で購入した 0.96 インチエリアカラーの UG-2864AMBAG01 を使用しました。SPI によりシリアル接続できるので手軽に使用できます。
アナログ電源とデジタル電源は同じ電圧で動作します。したがって、用意する電源系統はデジタル・アナログ共通の低電圧と、OLED 用の高電圧の2種類です。
メイン電源電圧は 3.0V とします。あえて 3.3V にしなかったのがポイントで、消費電流は電源電圧に比例するので、3.3V のときより消費電力面で若干有利なのです。電池2本で動作させるために、メイン電源は BL8530-30 による DC-DC コンバータで昇圧してます。
高電圧系は 9V 〜15V 程度が必要です。今回採用したOLED モジュール(UG-2864AMBAG01)には DC-DC コントローラが付いていたるで それを利用しました。データシートに記述が少ないのでまともに動くのか心配でしたが、標準的な PWM 方式 昇圧型 DC-DC コントローラでした。外部に FET が必要ですので、3V で動作可能な N-ch MOSFET (2SK2055) を使用しました。
マイコン(ATMEGA328P)の電源は常時通電された状態になっています。BL8530-30 は PFM 制御なので低負荷時の消費電流が低く、かつ ATMEGA328P のスリープモードもかなりの低消費電力なので、このように常時通電でも適切にファームウェアを組めば問題ありません。待機時消費電流は 17uA @ 1.9V を実現しています。これは単4電池使用時に待機状態で半年以上電池が持つ計算となります。なお "P" 無しの ATMEGA328 マイコンは スリープモードの消費電力が比較的大きく不適ですので、必ず "P" 付のマイコンを使います。
今回は試作なのでユニバーサル基板に直組みしました。変換基板は甘えです。
(デバッグ時のようす)
スペアナ機能はVS1011E の DSP を利用して実現しています。スペアナ情報取得と MP3 の情報取得に VS1011E との相互通信が必要になりますので、マイコンとの間には MISO、MOSI の両方の信号線を配線します。SPI バスは SD カードと VS1011 とで共用ですが、動作モードが異なるのでプログラムはやや複雑になってしまいます。
拙作 MP3TagViewer でみても分かるように、一般的に使われる ID3 タグ はおおまかに分けて v1 と v2 の 2 種類のバージョンがあり、ID3v2 にはさまざまな種類のタグが存在します。プレイヤー側としては両方のタグ形式に対応することが望ましいです。
今回の製作では v1 と v2 の両方に対応し、複合する場合は v2 を優先することにしています。曲名として "TIT2" タグを(存在しない場合、ファイル名を使用)、アーティスト名として "TPE1" タグを、アルバム名として "TALB" を表示します。
タグの文字コードは ID3 の規格ではいろいろ許容していますが、ID3v2.3 で対応している UTF-16 と、ID3 の仕様にないのですが良く使われている(日本語環境におけるデファクトスタンダードの)SJIS に対応しています。
VBR 形式の MP3 についても対応しています。Xing
ヘッダを読んでビットレートと再生時間を計算しています。シークも可能ですが、若干シーク時間がずれるかもしれません。
ランダム再生ではなく、シャッフル再生機能を実装しています。シャッフル再生では、ランダム再生にありがちな再生のかたより(同じ曲が2回、3回・・・と再生されてしまう)問題は解消されます。
シャッフル再生は、再生曲のリストを保持して、リストの要素を何回もランダムにスワップさせることで実装します。これは、シャッフル再生のためには再生曲リストをメモリ上に確保する必要があるということになり、この実装のためには比較的大きな
RAM 領域が必要です。今回はメモリ制約がきびしいので、再生曲の表現はできるだけ簡潔になるよう工夫する必要があります。具体的には以下のように
2 バイトで1 曲を表現することにします。
bit 15 ... 10
bit 9 ... 0
フォルダ番号 (0-63)
フォルダ内のファイル番号 (0-511)
この表現方式により、フォルダ数(64以下) とフォルダ内のファイルの数(512以下)に制限が発生します。リストの要素数もメモリサイズの制限によりあまり大きくできません。プログラムでは 320 要素までとしています。これ以上だとスタックオーバーフローを起こしてしまいます。
レジューム機能によりシャッフル再生の順番まで含めて保存されるので、たとえ電源を切ったとしても前回の再生リストの途中から再び再生できます。(安いオーディオプレーヤはこうはいきません。)
「フォルダ複数選択」画面において再生したいフォルダにチェックマークを入れて「OK」を選択すると、複数フォルダをまとめて再生できます。(この実装のために上記のデータ構造としました。)もちろんシャッフル再生も可能です。市販品でも複数フォルダ再生が可能なプレーヤはあまり見かけません。
停止状態でボタンを長押しすることで、曲中任意の位置へのシークができます。内部的には、(ビットレート×時間)ぶん読み込み中のファイル位置を移動させることで実装しています。VBR
(可変ビットレート)の オーディオファイルについては、シーク操作をしてしまうと正確な演奏時間が表示されなくなるという問題があります。CBR
(固定ビットレート)のオーディオファイルなら大丈夫です。
日本語を表示させるには、使用する microSD カードごとに以下のような前準備が必要です。
日本語フォントと unicode 変換テーブルは巨大(>128KB)すぎてプログラム領域 (32KB) に入りきりませんでした。これらについては適宜 SD カードから読み出す仕様になっています。したがって、準備として mp3 ファイルを格納する SD カードには、あらかじめこれらのファイルを書き込んでおく必要があります。
著作権等の関係がありますので、これらのコンバート済み日本語フォント等は本ウェブページには置いていません。もし同様の製作をした際は、下の説明の通りコンバートして準備する必要があります。
任意の等幅12ドット BDFフォントが使用可能です。付属コンバータでバイナリファイルにコンバートした後、"font.bin" という名前で SD カードのルートに置いてください。
Unicode ⇔ SJIS 変換テーブルは jis0208.txt にあります。これを付属コンバータでバイナリファイルにコンバートした後、"table.bin" という名前で SD カードのルートに置いてください。
ファームウェアにおいて、SD カードにおけるファイル読み込みは FAT テーブルの先頭から走査する実装なので、これらファイルをオーディオファイルの書き込みよりも前に書き込むと処理の高速化が見込めます。
4 つのボタン(MENU, SEL, A, B)で制御します。
動作テーブル:
状態 | MENU | MENU 長押し | SEL | A | A 長押し | B | B 長押し |
電源OFF | 電源ON -> 再生画面へ |
- | - | - | - | - | - |
再生画面 |
オプション画面へ | 電源OFF | 一時停止 | 次の曲へ | 音量+ | 前の曲へ | 音量− |
一時停止 |
ファイル選択 | 電源OFF | 再生 | 次の曲へ | シーク (早送り) |
前の曲へ | シーク (巻き戻し) |
ファイル選択 |
フォルダ選択 | 電源OFF | 再生 | カーソル移動 | カーソル移動 | ||
フォルダ選択 |
フォルダ 複数選択 |
電源OFF | ファイル選択 | カーソル移動 | カーソル移動 | ||
フォルダ 複数選択 |
フォルダ選択 | 電源OFF | チェック ON/OFF (長押しで 「OK」) |
カーソル移動 | カーソル移動 | ||
オプション | 次の項目へ | 電源OFF | 一時停止 | 項目+ | 音量+ | 項目− | 音量− |