VS1011EのMP3デコーダーを見て、MP3プレーヤーを自作できそうだと思いました。ネットで調べたら既に先輩たちが作成した例をみつけて、データシートやネット文書などを参照しながら自分のMP3プレーヤーも作成できました。kbit/sまで再生することができます。AVRマイコンからSPI通信回路でVS1011Eに繋いで、コマンドバースでVS1011Eへの制御が可能です。再生するMP3ファイルは事前にパソコンからSDカードに保存して、AVRマイコンがSDカードから読込んでVS1011Eに転送します。Moduleを利用しています。プレーヤー全体の構成は下図のようです。回路図ダウンロードはこちら設計&実装SPIデータ通信AVRマイコンとSDカード、AVRマイコンとVS1011E、三つのデバイスの通信は全てSPI方式で行われます。AVRマイコンに内蔵するハードウェアSPI送受信レジスタを利用すると、より簡単に高速かつ安定性の高いSPI通信を実現できます。ATMEGA328PマイコンのハードウェアSPI通信を利用するには、対象デバイスからの入出力ピンをAVRマイコンのMOSIとMISO端子に接続する必要があります。同期クロック信号SPI通信レジスタは以下の三つがあります。送受信データ(8ビット)SPIレジスタの詳細についてATMEGA328Pのデータシートをご参照ください。SCK同期クロック接続は省略しています。複数デバイスのSPI切り替えSDカードとVS1011EはMISOとMOSIピンを共用しています。AVRマイコンからの通信が発生した際に、通信したいデバイスのSSピンをLOWにする必要があります。SSピンはデバイス選択の役を担当します。このピンももちろん共用できません。ATMEGA328PはSSピン(PB2)がありますので、SDカードのCSピンに接続します。XCSピンはAVRのどの入出力ピンに接続してもかまいません。発信をする前に、対象デバイスのSelectピンをLOWにします。SS(PB2)をLOWに、PD3をHIGHに、SDカードと通信するのみにします。逆に設定するとVS1011Eと通信します。MP3を再生する際に、この切り替えを頻繁に行います。SPI有効化AVRマイコンハードウェアSPI通信の場合、まずハードウェアSPIを有効にする必要があります。(1<<SPE)|(1<<MSTR)|(0<<SPR0)|(0<<SPR1);}SPEフラグは有効化、MSTRフラグはAVRマイコンの位置づけをMasterに設定します。他のSPR0とSPR1は念のため0に設定します。SPI送信SPI送信のためSPDRレジスタに8ビットのデータを保存し、データを自動的に送信します。送信完了まで次のデータを送信できないため、ステータスを確認し送信完了まで待ちます。SPIを送信する際には、同時に受信も行います。受信したデータはSPRDに格納されます。送信処理は常にこの受信したデータを返すので、一部のISP通信には便利です。上記のように、SPI送信する際に同時に受信も行いますので、受信するための方法はSPI送信と同じく、Dummyデータを送信すれば受信できます。Moduleはとても使いやすいFATファイルフォーマットのモジュールです。このモジュールはSDカードに限らず、他のデバイス、例えばネットワーク通信のデバイスでも利用できるように設計されているようです。基礎通信層の実装が抽出され、自由に書き換えられる汎用性の高い設計です。このモジュールをSDカードに実装するには、三つの通信関数を実現する必要があります。*/);#endif三つ目のdisk_writep関数は、_USE_WRITEを定義した場合のみ必須となります。今回のMP3プレーヤーはSDカードの書き込み処理はありませんので、SDかーどに書き込む処理は実装していません。ChaN氏のサイトにもMMCタイプのSDカードの読み取りサンプルを公開しているので、ネコ技術ではそれを利用しています。関数disk_initializeを実現し、SDカードの有効化を行います。1;}データを読み取りdisk_readp関数を実現し、SDカードの読み取り処理を行います。この部分はChaN氏のMMC通信サンプルプログラムをそのまま利用しています。クロック同期VS1011Eの動作周波数は23~24MHzが必要ですので、回路に付ける水晶振動子の周波数は12~13、または23~24MHzが必要です。12~13MHzの水晶振動子を採用する際に、VS1011Eの2倍クロック設定を有効化する必要があります。VS1011Eを初期化する際に、クロック設定コマンドによって2倍クロックを有効化にすることができます。VS1011E送受信VS1011Eはコマンド送信とMP3データ送信、二つの送受信タイプがありますが、どちらもSPI送信で行われます。UNSELECT_XCS;}VS1011Eにコマンドを送信するには、VS1011EのDREQ端子からの入力信号がHIGHになる必要があります。);ソースコードソースコード一式のダウンロードはこちら。私はVS1011E変換モジュールで試作回路を先に作成してそのあとプレーヤー機をはんだ付けで製作しました。試作回路の場合プールアップとプールダウンを一部のIOピンに実装していなかったため、よく再生途中で切れたりSDカードの読込エラーが発生したりしていました。その後のはんだ付け機をきちんと全て実装して想定以上の安定さで動作してくれました。前回の停止時点から自動再生あるMP3プレーヤーには電源をOFFにしても次回から自動的に前回の停止時点から続けて再生する機能があります。この機能を実現するには、AVRマイコンがVS1011Eに送信する際に、送信しながら送信済みバイト数をカウントしSDカードのあるファイルに書き込み、このファイルを確認するようにします。停止時点のMP3ファイル名が存在したらそのバイト数を飛ばして途中からデータをVS1011Eに送信すれば、VS1011Eも途中から再生することが出来ると思います。この機能今後のバージョンアップの際に追加したいと思っています。Inで出したほうがより優しいし格好いいでしょう。In機能が実現できると思います。課題このMP3プレーヤーは、電源供給部分が一番難しいと感じました。SDカードの動作電圧が2.7V以上必要ですので、プレーヤー全体の電源供給を3V以上に設定しています。携帯用プレーヤーにする場合二本の単3電池が必要です。これでプレーヤー全体のサイズが大きくなり、重さも増えてしまいます。小さい充電池も検討しましたが、安全な充放電回路の作成に工夫が必要だし、小さなスペースにどのように収めるか今でも検討しています。何かアドバイスがありましたら、ぜひご連絡ください。回路図、ソースコードを参照、あるいは利用する際は、ご自身の責任において行ってください。C/C++Jing北海道の田舎で暮らしているプログラマーです。最近山登りにハマりました。pm今部活で使う装置(エタノールロケット発射台)を設計中で、その中にmp3再生回路を内蔵する予定なのですが、残念ながらArduinoの開発環境しかありません。ネットで調べたらArduinoで作った例もありましたが回路図非公開では作れない。スケッチは公開されているので解読したがUI関係が分からない。チップは同じなので、このソースコードをArduinoスケッチに変換する方法はありますでしょうか。