マイコン工作実験日記

Microcontroller を用いての工作、実験記録

MP3プレーヤの改造

2010-09-30 23:18:53 | Weblog
今回の実験ボードの環境に合わせるために、MP3プレーヤのソフトウェアの改造作業を開始しました。まずは今回使用しないFMラジオ機能を削除。そしてAACコーデック機能も削除。AACは音楽再生機能の一部なので残しておいてもいいのですが、コードサイズがデカくなってフラッシュの書き換えに時間がかかるので、当面は削除しておくことにします。W-SIMの通話機能を入れてもフラッシュに余裕があるようであれば、後で戻すことにします。

MP3の再生機能部分で必要な変更はだいたい次のようなものです。
  1. USBスピーカ用ドライバ関連部分の削除。
  2. MMcodec01ドライバ関連部分の削除。
  3. I2Sドライバの動作をマスタ側動作に変更。
今回は使用しないUSBスピーカやステレオコーデック関連のコードをごっそりと削ってしまうことにします。これまではCODECをI2SのマスタにしてLPC2388はスレーブで動かしていましたが、WT32をスレーブにしたいのでLPC2388をマスターにすることになります。

不要部分を削除していて、ちょっと悩ましいのが音量調節機能。これまでは、CODECやUSBスピーカの制御機能を使ってMP3プレーヤ上で音量調節ができました。今回はこれらのハードウェアを使用しないので、それにともなって音量調節機能も無くなってしまいます。使用するヘッドセットには音量調節機能があり耳元のボタン操作で音量調節できるので構わないのですが、使用できるヘッドセットを制約する要因になってしまいます。でも今回はシンプルに行くために、音量制御は無しとすることにします。

LPC177x/178x

2010-09-28 21:50:45 | Weblog
LPC177x1とLPC178xのデータシートが出てきたのちょっと見てみました。LPC23xxやLPC24xxからの移行には、これらのシリーズがお勧めということのようです。LPC2388からの移行だとLPC1778ですかね。SRAM空間が連続して64Kとられており、ペリフェラル用RAMを合わせると96KBあります。SD/MMCコントローラも載っています。EtherがいらないのであればLPC1777でいいかとも思ったのですが、こちらはピン数の多いLQFP208のパッケージしか無いようです。

LPC1768/1769ではちょっと様子見してたんですが、この仕様なら自分の好みですね。

HFPでの通話実験 -- 発信編

2010-09-25 20:58:02 | Weblog
前回の記事では着信の様子しか書かなかったので、今回は発信編です。


  1. WT32に対してdialingコマンドを送ります。WT32はヘッドセットに音声用のSCOリンクを張って、CALLING状態に遷移します。
  2. W-SIM側にはATDコマンドを送って発信を開始します。最後の##0は音声発呼であることを示しています。
  3. 相手側が応答すると、W-SIMがCONNECTメッセージを出力します。
  4. WT32側にconnectコマンドを送ると、WT32はCONNECT状態に遷移します。
  5. W-SIMにATHコマンドを送って呼を切断。
  6. WT32側にもhangupコマンドを送ってSCOリンクを切断。

WT32がCALLING状態になった時点で、WT32はすでにPCM信号を送受してヘッドセットに飛ばしています。W-SIM側でALERTメッセージが出力されると、網側から呼出音が送られてくるので、その音声がPCM信号を介してヘッドセットへと送られてきます。

着信の時の例ではヘッドセットからの操作で切断をおこないましたが、今回はジャケット側の操作で切断をおこない、WT32に対してhangupコマンドを送ることで無線区間の切断をおこなっています。

HFPでの通話実験

2010-09-22 23:20:37 | Weblog
久しぶりにWT32を使ってのBluetooth動作確認実験です。ようやくとW-SIMとWT32がつながったので、今回はHFP(Hands Free Profile)の動作確認です。とはいうものの、まだソフトはほとんど作っていないので、WT32とW-SIMにUARTから手動でコマンドを送信しての動作確認という段階です。

まずはWT32の設定から。HFPを有効にするためにSET PROFILEコマンドを投入。SET CONTROL AUDIOコマンドではPCMインタフェースを使用することも指定しています。WT32ではPCM信号のフォーマットとして、リニア非圧縮、μ-Law圧縮、A-Law圧縮のいずれも扱うことができ、iWRAPのSET CONTROL PCMというコマンドで選択することができます。しかしながら、どういうわけかSETコマンドによる設定内容表示では、この設定は表示されないという仕様になっています。



