goo blog サービス終了のお知らせ 

マイコン工作実験日記

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

電話機ジャケットのタスク構成

2009-01-14 22:35:23 | W-SIM
現在の電話機ジャケットのタスク構成について記しておくことにします。コンソール・モニタには、psコマンドを用意してあるのですが、その出力は次のとおりです。全部で9つのタスクがありますが、logtaskはTOPPERS/JSPのシステムタスクですので、電話機ジャケットで新たに用意したタスクは8つということになります。



最初のpsコマンド出力が示すように、システムの起動時にはslic_recv_task, wsim_recv_task, wsim_xmit_taskの3つのタスクは起動されていませんが、受話器をオフフックするとslic_recv_taskが走り始めます。このタスクがSLICからのPCM音声を受信してDTMF信号の検出を行います。検出されたDTMF信号はデータキューを介してphone_taskに通知されます。

phone_taskは電話機としてのユーザ・インタフェースを実現しているタスクです。このタスクではSLICやW-SIMの状態変換に伴って発生したイベントを受理して、その時の電話機状態に応じた処理をおこないます。オフフックに伴って、ダイアルトーンを生成して、slic_recv_taskを起動するのも、phone_taskの役割です。

phone_taskは検出されたDTMF信号を電話番号を指定する桁として順次蓄えていきますが、一定時間(3秒間)たっても次の桁がこないと、タイムアウトして蓄積された電話番号へ発呼するために、W-SIMに対してATDTコマンドを送出します。また、この時、slic_recv_taskを終了させます。



上図は通話中にpsを実行した場合の様子です。呼が接続されると、phone_taskはwsim_recv_taskとwsim_xmit_taskを起動します。wsim_recv_taskがW-SIMからのPCM信号を受信し、SLICへ送信するタスクです。wsim_xmit_taskは、逆にSLICからPCM信号を受信し、W-SIMへ送出します。

modem_taskはW-SIMのモデム信号やリザルト・メッセージを受信してphone_taskにイベントとして通知する処理をおこないます。main_taskは起動時の初期化処理をおこなった後は、SLICからの割り込み要求に応じた処理と、phone_taskへの状態変化通知を担当しています。

SLICとLCDをつなげた

2009-01-10 23:15:17 | W-SIM
電話機ジャケットボードにSLIC子基板とLCDをつなげました。当面の実験に必要なハードウェアはこんなところでしょうか。LCDとしてはモノクロのNokia 5110を再び使うことにしました。SIP GWの時に作成したルーチンを流用して、さっさと動かせますし。



ハードウェア全体の構成は下図のようになります。SIP GWからW-SIMとLCD, SIP TAからSLIC部分を切り出してくっつけたようなもんです。したがって、ソフトの方もそれらからコピペするだけで60%くらいはできてしまいます。実際のところ、もうすでに基本的な発着信は動いています。もう少し機能追加してから、ソフト周りも記事にしようと思います。


各部品やモジュールをMCUに直結しているだけの、誰でも作れる簡単ハードですね。AT91SAM7A3のUSARTには、DSR, DTR, RI, DCDといったモデム制御信号は無いので、W-SIMのDTR, DCD, INS(DSR)信号はGPIOを使うことで検出/制御しています。
SPIインタフェースとしてはSPI0とSPI1の2つをもっていますが、SLICとLCDはどちらもSPI1の方につないであり、CS信号で選択して利用するようにしています。SPI0のピンはMCIと兼用になっているので、こちらの方は後々SDカードをつなげるのに使うつもりでいます。

電話機ジャケットボード

2009-01-07 23:27:18 | W-SIM
製作中のW-SIM電話機ジャケットボードです。



AT91SAM7A3を使ったヘッダーボードがあれば、それを買ったと思うのですが、残念ながらみあたらないようなのでMCUを買って自分で配線することにしました。MCUは100ピンなので、ダイセンのピッチ変換基板を使っています。サイズの小さいアイテムラボの変換基板を使おうかとも思ったのですが、足のピンが3列並びになってしまうので配線しにくいかもしれないと思い、2列のダイセン基板を使うことにしました。

例によってユニバーサル基板を使っていますが、いつもの秋月基板(400円)に替えてアイテムラボのパワーメッシュ基板(1500円)を初めて使ってみました。この基板、お値段はちょっと高いですが、宣伝文句のように電源配線やパスコンの配線はとっても簡単です。とくに、MCU周りでは電源ライン関連でいくつもパスコンが必要となりますが、パワーメッシュのおかげて直近のGNDに1608サイズのチップコンデンサでつなげられるので、ラクチンでした。プルアップ抵抗も同様にして配線できますが、スペースを気にしなければ、チップ抵抗を使わずとも普通の抵抗器のリードをパワーメッシュのスルーホールに通して半田することもできます。

