WAVプレーヤ本体の製作 (Wi-FiソフトAPモード)


【WAVプレーヤのシステムの概要】

マイクロチップ社のdsPIC33ファミリの中で「オーディオ用D/Aコンバータ」を内蔵している
dsPIC33FJ64GP802という28ピンのdsPICを使って、高音質でWAVファイルの音楽を
再生するWAVプレーヤを製作します。
クリスタル発振の安定なクロックにより16ビット、44.1kHzでSDカードのWAVファイルを
再生しますので、CDよりも高音質で再生できます。

さらにWi-Fiモジュールを追加して「ソフトAPモード」を使って無線LANでタブレットと接続し、
タブレットに表示した曲一覧から選択して再生できるようにします。

完成した高音質WAVプレーヤの外観は下記のようになります。
1枚のボードだけで構成されたWAVプレーヤ本体とタブレットだけでできています。
WAVプレーヤ本体はdsPICマイコンで大部分構成されてしまいますので、外付けは
SDカードとオペアンプとWi-Fiモジュールだけです。
これでヘッドフォンを直接駆動できますし、ステレオアンプや、アクティブスピーカなどに
直接接続して聴くことができます。




【WAVプレーヤボードの全体構成と仕様】
製作するWAVプレーヤ本体の外観は下図となります。



WAVプレーヤ本体の機能仕様は下表のようにすることにしました。
単純にSDカードに格納されたWAVファイルから音楽データを読み込んで、
それをオーディオDACに転送するという単純な機能です。
追加でWi-Fiでタブレットと接続し、ファイルの選択をタブレットからリモコンできるようにしました。
SDカードへのWAVファイルの書き込みはパソコンで行うものとします。

項目 機能・仕様 備考
電源 DC5VのACアダプタまたは
電池(単3×4本)、リチウム電池
消費電流:約80mA〜120mA
3.7V以上であれば使用可能
再生機能 44.1kspsでステレオの出力
ヘッドフォン直接駆動可能
再生中にS1オンで次の曲送り
ミニジャックで出力
音量調整はなし
最後のファイル終了で最初に戻る
SDカード読み出し ディレクトリは扱わない
ロングファイルネーム可能
標準サイズのSDカードとする
ファイル名にロングネームを使うことは可能ですが、検索用ファイル名は自動的に8.3形式に圧縮される。格納ファイル数:最大100個とする
 Wi-Fi接続 Wi-Fiモジュールを使用
アクセスポイント経由または
Wi-FiモジュールのソフトAPモードで接続 
アクセスポイントのSSIDとPINコードの設定変更が必要
S1を押しながらリセットするとWi-Fiモジュールの設定を実行する 
再生ファイル選択 タブレットとのWi-Fi接続時にファイル一覧を送信し、タブレット側でリスト表示する
タブレット側で選択されたファイル名を受信して指定されたファイルを再生する 
ファイル一覧は一括で返送する
圧縮した8.3形式のみ扱う
選択されたファイルの再生が終了したら、自動的に次のファイルを再生する 

【Wi-Fi通信の概要】

上記の機能を実現するためのタブレットとのWi-Fiの無線通信のデータフォーマットを
下表のようにしました。
タブレットでWAVプレーヤのIPアドレスを指定して接続し、接続完了すると直ぐタブレット
からファイル一覧を要求するので、WAVプレーヤからSDカード内のファイル名の一覧を
送信します。
タブレット側でこれを一覧表示し、そこから1つが選択されると選択されたファイル名で
再生を要求するので、それをWAVプレーヤ側で受信して指定されたファイルを再生します。

 機能 タブレット → PICマイコン タブレット ← PICマイコン 
ファイル一覧要求  「S」「F」「E」 File1 File2 File3 --- FileN 0x00
   FileXは「M」「F」+「8.3形式のファイル名」
   File数は最大100個まで
   拡張子はWAVが標準
再生要求  「S」「G」「ファイル名」「E」 なし
指定されたファイルを再生する
終了要求  「S」「N」「E」 なし
Wi-Fi通信をクローズし、再生を終了し初期状態に戻す
テスト  「S」「B」「E」 「MB1234E」を返送
LED制御  「S」「C」「0または1」「E」  なし
 0のときLED1を消灯 1のとき点灯

【dsPIC33FJGP8xxファミリとオーディオDACの概要】

GP8xxファミリにはオーディオDAC以外にも多種類の周辺モジュールが内蔵されていて、
多くの用途に活用できます。
このGP8xxファミリの特徴は次のようになっていて、かなりオーディオ用途を意識したもの
となっています。

 @ 最大40MIPSの高速実行
 A 最大ROM 128kバイト、RAM 16kバイトという大容量メモリ
 B 16ビット100kspsのオーディオDAC
 C 外付けオーディオDAC用のI2Sのインターフェースを内蔵
    Data Converter Interface(DCIモジュール)
 D DMAを8チャネル内蔵
 E シリアル通信関連モジュールが豊富に内蔵されている
   UART×2、SPI×2、I2C×2、ECAN×1
 F 28ピン/44ピンという少ピン