WT32には直接つながっているUSBシリアル変換器があるので、これを使うことでコマンド/応答の送受を行います。W-SIMへはLPC2388経由での送受信をおこまいます。そのため端末ソフトで両方のシリアルポートを開いて、これらを操作して動作確認実験をおこなっています。以下が、着信と切断の様子です。



  1. まず最初にW-SIMに初期化コマンドを送信。音声通話待ち受け状態にしておきます。
  2. ヘッドセットの電源を入れると、WT32へHFPで接続。WT32は自動的に応答して、HFP動作可能状態になります。
  3. W-SIMへ着呼を入れます。RINGメッセージが表示され、着呼があったことがわかります。
  4. WT32へringメッセージを手動で送ってやります。音声パスが張られ、ヘッドセットで着信を知らせるベル音が鳴り、RINGINGのメッセージが表示されます。
  5. ヘッドセットのボタンを押して応答すると、CONNECTのメッセージが表示されます。
  6. W-SIM側へATAコマンドを送って着信に応答すると、音声パスがW-SIMからヘッドセットまでつながります。
  7. 再びヘッドセットのボタンを押すと、HFPの切断がおこなわれNO CARRIERと表示されます。
  8. W-SIMへATHコマンドを送ってPHS通話を切断します。

PHS区間の動作とBluetooth区間の動作を手作業で連携してやっているわけですが、無事音声がつながることが確認できました。WT32に対してringを送信してから、実際にヘッドセットで着信音が鳴りだすまでには2, 3秒かかり、この時間がとっても長く感じられます。



PCMとI2Sの切り替え

2010-09-18 12:29:43 | W-SIM
今回のプロジェクトではMP3による音楽再生とW-SIMによる通話機能の両方をBluetooth対応することを目標にしています。BluetoothモジュールであるWT32は、MP3の再生時にはI2Sを使いLPC2388とつながり、通話時にはPCMを使ってW-SIMとつながることになります。



通話とMP3再生のどちらのタスクが動くかで使用するインタフェースが代わるのですが、ここで困った問題がひとつあります。WT32ではI2S信号の端子とPCM信号の端子が同一のピンを使用しており、兼用になっているのです。そこで、74157を使ってWT32のつながる相手を選択するように配線しました。



通話時はW-SIMがマスターとなってクロックを供給しますので、WT32はスレーブとして動作。MP3再生時も同じようにWT32側はI2Sスレーブとして動作するように設定することにします。こうすれば、兼用されているピン機能を切り替えてもピンの入出力方向は変わらずにすみます。

実際のボードの様子↓。WT32の下にある74157が見えています。USBシリアル変換モジュールは、WT32の設定ならびに動作確認用です。こいつを使ってWT32のiWRAPファームは更新済み。



WT32の上にさらにかぶさるようにして、LCDを載せます。高さをかせぐために連結用ピンヘッダを使っています。




WT32用基板

2010-09-15 23:25:24 | Weblog
前回まではW-SIM PCM信号をSSPで取り込む実験をやってみましたが、そろそろWT32を使ってのBluetooth対応に移ることにします。8月にプリント基板を製作した際に一緒に用意しておいたブレークアウト基板にWT32を載せてみました。WT32は前回と同じくSparkfunより購入。価格的にはもっと安いところもあるようですが、送料が高かったので。



実際に配線始めてみると、ボード上に端子名をシルクで入れておかなかったことを激しく後悔。時間がなかったので大慌てで基板データ用意したこともあって、シルクを入れるところまで気が廻りませんでした。W-SIM用の基板も同じようにシルクを入れ忘れたのですが、こちらは何度も配線していることもあり、だいたいピンの順番を覚えてしまっているのでさほど不自由に感じませんでした。WT32はピン数も多く使い慣れていないので、端子名シルクが無いと、ボード図と配線図の両方を見なければならず、おまけにピンの数を数えてピン位置を確認しなければならないので、配線作業がシンドイです。

LPC2388とPCM信号 -- その3

2010-09-12 08:51:55 | Weblog
D/Aの出力を聞いてみるために、アンプつなげてしました。このアンプ基板では入力部分にパッド/ジャンパが用意されており、付属するゲイン低減用の10KΩを実装して音量を下げるか、ジャンパして音量を大きくするかを選択することができます。最初はジャンパしてみたところ音が割れてしまったので、付属の10KΩを実装しています。