このように大変便利な反面、注意すべき点もいくつかあります。
  1. ショートに注意
    ハンダブリッジでVCC/GNDへの配線が簡単にできるわけですが、パターンを間違えれば即ショートです。実際には、GNDパターンの方にはシルクで目印が付いているので、わたしはVCC/GNDを間違えることはありませんでしたが、部品のリードのハンダ付けの際にGNDと接触させてしまったりしました。
  2. コネクタの取り付けに注意が必要
    これも結局はショートにつながる事ですが、コネクタ等の部品を取り付ける際に電源メッシュと接触したり、メッシューをショートさせたりしないように注意しなければなりません。今回は、USB Bコネクタの下にはカプトンテープを貼って絶縁しています。USBコネクタの取り付け足と、W-SIMコネクタの周囲ではパワーメッシュのスルーホールをドリルでけずることで局所的に電源パターンを無効化することで対処しています。
  3. こまめに配線確認
    なにしろ基板がチカチカと光るので、配線を追うのはちょっとツライです。ショートさせてしまうと、その場所を探すのも大変です。部品は少しづつ配置/配線しては、ショートさせていないか確認しながら作業した方が良さそうです。

当面必要な部品はすべて配置してあります。変換基板の右側にあるピンソケットで、SLIC評価ボードの子基板を受けます。ピンソケットと変換基板に囲まれているのは、2.048MHzの水晶発振器です。あとは、電源、W-SIMソケットとUSB関連の部品しかありません。ハードウェアとしては、とってもシンプルです。機会をみて、ブロック図でも描くことにします。

まだ配線の途中ですが、JTAGでフラッシュの書き込みができることは確認できたので一安心。電源とJTAG関連信号とリセットさえ配線すれば、フラッシュの書き込み確認がとれるので、いつもこれらから動作確認をすることにしています。次は、簡単にソフトを用意してUSBでのCDCによるアクセスの確認というのがいつもの手順です。


次なるW-SIMジャケットの可能性

2008-12-06 09:19:41 | W-SIM
Si3215M SLICの使い方がだいたいわかって、評価ボードの子基板を使えば簡単に電話機がつなげられることが確認できました。基本的にSPIとPCM信号のインタフェースができればいいだけです。PCM信号のフレーム形式についても、SLIC側でショート形式とロング形式を選択することもできます。現在、MMnetSAM7Xとはロング形式でつないでいますが、この形式はW-SIMが使うフレーム形式と同じです。

つまり、フレーム形式だけを見れば、Si3215 SLICとW-SIMをつなげられる可能性があることになります。しかしながら、実際には次のような問題があるため、このふたつを直結することはできません。
  1. W-SIMのPCMCLKとPCMSYNC信号は、音声呼が接続された時だけ出力されます。ところが、SLICでは常時PCLKとFSYNC信号が必要ですので、PCMCLKとPCMSYNCをこれらの信号として使うことはできません。
  2. W-SIMが出力するPCMCLKは384KHzのようです。SLICがサポートするPCLKの周波数には384KHzは含まれていません。
直結ができないのであれば、間接的につなげば良いでしょう。下図のようにSSCインタフェースが2つあれば、SLICとW-SIMに独立したクロックを使うことができ、問題を解決できると考えられます。2つのSSCの間の通信は、AT91SAM7でいったんバッファリングしてやりますが、すぐにDMA転送すればいいだけですのでCPUの負荷はほとんど発生しないことになるでしょう。



AT91SAM7のシリーズで、SSCを複数持つMCUがないかと調べたところ、唯一AT91SAMA3だけが2つのSSCを持っていることがわかりました。フラッシュは256Kで問題無し、RAMが32KBで小さめですが、TCP/IPを載せなければジャケット作れそうな気がします。

そんなわけで、次のW-SIMジャケットは、アナログ電話機ジャケットに決定!! 現在、SIP TAの実験に使っている電話機を使えるジャケットというのはどうでしょうかねぇ。1980年代おわり~90年代はじめの携帯電話を思い出させるジャケットが作れるような気がしてきました。例えば、こんな感じ↓とか。。。



まだまだSIP TAを製作中ですので、実際の作業に入れるのは来年になるかもしれませんが。。。

タッチパネル・ジャケット -- Google Mapsの表示

2008-07-21 23:58:10 | W-SIM
タッチパネル・ジャケットを使ってのGoogle Mapsの表示の様子を動画にしてみました。表示速度が遅いのが問題だったのですが、どうやら電波の受信状況が原因だったようで、今回は操作に対する応答も、画面が表示されるまでの速度もさほど気になりませんでした。D4の発売に合わせて始まった「"話し放題"お試しキャンペーン」により、「新つなぎ放題」でも音声通話が可能になったのを契機に、契約を「新つなぎ放題」に切り替えたのも少しは影響しているのかもしれませんけど。



