マイコン工作実験日記

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

240Kのサポート

2008-03-31 23:39:31 | W-SIM
前回の記事に書いたように、USARTの送受信にDMAを使うようにした結果、通信速度として240Kをサポートすることができるようになりました。DMAの単位は40バイトとしてありますが、それだけだと、40バイト分のデータがそろわないとDMAが開始/終了しないことになってしまいます。そこで、1ms毎のタイマ割り込みも併用して、タイマ割り込み時に送信データがあればDMAを開始し、受信のDMA転送が進んでいれば、転送済みのデータ分だけば上位レイヤのバッファに渡すようにしています。

受信データについては、最悪1msの処理遅れが発生してしまうことにことになりますが、割り込み回数は大幅に低減されて受信の取りこぼしはなくなったようです。

Google Mapの表示操作

2008-03-29 21:09:44 | W-SIM
Google Mapの表示の様子を動画にしてみました。



緯度経度を取得してからPPP接続をおこない、地図を表示させています。緯度経度情報が取得できた時点で、一瞬ですが画面にその結果が表示されています。W-SIMからのシリアル受信処理にDMAを使うように変更したことにより、通信速度は240000になりましたが、地図をダウンロードして表示する処理に要する時間はさほど変わっていないようです。地図表示処理時間の短縮のためには、TCPの動き方を確認してみる必要がありそうです。

また、処理時間全体では、地図表示が始まるまでの時間がかかっているので、サーバ側でのCGI処理を速くした方が体感的には効果があるのかもしれません。

通信速度

2008-03-27 23:20:06 | W-SIM
地図表示の速度を改善しようとしていて、ちょっと気になったこと。

現在、W-SIMから発信して接続した際のCONNECTメッセージは、

CONNECT 120000

と表示されます。じつは、W-SIMとのシリアルでの通信速度は 120000になっています。

W-SIMの仕様としては240000まで使えることになっていますが、AT91SAM7S256のUARTの初期化コードを変更して速度を上げてみると、ATを送ってもOKが返ってこなくなってしまいます。原因はまだ調べていないのですが、受信1バイト毎に割り込みがかかるような構造のシリアルドライバになっています。おそらくは、処理が間に合わなくなっていると思われます。間に合ったとしても、CPUのかなりの時間を割り込み処理に割かれてしまうでしょう。

DMAを使うように送受信処理の仕組みを変更してやれば、割り込み負荷は軽減できて、240000でも動作できるようになるかもしれません。もっとも、240000ができるようになっても、実際にどの程度画面の表示速度が向上するかはちょっと疑問です。今のところ、通信速度がネックになっているようではなさそうなので。

地図表示機能の改善

2008-03-26 00:27:34 | W-SIM
ここしばらく、USB電話機ジャケットの方の作業ばかりおこなっていたので、携帯型ジャケットの方は放置状態でした。久し振りにこちらの作業を実施。中途半端な状態だったGoogle Mapsの表示機能を少しはまっとうに使えるようにしました。

  • メニューにGoogle Mapを追加し、メニューから起動できるようにした。
  • 起動すると現在位置を取得してから、PPP接続をおこない地図を表示する作業を連続して実行。
  • ナビゲーションスイッチを上下に廻すことで、拡大/縮小表示。
  • キーバッドの2, 4, 6, 8キーにより地図表示される範囲を上下左右に移動。
  • ナビゲーションスイッチを押すことでPPP接続を切断。通話待機画面に戻る。

地図表示範囲の移動は、スムーズにスクロールできるといいのですが、メモリもないので全画面を書きなおしています。表示速度についても、受信バッファをさらに広げたところ、少し早くなりました。どうにか使える程度の速度にはなったので、週末にでも動画を撮ろうかと思います。

やはり、スクロール操作には十字キーとかが欲しくなります。そして、なんと言っても、もっと広い画面が欲しいです。

時計機能の追加

2008-03-23 23:36:35 | W-SIM
液晶表示があまりにも寂しいので秋月RTCを追加して、時計機能を持たせました。