さて、実際に聞いてみる音は出てくるんですが、なんだかきれいに鳴ってません。余分な高音成分が乗っているようです。電源が怪しいのではないかと思われます。同期位置を変えてみると、もっとハデに音が歪んでしまうので、同期は正しくとれていると思うのですが。。。

乾電池使うとか、アンプ用に別途レギュレータを用意するとかすれば改善できるかもしれませんが、D/Aを使っての音出しはあくまで追加的な実験なので、今回はこれ以上は追及しないことにします。これまで使ったことのなかったD/Aを使ってみたということで、LPC2388をまたひとつ征服できたような気がするし。

LPC2388とPCM信号 -- その2

2010-09-09 00:38:51 | W-SIM
前回に続いてLPC2388のSSPにW-SIMのPCM信号をつなげてみる実験です。今回は、実際の動作の様子。

まずはW-SIMを音声通話用に初期化するATコマンド列を投入してやります。そして、着呼を入れてやるとRINGメッセージが表示されるので、AT@CALLEDを返します。すると発呼側では呼出音が聞こえます。着信側では続いてATAコマンドで応答してやります。



これで通話状態になって、W-SIMからはPCM信号が流れてきます。pcm startというコマンドでPWM1とSSP1を初期化してやると、SSP1から送信された音声データを聞くことができました。



この例では、33クロック目でPCMSYNC信号の立ち上がりを検出し、CR0にキャプチャされています。MR5を同じ33に設定し、MR6を34にすることで正しく音声データが送信できることが確認できました。MR5を32とか34にすると音が歪んでしまいます。

最後にW-SIMにATHコマンドを投入して呼を切断しています。

こうして、PWMを使って同期信号を細工してやることで、LPC2388のSSPでもW-SIMのPCM信号を送信できることがわかりました。ところが、しばらく通話状態にしていると、突然無音状態になってしまうという症状が発生してしまいました。調べてみると、PWM1CR0にキャプチャされるPCMSYNCの立ち上がり位置が変化しています。基本的にはPCMSYNCは48 PCMCLK周期なのですが、時々同期位置が変化することがあるようです。そこでデータ送信をする割り込み処理のタイミングでCR0が変化したことを検出して、MR5とMR6を再設定してやる処理を追加して問題を回避しています。ときたまノイズが入ることになってしまうのですが、頻度はそれほど多くないのでそれほど気になりません。

データの送受信はMR5が一致したタイミングで割り込みを発生させ、その割り込み処理の中でおこなっています。pcm_syncが割り込みの回数、そしてpcm_xmitとpcm_recvがそれぞれ送信、受信の回数です。受信はFIFOにデータが入った時にだけおこなっているわけですが、どういうわけかpcm_syncの回数よりも少なくなってしまっています。謎です。

データの受信処理では、受信したμ-Lawデータを10ビットの線形PCMに変換して、DAコンバータに出力しています。しかし、今のところDAにアンプをつなげていないので、受信音の確認はできていません。

LPC2388とPCM信号 -- その1

2010-09-06 23:43:16 | W-SIM
LPC2388のSSPはショート・フレーム形式のPCM信号はサポートできますが、ロング・プレーム形式はサポートしていません。W-SIMのPCM信号を直接SSPにつないでしまった場合には、下図に示すようにSSPは1ビット遅れてデータを送受することになってしまいます。



SSPを使って正しく送受するためには、フレーム同期信号であるPCMSYNCが1クロック分早く出てくれればいいことになります。PCMSYNCの周期は48 PCMCLKなので、1クロック早くすることは47クロック遅らせることと同じです。1クロックだけならフリップ・フロップを使うという手もありますが、47クロックを数えるにはカウンタが必要です。そこでPWM1を使って希望する同期信号を生成することにします。

PWM1はPWMモードで使い、PCAP1.1につないだPCMCLKをカウントさせます。周期が48 PCLKですからカウント値の範囲を1~48とし、49になったら1にリセットするためにマッチレジスタMR0を49に設定しておき、MR0との一致でリセットする設定とします。さらにPCMSYNCをPCAP1.0につないでおき、この立ち上がりを検出してCR0でキャプチャしてやります。これで、クロック1から48までのどの位置でPCMSYNCが立ち上がったかがわかります。下図の例ではCR0にキャプチャされる値は、PCMSYNCのタイミングやPWMの動作により、3あるいは4のいずれかになるものと考えられますが、これは実験で確認することにします。