タッチパネルを操作する度にTCPを張り直して、HTTP GETの要求を送信して、新しい画面を取得しています。地図画像データを広めに取得しておいて、カッコよくスクロールしたいところですが、そこまでの処理はちょっと難しそうです。メモリ節約するためには、JPEG形式で表示できるようにしなければいけなくなるでしょうし。。。

タッチパネルはちゃんとキャリブレーションしていないので、タッチした位置とズームレベルの変更動作がうまくいっていないところもあります。まぁ、ご愛敬ということでご勘弁を。。

タッチパネル・ジャケット -- 発呼と録音/再生

2008-07-13 19:19:32 | W-SIM
ようやくとW-SIMジャケット第3弾、タッチパネル・ジャケットの動画を用意しました。ダイアル・パッドの数字も以前は字が細かったので、FreeTypeの機能を使ってボールド化して使っています。いまだに電界強度や電池残量の表示が用意できていません。表示アイコンがまだできていないのですが、そもそもDISP信号や電池電圧検出のための配線もまだできていません。そろそろ各ピンの用途も確定したので、残りをDISP信号に割り当てて配線にケリをつけようかと思っているところです。



いつもと同じように天気予報にかけていますが、通話状態になったら、「録音」ボタンを押して録音を開始できます。「停止」ボタンで録音を止めてから、「切断」ボタンで呼を切断です。再生操作はメニューボタンで再生を選択して行います。今のとこ、「再生/停止」のトグルボタンしか用意していませんが、進行状況表示バーのインジケータを動かすことで再生位置を変更できるようにしてみました。タッチスクリーンを使うことで、ボタンの数や位置、そして大きさを自由に変えられるのはやはり便利ですね。

きれいにデザインしたビットマップでボタンを作れれば、もう少し見かけも良くなると思うのですが、作業が面倒そうです。ビットマップのデータ量もバカにならないので、フラッシュに格納しておくことも必要になるでしょうから、さらに面倒そうです。録音と再生の機能確認を優先して作業したので、ダイアル中と通話中も同じキーパッド画面になっています。通話中画面を用意して、そこに録音ボタンや音量調節ボタンを用意した方がいいかなとは思っています。タッチパネルを使うことで自由度は大きくなったのですが、それを生かすのには根気が要りますね。




録音/再生が動いた

2008-07-07 23:07:13 | W-SIM
しばらく進展のない状態でしたが、ようやくとDataFlashを使っての通話相手音声の録音と再生が動くようになりました。

録音/再生で悩んでいたのは、次の2つの問題でした。
  1. 再生時にCODECに供給するクロックをどう作るか?
  2. 録音した音声を再生してみると、音が割れている。何が原因か?

まずはクロックの問題です。以前の記事にも書いたように、再生時にはCODECのBCLKとBSYNC信号をMCUから供給してやる必要があります。SSCの持つTK/TFピンを使ってこれらの信号を供給することができるのですが、この信号をどうやって作るかです。BCLKとBSYNCは同期しており、BSYNCは8000Hzの周期を持っている必要があります。実現方法として調べたのは次の2つの方式でした。
  1. 2.048MHzをタイマ0を使って4分周して作った512KHzをBCLKとしてTKピンにつなぐ。TKピンは入力に設定。タイマ2を使って、2.048MHzをカウントして8000Hz周期のBSYNCを作成して、TFピンにつなぐ。TFピンは入力に設定。
  2. 2.048MHzをタイマ0を使って4分周して作った512KHzをBCLKとしてTKピンにつなぐ。TKピンは入力に設定。SSCでTKクロックを数えてTFピンより8000Hzを出力。TFピンは出力に設定。

どちらもBCLKとして512Kを使うところは同じで、BSYNCの作り方が違うだけです。最初に1の方式で基本動作が確認できたので、次に2の方式を試してみました。1の方式ではタイマを2つ使うのに対して、2の方式では1つしか使わないので好ましいのですが、この方法だとちゃんと音が出てくれませんでした。原因の究明ができていないのですが、SSCが出力するデータのタイミングがCODECの受信タイミングと合致していないようです。SSCの設定を変更することで解決できるかもしれないのですが、とりあえず1の方式に戻して使っています。

BCLKは512KHzを使っていますが、ML7041 CODECのデータシートによるとMCKと同じ2.048MHzを使ってもかまわないようです。今のところ他にタイマを使う用途がないので、タイマを2つ使ってしまっていても問題はないのですが、もったいなくなったら、512KHzの生成はサボることにしようかと思います。