基本的なコードはすでに作ってありますので、それを基にしています。

  1. RTCでは1Hz信号を作成し、nINTより出力。AT91SAM7-H256のPA8に接続。
  2. AT91SAM7S256ではピンチェンジ割り込みにより、0.5秒間隔で割り込みを生成。
  3. 1秒周期でRTCの時刻を読み出し、液晶画面の更新要求を作成。
  4. 1秒周期の間の0.5秒のタイミングで”時分”表示の間のコロンを消すための画面更新要求を作成。
これでコロンが1秒周期でブリンクして、時計らしい感じになりました。

続いて、前回と同じようにTINETを入れて、PPP接続してNTPで取得した時刻を設定する機能を追加しました。今回は、電話機のHELPキーを押すことで、PPP接続を開始するようにしてみました。



音量の調節機能も付けたのですが、音量が大きいと音が割れてしまっています。

呼出音が鳴らない

2008-03-20 19:29:51 | W-SIM
発信に続いて着信の処理も書き足しています。これまでもオフフックでの応答はできていたのですが、着信音を鳴らしていませんでした。

Yealinkのドライバのコードを読むと、USB電話機が着信音を鳴らす機能を持っており、CMD_RINGTONEを送るとリングトーンが鳴るように見受けられます。ところが、実際にこのコマンドを送ってもUSB電話機側では何の音もなりません。Yealinkのドライバは、P1KとP4Kの2機種をサポートするようなのですが、どうやら着信音についてはP4Kではサポートされていないように思われます。ダイアルトーンは鳴るのに、リングトーンは鳴らないというのも奇妙な仕様ですが。。。

しょうがないので、リングトーンの生成はマイコン側で行うことにします。着信が入ったら、スピーカをオンにして、マイコンからリングトーンを送出してやることにします。

ダイアルトーンについては、USB電話機の機能を使うつもりでしたが、問題を見つけてしまいました。音量調節ができないのです。夜間にスピーカボタンを押すとかなりダイアルトーンが大きく聞こえるので、音量小さくしたかったのですが。。。結局、こちらもマイコンから出力した方が良さそうです。

W-SIMとUSB -- クロック速度の違い

2008-03-19 23:34:13 | W-SIM
相手側に伝わるマイク音にノイズが載ってしまう問題について調べたところ、W-SIMとUSBとのクロック速度の違いに起因するものであることがわかりました。

W-SIMとUSBは独立したインタフェースであり、それぞれのクロックは独立しており、同期していません。そのため、W-SIMとUSBへの送受に際してはバッファを設けています。また、両者の間ではu-Lawと線形PCMと音声フォーマットも違うので、下図に示したように、バッファ間でのデータ転送をおこなう際にフォーマットの変換を行う仕組みにしています。

W-SIMとの音声データ送受は8000Hzの周期で発生しますが、8000Hzで割り込み処理をしているとシンドイので、AT91SAM7SのDMA機能を使って64オクテット(8ms相当)で割り込みを発生させることにしています。一方、USB電話機とのデータ送受はIsochronous転送であるため、1ms毎に発生し、一度に8オクテット分のuLawデータに相当する16バイト分のデータを送受する必要があります。

W-SIMとUSBのクロックで同期がとれていれば、両者のバッファ間での転送処理はスムーズに進みます。しかし、実際のクロック速度に違いがあれば、一方の処理が他方よりも早く進む結果、バッファーのオーバフローやアンダーフローが発生することになります。

W-SIMの出す8000Hz周期はTDMAであるPHS網のクロックに基づくものでしょうから、かなり正確であると考えられます。一方、USBホストであるMAX3421Eが使用しているクロック(12MHz)は、AT91SAM7S256がPLLによって作成した96MHzを分周して作成しています。もとの水晶が18.432MHzであるため、PLLでも正確に96.0MHzは生成できず、実際には95.846MHz程度になっています。このようにMAX3421Eの使用しているクロックは遅くなってしまっているので、MAX3421Eの生成するUSBの1ms FRAME周期は、実際にはちょっと長めになってしまいます。結果として、USB側のバッファ処理はW-SIM側よりもゆっくり進むので、W-SIM側での受信処理ではバッファーオバーフローが、送信処理ではアンダーフローが発生することになります。