欲しい同期信号はキャプチャできた位置から1クロック早く立ち上がって、1クロック後に落ちてくれればいいいので、キャプチャができたら、CR0の値に基づいてMR5とMR6を設定して、PWM1.6の出力にはダブル・エッジモードを選択。MR5との一致でセット、MR6との一致でリセットするように設定してやります。このPWM1.6の出力をPCMSYNCの代わりとしてSPPに与えてやればいいわけです。



実際に実験するためには、音声データを送受信する仕掛けも必要です。今回は送信側だけを実験してみることとし、あらかじめ用意しておいた音声データを順次SSPへ送信していくこととします。送信データは、MR5との一致が生じた時点で割り込みを発生させて、そのタイミングでFIFOに書き込むこととしました。ホントはこのタイミングでは遅いわけですが、1/8000秒遅れるだけですので、気にしないことにします。

ちょっと説明が長くなってしまったので、実際に実験してみた様子と、その結果わかったことについては、また次回。

PCM信号のつなげかた

2010-09-03 07:19:01 | W-SIM
しばらく前にW-SIMのPCM信号についての簡単な説明を書いたので、今回はPCM信号をどのようにして使うのかについて具体的な例を挙げて説明してみたいと思います。

まず一番簡単なのは、前回も書いたように適切なCODECを選択して、それとつなぐことです。何も難しいことはありません。似たような名前の線をつなげばいいようなもんです。例としてML7041を使った場合を下図に示します。



CODECを使う場合のメリットは、次のようなことです。
  1. 簡単な追加回路で、マイクやスピーカ、ヘッドフォンをつなぐことができる。
  2. 音量やミュートの制御をおこなうことができる。
  3. DTMF音やダイアル・トーン、着信音などの生成がおこなえる。
  4. 通話にはマイコンは介在しないので、マイコンに負荷を与えない。
ソフトについても通話中にはマイコンが介在しないので、呼の制御さえやってやれば良く、通話中には何の処理もいりません。簡単でいいのですが、用意されたメッセージを再生したり、通話を録音したりということがしたければ、マイコンを介在させる必要が生じます。

W-SIMのPCM信号をマイコンで送受するためには、ロング・フレーム形式のPCM信号を送受できるインタフェースがマイコン側に必要です。AT91SAM7シリーズの同期式シリアルインタフェースであるSSCは、設定によりロング/ショートいずれのフレーム形式のPCM信号も送受することができます。そのため、例えば次のようにして、W-SIMを直接マイコンと接続することができます。SSCはロング・フレーム形式のスレーブ側に設定して、W-SIMから供給されるPCMCLK, PCMSYNC信号に同期して動作させます。



マイコンでの処理では、毎秒8000回送受されるPCMデータを取りこぼさないようにする必要があります。AT91SAM7では、DMA機能を使って割り込み処理の負荷を減らすことができます。

今回のプロジェクトではBluetoothで音声を飛ばすことが目標ですが、使用するBluetoothモジュールであるWT32はPCM信号を送受することができ、ロング/ショートのいずれのフレーム形式もサポートしています。そこで、SSCの時と同じように、WT32側をロング・フレーム形式のスレーブ側に設定してやれば、次のようにW-SIMと直結できることになります。



W-SIMが送受するPCMデータは8ビットのu-Law形式ですが、WT32はこのu-Lawを扱うこともできます。適切にWT32を設定してやれば、受信したu-Law形式の音声データをBluetoothの無線区間上ではCVSDという符号に変換して送ることもできるハズです。

このようにW-SIMと同じロング・フレーム形式をサポートできる同期式シリアルのインタフェースがあればPCM信号は簡単につなぐことができます。今回マイコンとして使用するLPC2388は同期式シリアルインタフェースとしてSSPを持っており、SPI, 4-Wire TI SSI, NS Microwireの3種類のフレーム形式をサポートしています。このうち、TI SSIは、PCMのショート・フレーム形式と同一なのですが、残念ながらロング・フレーム形式はサポートされていません。そのため、SSPとW-SIMのPCM信号を直接つないでも正しく動作しません。しかしながら、ちょっとした工夫をすれば、LPC2388の機能を使ってW-SIMのPCM信号をつなぐことが可能なことに気が付きました。次回は、その方法と実験方法について紹介しようと思います。