2つ目の「音が割れる」問題は、当初割り込み発生周期に処理が間に合っていないのかと想像して調査して時間を費やしてしまいました。試験データを書き込み/読み出して確認してみたところ、読み出しのコマンドを送出後、データの読み出し前に1バイト分のダミークロックを送信する必要があるのを見落としていただけのことでした。これが原因で、読み出した512バイトのデータが1バイト分ずれてしまい、先頭の1バイトが常に0xffになってしまっていたのでした。

DataFlashへの録音と再生の基本処理はできたのですが、まだ、タッチパネルからのユーザインタフェースが無いので、そいつを作らなくてはなりません。

耳が隠れているのが良くないのか?

2008-07-05 16:13:49 | W-SIM
製作中のタッチパネル液晶を使うと、どうもGoogle Mapsの表示が遅くて気になることは以前にも書きました。CODECを付けて音声通話発呼ができるようになっても、しばしばNO CARRIERのエラーがW-SIMから返ってきて発呼に失敗することがあるようです。

まだW-SIMのDISP信号を配線していないので電界強度の様子も見れていないのですが、どうやら電波の入りが悪いように思われます。発呼ができない時に、本体を寝かせずに手でささえて縦にしてしばらく待ってみると、ほぼ確実に発呼ができようです。LCDボードとCPUを載せている変換基板が大きいせいで、今回のジャケットではW-SIMがLCDボードの下に隠れてしまっています。その関係で電波の送受に影響が生じているように思われます。



どうやら青耳の部分は隠さずに、ちゃんと出しておいた方が良かったようです。

DataFlashを使うには

2008-07-02 23:54:37 | W-SIM
音声の録音媒体としてはATMELのDataFlashというSPIでつながるフラッシュを使っています。LCDボード上に32MBのNAND Flashが載っていますので、これを使うこともできるのですが、DataFlashはSPIを使ってどんなマイコンにでもつなげられそうなので、試しに使ってみたくなったのです。

実際に使っているのはAT45DB161の8ピンパッケージです。容量は16MbitですのでW-SIMから出力されるmu-Law PCMをそのまま記録しても4分程録音できる計算になります。データシートを読んでみてわかった概要を書きだしてみると。。

  • 1ページ512または528バイトで、4096ページの構成。
  • ページ単位での読み書き、消去ができる。ブロック単位での消去の必要がないので、ブロックを全く意識しないで使える。
  • 書き込み(プログラム)に先立って、自動的に消去をしてくれるコマンドが用意されている。こいつを使えば、消去操作を意識せずに使える。ただし、最大で40msの時間が必要。
  • 512/528バイトのSRAMバッファを2つ内蔵。ホストがひとつのバッファへの読み書きを実行している最中に、もうひとつのバッファとフラッシュの間でデータの読み書き(プログラム)を実行可能。



上図はデータシートからブロック図を抜きだしたものです。64K PCM音声では512バイトは1/16秒すなわち62.5ms程度ですので、2つのバッファを使わなくとも書き込み処理は間に合いそうです。しかし2つのバッファを使えば処理時間には余裕がありますし、逐次音声データを内蔵バッファに転送していき、内蔵バッファがいっぱいになった時点でフラッシュのプログラムを行うことにより、マイコン側で用意するバッファメモリ量を小さく抑えることができます。わたしは、SSCで64バイト受信する毎にDMA完了割り込みにより、録音タスクを起床させてDataFlashの内蔵バッファへの転送をおこなうことにしました。

DataFlashにはいくつもコマンドが用意されているのですが、次のコマンドだけで録音/再生に必要な読み書きは実現できるようです。

OpcodeCommand
84hBuffer 1 Write
87hBuffer 2 Write
83hBuffer 1 to Main Memory Page Program with Built-in Erase
86hBuffer 2 to Main Memory Page Program with Built-in Erase
53hMain Memory Page to Buffer 1 Transfer
55hMain Memory Page to Buffer 2 Transfer
84hBuffer 1 Read
87hBuffer 2 Read
D7hStatus Register Read



音声PCMの接続 -- 再生時

2008-06-28 00:31:55 | W-SIM
メッセージの録音ができたら、再生も必要ですので、その場合の処理を考えます。再生時には、MCUが録音記録媒体から読みだしたPCM信号をCODECに送ることになります。W-SIMは通話状態の時しかPCMCLK/PCMSYNC信号を生成してくれませんから、これらの信号もMCUが自分で生成する必要があります。

RDとPCMOUTがつないであるのは、ガイダンスメッセージをCODECのマイクから録音できるようにするためです。このように再生時にはW-SIMはまったく関与しないので、切り離すためにセレクタが必要となります。

切り替えが必要な信号とそれぞれの接続先を整理すると次のようになります。

緑色と橙色の時で切り替えが必要な信号のグループと水色とピンクの場合で切り替えが必要な信号があることがわかりましたので、これらを独立して切り替えられるように74257をふたつ使っています。また、切り替え制御はCODECのGPIO機能をI2C経由で行うことにしました。