● 実験テーマ25
「PIC32MX_MP3プレーヤ(FreeRTOSの応用)_実験編」
(後閑哲也 著「PIC32MX活用ハンドブック」の製作記事による)
■ 2012.12.25〜 2012.12.27
・オリジナルとの相違点
(1) PIC32MXトレーニング基板を、殆どそのまま活用して実験を行う。
但し、VS1011e_MP3デコーダ基板とのインターフェース(SPI+制御信号)用
の配線を追加する必要あり。
(2) 上記に伴い、MP3デコード制御信号ポートの割付を次のように変更する必要あり。
(3) オーディオ操作SW類の変更案
後閑氏のロータリーSWによる、設定項目の選択はやめ、4個のプッシュスイッチ
のみで設定するように変更。
(4個のSWのみにすると一つ問題があり、それは設定画面からメイン画面に戻る
際にどうするかということだ。この時点では、UP/DWN_SWのダブル押しで戻る
よう考えていたのだが・・・)
■ 2012.12.28
・ソフト上の変更点
(1) SWポート割付(TRISB)の変更
TRISB = 0xFCD9; → 0x40DF;
// VS1011e制御信号, SD-CS, SD-CD, SD-WE, SKIP_SW, BASS_SW
(2) CN割込み初期設定の変更
@ 変更前
mCNOpen(CN_ON, CN2_ENABLE | // ロータリーSW共通割込み
CN6_ENABLE
| // SDカード検出
CN17_ENABLE |
// UP_SW
CN18_ENABLE,
// DWN_SW
CN2_PULLUP_ENABLE);
// ロータリーSW-COM内部P_UP
A 変更後(感ではあるが・・・ 未調査)
mCNOpen(CN_ON, CN3_ENABLE | // SKIP_SW
CN4_ENABLE |
// BASS_SW
CN6_ENABLE
| // SDカード検出
CN7_ENABLE |
// UP_SW
CN18_ENABLE);
// DWN_SW
(3) VS1011eコントロール信号の、ポート割付変更(VS1011e.hの変更)
/** ポートの定義 */
#define MP3_DREQ_TRIS (TRISGbits.TRISG2)→ (TRISBbits.TRISB14) //
Data Request
#define MP3_DREQ_IO (PORTGbits.RG2)→ (PORTBbits.RB14)
#define MP3_XRESET_TRIS (TRISDbits.TRISD9)→ (TRISBbits.TRISB12) //
Reset, active low
#define MP3_XRESET_IO (LATDbits.LATD9)→ (LATBbits.LATB12)
#define MP3_XDCS_TRIS (TRISDbits.TRISD8)→ (TRISBbits.TRISB13)
// Data Chip Select
#define MP3_XDCS_IO (LATDbits.LATD8)→ (LATBbits.LATB13)
#define MP3_XCS_TRIS (TRISGbits.TRISG3)→ (TRISBbits.TRISB15)
// Control Chip Select
#define MP3_XCS_IO (LATGbits.LATG3)→ (LATBbits.LATB15)
(4) CN割込みルーチンの変更
@ SW_UP()、SW_DWN()の、2つ専用にサブルーチンを用意しているが今回は、ロータリーSWでの項目
設定はしないで、UP/DWNスイッチも共通としないので、CN割込み処理関数の中で直接記述する
ことにする。
(ロータリーSWの状態読込関数も使わないで直接記述)
A SKIP_SWと、BASS_SWの読込追加
(5) その他の変更
音質設定でクロスオーバーFと高音レベルの設定は省略したが設定部の記述はそのまま残す。
また、その初期値設定に関しては、タスク3:VS1011e制御タスクの頭で初期値を入れているので問題なし。
■ 2012.12.29
・コーディング修正終了
プロジェクト作成し、コンパイルを行った。
<結果>
@ mCNOpenマクロ関数に関わるエラー発生
→ 書式不明のまま感で修正したのがいけないのだが・・・・
→ WEB検索にて、解説が出てきた。
※ PIC内部のプルアップを全て使わない場合は、末尾に以下のパラメータ・マクロが必要!!
mCNOpen(・・・| ・・・| ・・・| ・・・| ・・・| , CN_PULLUP_DISABLE_ALL);
→ これでエラーは出なくなった。
コンパイルOKとなる。
・PIC32MXトレーニング基板 追加改造済
@ VS1011eとの、SPI信号+制御信号ラインをコネクタ出しにする。
A SKIP_SW, BASS_SWラインをコネクタ出しにする。
■ 2012.12.30
・PIC32MXトレーニング基板改造後のチェック
VS1011eコネクタ-1pin:GND⇔ 10pin:+3.3V間の電圧のみ確認
→ 実測3.31V OK
・HEX書込みOK〜 自作のVS1011e実験基板を接続し電源ONにて最初の動作確認を行った。
→ まず、LEDモジュールのレベル初期化を忘れていた。
初期化を追加し、イニシャル時、全消灯を確認
<動作確認(続)>
@ 電源ON時の、Openingイメージ表示・スクロール→ OK
A 「カード挿入確認ファイルがありません」 メッセージ表示(ブリンク)→ OK
B 「カード挿入待ち」メッセージ表示(ブリンク)→ OK
C SDカード挿入すると、再生始まるが、殆どの収録曲の、曲名と演奏者名が、
「なし」になってしまう・・・・
(今回は、SCKラインのコンデンサは無くても、SPI正常動作した)
D 操作スイッチ類
基本的にはOK
設定画面にも移行し、BASSレベル、VOLレベル表示も変化する。
しかし新たに追加した
VOL_UP/DWNスイッチのダブル押しの時、メイン画面へ移行しない。
→ よくよく考えると、現ハードだと、ダブル押しの検知は不可と思われる。
(エッジセンスのCN割込みを使っているので・・)
→ SKIP_SWを押せば、メイン画面に戻り次の曲から再生が始まるので、この時点では妥協して良しとしたが・・
E メイン画面(再生表示画面)は、再生時間表示含めOK
F 再生1秒ごとの、LED点滅もOK
・Cに関して調査開始
例えば、演奏者名は表示されているが、曲名が「なし」となるmp3ファイル
に、次のようなものがあるので、
これをサンプルに、どうしてそうなるかを追跡してみた。
・追跡のために、フリーのバイナリエディタを使用し、そのタグ内容を見てみることにした。
@ うまく行っている、演奏者名テキスト表示(漢字)の部分の、バイナリーダンプ結果は以下の通り。
A ダメな曲名テキストの所の、バイナリーダンプ結果は以下の通り。
→ どうも後閑氏のプログラムだとタグ検索バイト数のMAX: MaxTagを、512に設定しているため、
このはるか先にある、TIT2タグを検索できてないと思われる。
→ MP3タグフォーマットに数種類あるのかもしれない?
B 逆に曲名がうまく表示できているMP3ファイルもある。
それは、「THE GIFT」というタイトルの、MP3ファイルである。
これをバイナリエディタで見てみると、タグの格納先がファイルの冒頭部分であった。
→ MaxTagの512内に、TIT2タグが存在するので当然検索され表示する。
→ バイナリエディタで無理やりファイルヘッダー:1024(1K)設定内の512Byte以内に、
TIT2とTPE1タグを書込めば、両方ともうまく表示させることが出来るが本来の方法ではない。
■ 2012.12.31
・いろいろ調べている内にMP3タグの規格に、ID3というバージョンがあるらしく
さらにその中には、以下の3種類があることが解った。
@ ID3v1→ ファイルのお尻にタグ情報がある。
A ID3v2→ ファイルの頭にタグ情報がある。
B ID3v1+ID3V2混在型→ ファイルの頭と、お尻に分かれてタグ情報がある。
→ よって現在の後閑氏の検索プログラムでは、
@バージョンで記録されたタグは曲名/演奏者名ともに表示されないことになる。
また、Bバージョンで記録されたタグは、演奏者名は表示されるものの曲名は表示されない等の現象が起きる。
→ プログラムを、全てのバージョンで検索できるように変更できればよいのだが簡単には行きそうにない。
さらにいろいろWEB検索している内に、ID3v2以外のタグを、ID3v2タグに一括変換できる
フリー・ソフト:「freeDBTagger」があることを知り、今回はこのソフトにお世話になることにした。
→ ID3v2タグ対応に、SDカード内の、MP3データを変換でき全てのファイルについて、
曲名/演奏者名を表示することが出来た。
・タグ問題は一応解決したので、ここで一つ残っている問題をかたずけることにした。
<残問題>
■ VOL/BASS設定スイッチを押すと設定画面に移行するが、そこから現在の曲を再生中のメイン画面
に戻る手立てが今はない。
SKIPスイッチを押せば、メイン画面に戻るが、次の曲にスキップしてしまう。
→ そこで単純にメイン画面に戻るだけのスイッチを1つ増設することにした。(スイッチは全て部品取りのジャンクを使用)
・RG9/CN11ポートが空いているので、そこに増設することにした。
・TRISGを次のように変更
TRISG = 0x0080;→ 0x0280; // SD_SDI,SDO,SCK, MAIN_RTN_SW,
EEPROM_SDA.SCL
■ 2013.1.1
・CN割込み関数内処理に以下を追加
/// MAIN_RTN_SWが押された場合、メイン画面に戻る
if (PORTGbits.RG9 == 0) { // MAIN_RTN_SW ON ?
Item = MUSIC; /// タスク2起動
xQueueSendFromISR(LCDQueue,
&Item, &xHigher);
}
・プログラムを変更し動作確認を行うが何故か動きがおかしい??
→ 増設した、MAIN_RTN_SWをポートに接続するだけで動かなくなる。
電源ON時のイメージも表示されなくなって立上らない??
<調査>
@ 3.3Vの実測は、3.31V
A スイッチの配線(MPU-8pin⇔ SW)は、OK
B また、MPU-8pinで見ても、SWをON/OFFすると、きちんとレベルが変化するので
入力に設定されている模様
C ちなみに、メインの頭で、スイッチの状態をそのままLEDに出力したみたが、
スイッチの機能は正常である。
→ これは、ハードではなかった!!
詳細は不明だが、CNピンの設定をした後に、CN入力ポートを、temp(テンポラリ)変数に一度読込んでいる記述があり
(コメントには「状態合わせ」)とあり。
→ プログラムスタート直後にCNポートの状態を知っておかないと、正常に状態変化検知できないものと思われる)
今回、CN11を追加したので、Gポートも状態合わせの必要がありそう。
→ つまり、temp= PORTG を追加した。(ここと、CN割込みルーチンのお尻に追加)
→ これで、MAIN_RTN_SWの機能 OKになる。
・この他の問題として
上手く読込めるSDカードと、一部読込めないSDカードがあるようで
読込めなくなると、そこでハングアップのような状態になり、曲名が文字化けして止まってしまう現象を確認した。
その時使用したSDカードで良い方は、panasonic社製の新品で買った1Gの
カードで、
悪い方は、中古店で購入した格安の Silicon Power社の、2Gのカードであるが
フリーのファイルシステムとの相性なのか??
原因はよくわからない。
この件は保留にした。
・これで一応、MP3Player実験プロジェクトは一段落したので
次にこれの、EAGLEによる基板化を試みる予定です。
<最終回路図>
・こちらから、どうぞ→ 「PIC32MX_MP3プレーヤ実験基板 回路図」
「VS1011e実験基板 回路図」
← 実験テーマ1に戻る TOP PAGEに戻る 実験テーマ26へ →