オーディオ用のD/Aコンバータの概要を説明します。まず特徴を並べると次のようになります。
 ・D/A変換方式:2次デルタシグマ変調方式
 ・再構成フィルタ:128タップFIRフィルタ
 ・オーバーサンプリング比:256倍
 ・最大サンプリングレート:100ksps
 ・分解能 :16ビット
 ・オーディオ出力:差動出力(センターゼロ端子あり)
 ・DMA:16ビット幅
 ・専用クロック発振回路内蔵:外付けクリスタルで最高25.6MHz(100ksps)
     (44.1kspsの場合11.2896MHzのクリスタルを使用)

このオーディオ用D/Aコンバータモジュールの内部構成は下図のようになっています。
CPUから音楽の16ビットのデータをFIFOに書き込みます。これを一定周期、例えば
44.1kHzの周期でFIFOから取り込みます。
これを補間フィルタで256倍のサンプリングレートにオーバーサンプルしながら、
次のデルタシグマ変調器に渡します。
オーバーサンプルすることで、量子化誤差によるノイズを広い周波数領域に広げますから
可聴域のノイズが低減できます。
次のデルタシグマ変調器では、フィードバックをしながら次の再構成フィルタに16ビットの
シリアルデータに変換して渡します。
このフィードバックにより、低域のノイズが高い周波数領域に追いやられ可聴域の
ノイズが大幅に低減されます。
さらに次の再構成フィルタでは、128タップのFIRフィルタによる非常にシャープな
ローパスフィルタで可聴域だけを通過させることでアナログ信号に変換しています。
このとき差動のアナログ信号に変換して、次のアナログアンプに渡します。
アナログアンプでは差動のままこれを増幅してアナログ信号として出力します。
このように、デジタルフィルタによるシャープなローパスフィルタを通過しますから
ノイズが非常に少ない出力となりますし、D/Aコンバータ内部でローパスフィルタを
構成していますので、外部のローパスフィルタは不要になります。


オーディオD/Aコンバータの電気的仕様は下表のようになっています。
出力電圧は±1.15Vが標準ですから、ピークピークで考えればほぼ0dBVの
出力電圧ということになります。


実際の使い方としては、例えば44.1kHzで使った場合、約22.7μsec周期で
L/R両チャネルからの割り込みが発生します。
この割り込みの都度、次のデータをFIFOに書き込めば後は自動的に一定の間隔で
音楽として出力されます。
FIFOが4層になっていますので、書き込むタイミングが多少ずれても問題なく
一定間隔で出力してくれます。

FIFOに書き込むデータと出力電圧の関係は下図のようになります。
書き込むデータは、符号付きと符号なしが選択できるようになっていますので、
それぞれ場合により値と出力電圧との関係が異なります。WAVファイルの場合は
通常符号付ですので、0x0000の時に出力が正側も負側も中点ですから差動出力
では出力0Vとなります。


【WAVプレーヤの全体構成】

製作するWAVプレーヤの構成は下図のようにしました。


電源は5Vを入力して3端子レギュレータで3.3Vを生成して全体に供給します。
全体で100mA近くまで流れますので、250mA対応のレギュレータを使いました。

全体を制御するのがdsPICで、SDカードは直接入出力ピンに接続してSPIモジュールで
制御します。
プログラムにはマイクロチップのライブラリとして無料提供されているファイルシステムを
実装してFAT対応とします。

Wi-FiモジュールもUARTモジュールで制御しますので、直接dsPICの入出力ピンに接続します。
このWi-Fiモジュールにはプロトコルがすべて実装されていますので、UARTで直接データを
送受するだけの簡単な手順でWi-Fi接続が実現できます。
アクセスポイントとの接続も、このWi-Fiモジュールがあらかじめ設定されている相手と
自動で接続してくれますので、特別な接続手順は必要ありません。
スイッチとLEDも直接dsPICの入出力ピンに接続しています。
あとはオーディオDAC関連で、11.2896MHzのクリスタルをオーディオDAC専用の発振回路の
ピンに接続します。
この周波数は44.1kHzの256倍の周波数となっていて、クリスタル発振子の標準周波数に
含まれていますので容易に入手できます。
オーディオ出力は差動になっていますので、ヘッドフォンを駆動するため、
オペアンプを外付けして、差動からシングルエンドに変換しながら出力の
インピーダンス変換も行います。
このオペアンプ回路は3.3Vの単電源回路ですので直流のオフセットがありますから、
コンデンサで直流カットします。低域が減衰しないよう大容量のコンデンサを使っています。

【回路設計と製作】

全体構成図を元にして作成した回路図が下図となります。



右側はオペアンプを使った差動からシングルエンドへの変換回路で、一般的な1個の
オペアンプによる差動入力回路となっているだけです。
ゲインは1倍でインピーダンス変換をしているだけです。ステレオですから同じ回路が
2回路となります。
単電源動作ですので、プラス入力側に電源の1/2のオフセット電圧を接続しています。
これで出力は電源電圧の1/2を中心にして上下に振れる出力となります。

出力回路に直列に挿入されているR10とR15の抵抗は出力保護とヘッドフォンの
音量調整とを兼ねています。この抵抗を小さくすれば音量が大きくなりますが、
このオペアンプの出力は最大30mAとなっていますので、100Ω以下にすると過負荷と
なります。