W-SIMのバッファー処理においては、オーバフロー時にはデータは読み捨てられ、その分の音声は実際にはUSB側には送信されないのですが、ほとんど気になりません。一方、アンダーフロー時にはW-SIMに送るデータが無くなるとAT91SAM7のSSC送信部を止めるようになっていました。送信部動作を止めるのは、送信可能割り込みの生成を抑止するためだったのですが、この際にノイズ音が発生していました。

対策として送信バッファーが空になっている場合には、W-SIMに対しては直前の64ms分と同じ音声データを送信してやることにしました。その結果、ノイズは気にならなくなりました。

マイクからの音にノイズがのってしまう

2008-03-17 00:45:12 | W-SIM
マイクからの音声入力が通話相手に伝わらない問題は、マイクの音量を一度指定すると、ちゃんと動作することが判明しました。初期状態ではミュートされていないのにもかかわらず、何故かマイクが音を拾ってくれません。

これで、両方向音声が通るようになったのですが、相手側に伝わった音声にはおよそ4秒に一度くらいの割合で ブチッというノイズが入ってしまいます。どうやら音切れが発生しているようですので、これを調査することにします。

発呼の様子

2008-03-16 11:22:33 | W-SIM
実際に発呼や切断をしてみると、接続/切断時やスピーカのオン/オフのタイミングでリセットがかかってしまう現象が発生するようになってしまいました。割り込みのタイミングでスタック溢れが生じているのかとも思ったのですが、どうやらUSB電源で動かしていたのがいけないようです。USB電話機、W-SIM, AT91SAM7S256を全て駆動するには、NOTE PCからのUSB給電では足りなくなることがあるように思われます。そこで、ACアダプタ用のジャックを付けたして、秋月5V ACアダプタで動作させることにしました。



音声はまだ片方向だけしか通っていないのですが、とりあえず天気予報へ電話する様子を動画にしてみました。



デモではスピーカを使っていますが、もちろんハンドセットも使えます。
  1. スピーカボタンがボタンが押されると、オフフック動作であると判断し、ダイアルトーンを出します。ダイアルトーンは、P4-Kにコマンドを送ってやると、電話機が生成してくれます。スピーカのオン/オフもコマンド制御です。
  2. 番号キーが押されたことを検出し、LCDに表示します。最初のひと桁を検出した時点でダイアルトーンの生成を止めています。
  3. #ボタンが押されると発呼します。
  4. 相手と接続中は、LCD表示は通話時間表示になります。
  5. スピーカボタンが押されると、オンフック動作であると判断し、呼を切断するとともにスピーカをオフにします。

電話機上の各種機能ボタンは、スピーカ以外はまだサポートできていません。この次は、ボリューム制御くらいはできるようにしてみましょうか。LCDには、接続の前後には何も表示されていないので、ちょっと寂しいですね。また、RTCをつなげた方がいいかもしれません。おっと、そんなことよりも音声を両方向通す事が最重要でしたね。

発着呼できるようになった

2008-03-14 23:44:59 | W-SIM
USBの転送処理を変更することで、音声出力処理とキーパッドの状態検出処理の両方を実行しても、音切れ問題は発生しなくなりました。その結果、キーパッドの操作でダイアルして発呼したり、オフフックで着呼に応答して、オンフックで切断できるようになりました。もう少し機能追加したら、動画も用意しようかと思います。

現在は、音声の入力処理を追加中です。USB電話機から入力された音声をu-Law圧縮してW-SIMへのPCM信号として送信する処理は動いているはずなのに、相手には音声が伝わっておらず、無音状態です。音声出力は何もしなくても動いてくれていますが、ひょっとすると入力側は初期状態ではミュートされた状態になっているのかもしれません。Conifguration Descriptorの情報によると、スピーカ/マイク両方ともミュートと音量制御のふたつの機能があるようなので、まずはこれらを確認してみる必要がありそうです。