右下がWi-FiモジュールでTX、RXの接続以外にリセットをdsPICの入出力ピンに
接続しています。これでプログラムによりWi-Fiモジュールの初期化ができます。
また、CTSピンとRTSピンは直接接続してハードウェアフロー制御はなしとして使います。

左側がSDカードで、SPIによる接続以外に、CDIというカード有無の信号と、WPという
書き込みプロテクトの信号も入力ピンに接続して状態が判るようにしています。

左下に電源のレギュレータがありますが、アナログ回路への電源供給にはコイル
によるフィルタを経由して、dsPICなどのデジタル回路のノイズが伝わらないように
しています。グランドもアナログ系とデジタル系を分離してR22の一か所で接続する
ようにしています。
中央上側はdsPICのプログラム書き込み器を接続するコネクタで、6ピンのシリアル
ピンヘッダを使います。
スイッチSW2のプルアップ抵抗はdsPIC内蔵のプルアップを使うことにして、抵抗を
省略しています。

組み立てが完了した部品面とはんだ面が下記となります。




【ファームウェアの製作】

本製作例のプログラムの全体構成は下図のようになっています。



全体を制御するのがメインプログラム(WAVPlayerWiFi.c)で、この中でオーディオDAC
の制御も実行しています。
SDカードを扱うためファイルシステムが必要になります。これにはマイクロチップ社から
提供されているファイルシステム(FSIO.c)を使いました。
このライブラリにはSPIモジュールのドライバ(SD-SPI.c)も含まれていますので、
使用する入出力ピンを指定するだけでSDカードをFATファイルシステムとして
使うことができるようになります。
Wi-FiモジュールとはUARTで通信しますので、これもメインプログラムの中で
実行しています。

メインプログラムのフローは下図のような構成としました。


図のようにメインのループとオーディオDAC割り込み処理とUART受信割り込み処理の
3つの部分で構成されています。

メインでは最初に各モジュールの初期化を行います。UARTの初期化では速度を
9600bpsとして受信割り込みを許可しています。
次にS1がオンであったらWi-Fiモジュールに対してインフラモードの初期設定を行います。
この初期設定では接続先のアクセスポイントのSSIDやPINコード、通信プロトコルを
UDP/TCPにするなどの設定を行い、Wi-Fiモジュールが自動的にアクセスポイントに
接続する動作を実行できるようにします。
この初期設定には時間がかかるのと、一度設定すればWi-Fiモジュール内に
記憶されますのでスイッチS1がオンの時のみ実行するようにしています。

次にオーディオDACの初期設定を行います。この初期設定では、データ形式と
割り込みタイミングを設定し割り込みを許可するだけです。
最後にファイルシステムの初期化を行いますが、これにはライブラリで用意されて
いる初期化関数(FSInit())を実行するだけです。
この中でSPIモジュールの初期化も実行されます。

初期化が完了したらメインループに入ります。最初にUARTの受信の有無、つまり
タブレットからのコマンド受信の有無をチェックします。UARTの受信割り込み処理内で、
メッセージを受信完了すると受信完了フラグがセットされますので、それをチェックする
ことで受信の有無を判定します。

受信データが有る場合には、受信データ処理関数(Process())を呼び出しています。
Process()関数では、受信データのコマンド内容にしたがって、ファイル一覧要求(F)
であれば、SDカード内のファイルをすべてオープンし、ファイル名だけを集めて
一括で返送します。

再生要求コマンド(G)であれば受信データからファイル名を取り出し、その名称で
ファイルをオープンして再生を開始します。

終了切り離しコマンド(N)であれば、再生を終了させ、Wi-Fiモジュールの通信を
クローズさせて終了します。

メインループの次はオーディオの再生処理です。再生は途切れることが許されません
ので、4kバイトずつのBufferAとBufferBのダブルバッファとしています。
このダブルバッファに交互にSDカードから読み出したデータをいったん保存し、
そこからオーディオDACの割り込みごとに1ワードずつ取り出してオーディオDACの
FIFOに書き込みます。
このdsPICには16kバイトという大容量のRAMがありますので有効活用します。

オーディオDACの割り込み処理では、Lチャネル側の割り込みだけ使い、この
タイミングでL、R両方のチャネルのFIFOにデータを出力しています。
AかBどちらかのバッファからの取り出しが完了したらバッファ空フラグをオンにして
SDカードからの読出しを要求し、バッファを切り替えます。

メインループではこれをチェックして空フラグがオンになっていたら、空になった側に
SDカードの続きのデータを読み出して格納します。
すべてのデータ読み出しが完了したら曲の終了ですのでファイルをクローズして
再生完了処理をします。
さらに次のファイルをオープンして、次の曲の再生を開始します。
ファイルの最後まで進んだらまた最初のファイルに戻って繰り返します。

【ファームウェアダウンロード】

WAVプレーヤ本体のファームウェアは下記からダウンロードできます。
MPLAB X IDEのプロジェクト1式となっています。

  ★★★ WAVプレーヤ本体のファームウェア ダウンロード ★★★