マイコン工作実験日記

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

ひかり電話からの着呼 -- その2

2008-12-31 19:57:32 | VoIP


ひかり電話からのSIP着呼処理とナンバーディスプレイ処理を組み合わせて動作できるようになりました。それなりにキリのいいところまで作業できて嬉しいです。さぁ、気持ち良く新年を迎えましょうか。

この一年は、W-SIMを中心に実験工作を進めてきましたが、来年は何か新しいテーマも見つけたいものです。AT91SAM7をメインに使っていますが、来年はLPC23xx/24xxとかAT91SAM9にも手を出してみようかとも考えています。ATMELとNXPからもいよいよCortex M3のチップが出てくるでしょうから、それらに手を出すのもいいかもしれませんね。

それでは、来年もよろしくお付き合いをお願いします。

追加注文のSLICボード

2008-12-28 08:11:07 | Weblog
自宅の大掃除に追われ、きょうもSIP TAの作業はまったく進みそうもありません。。。

次のW-SIMジャケット用にと思い、追加で注文してあったSi3215評価ボードが先日届きました。すでにこれまでの実験で、SLICの載っている子基板さえあれば用が足りることはわかっているので、子基板だけを買えればいいのですが、残念ながら現在は親基板とのセットでしか買えないようです。

Digikeyで検索すると子基板だけの型番も出てきて、価格も$87.5 と安くなっているのですが、実際に発注をかけてみると、「古い型番のため、現在では取扱中止となっている」との連絡が入りました。しょうがないので、また同じ親基板とのセットで購入することになってしまいました。

アプリケーション・ノートには、評価ボードの全回路図と部品表まで載っています。したがい、部品さえそろえられれば、子基板だけを自作することも可能です。わたしにはそれだけの根性も技量もないのが悲しいです。

ひかり電話からの着呼

2008-12-24 23:21:30 | VoIP
ナンバーディスプレイの試験がひと段落ついたので、SIP-TAのSIP部分作業を再開して、着呼関連のコードを追加しています。どうにか着呼に応答して通話できるところまではきましたが、まだ処理が間違っているという状況です。こんどの週末にはなんとか修正できるでしょう。

着呼処理では、ひかり電話ルータ(RT-200KI)からのINVITEが拾えずにしばらく悩んでいました。原因はSIPで使うUDPのポート番号が5060になっていなかっただけのことでした。ひかり電話では、登録(REGISTER)や発呼の場合にはポート番号は5060である必要はないのに、着信の際のINVITEは必ず5060に向けて送ってくるという仕様になっています。そのため、登録も発呼もできるのに、着信が全く受けられないという症状になっていたのです。この問題、以前にもX-Liteでひかり電話を使った時にも経験していたのに、すっかり忘れていました。


ナンバーディスプレイに挑戦する -- 番外編

2008-12-21 18:20:14 | SLIC
SLICを使ってのナンバーディスプレイ表示問題はなんとか解決できたのですが、原因に気がつく前は、ちゃんとモデム信号が出ているかどうかを確認するために1200bpsのモデムを用意しようと考えていました。そのために手配していたOKIのMSM7512Bが届いたので、いまさらではあるのですが、せっかく買ったチップをこのまま死蔵させてしまうのも "もったいない"ので、モデムボードを組んでみました。



モデム用のチップなんて知らないので、グーグルさんにお伺いをたてて見つけたのが、MSM7512Bです。秋葉で買えるのかもしれませんが、どこで買えばいいのかわからないので、以前コーデックを買ったZaikostoreから通販で買いました。V.23専用の石なので、簡単に使えるようにできています。データシートに載っていた応用回路のとおりに組んで、ホスト側インタフェースのために、秋月のUSBシリアル変換モジュールをつなげてあります。トランスには、600Ω:600Ωのものを使うということで、SANSUIのST-71を使っています。

V.23は基本的に半2重通信で使います。DIP SWは、送受の切り替えとループバック試験のモードを設定しています。



裏側は水晶だけです。3.579545MHzが必要ですが、秋月にあったものを買ってきました。電源はUSB給電です。MSM7512Bは、USBシリアル変換モジュールから引き出した3.3Vで動作させています。



SLICボードとRJ11ケーブルでつないで、実験です。DIP SWでモデムは受信のモードに設定してあります。RJ11がつながった状態では、回線がトランスで終端されるので、SLIC側からはオフフック状態に見えます。モデム基板をつないだCOMポートを端末ソフトで開いて、1200bpsに設定します。バイナリでのダンプができるつなたーむを使うことにしました。

0120506に対応するモデム信号を送ると、きれいにデータが受信できました。90 813F CFの部分が実際に有効なデータ部分で、3FCFがCRCの値になっています。



30 B1 B2 30 35 30 36が、0120506に対応しているのですが、偶数パリティで送る約束になっているので、ダンプデータはB1 B2になっています。

やっぱり、動作確認は「耳で聞く」より、「目で見る」に限ります。0/1のデータが確認できるのがなんとありがたいことか。

気がつくと1年経っていた

2008-12-19 00:36:18 | Weblog
「そういえば、そろそろブログを始めて1年くらい経つんじゃないか?」と思い、過去記事を読み直してみると、最初の記事は昨年の12月10日でした。ありゃ、気づかぬうちに1年過ぎているではありませんか。驚き。小学生の頃に夏休みの絵日記を描いた他には、日記どころか手帳にスケジュールを書き込むことすらしない性分なのに、よくも1年も続いたものです。

いつまで続けられるか自信ありませんが、日々製作のネタを考えながら、いくぶんペースは落ちたとしても、続けていくことを心がけていきたいものです。

ナンバーディスプレイに挑戦する -- その3

2008-12-17 00:17:32 | SLIC
モデム信号送出でハマっていましたが、ようやくと原因がわかりました。

正しくモデム信号が送られていないのではないかということで、前回は300bit分の送出所要時間を確認してみましたが、問題は無さそうでした。そこで、生成している周波数を確認してみようと考え、試しに3秒分の連続マーク(1300Hz)と連続スペース(2100Hz)を生成して実際の音を聞いてみました。すると、どうも低めの音が出ているように感じられたのです。試しに、ダイアルトーンの周波数を400Hzではなくて、1300Hzに設定して鳴らしてみると、明らかに音が違います!!

レジスタ設定値の算出に使ったGUIソフトを立ち上げて、FSK設定での周波数設定パラメータと、オシレータ設定での周波数設定パラメータを見比べて、ようやくと原因に気が付きました。FSK設定で算出されたパラメータはSi3210/3211用の値になっており、Si3215/3216用の値になっていなかったのです。Si3210/3211とSi3215/3216では、周波数生成に使う基本クロック周波数が異なっているので、周波数設定のパラメータ値が違ってきます。GUIソフトでは、使用するチップの種類に応じて、この違いを考慮して計算してくれるハズなのですが、どうやらFSK設定での処理がバグっているらしく、Si3215/3216が選択されていてもSi3210/3211用の値を算出しているようです。

オシレータ設定のタブでは、チップ種別に応じてちゃんと違う値を算出してくれます。どうやら、オシレータ設定の場合とFSK設定の場合では、周波数設定パラメータの算出手順は同じようなので、オシレータ設定のタブで設定値を求めてやりました。



上図がFSKのタブを使って周波数パラメータを求めた画面。下図が同様にオシレータ画面を使った時の画面です。同じ周波数を指定しているのに、Freq(Space/Mark)とOSC1/OSC2の値が全然違います。



ほんとは、正しいパラメータの導出方法に基づいて自分で計算して確認したいところですが、FSKパラメータの導出方法についてはデータシートにもAN32にも記載されていません。Freq/Ampはトーンと同じだろうと見当がつくのですが、Transistionパラメータについてはどういう値を設定すればいいのか全く見当がつかないので、Si3210用に算出された値をそのまま流用することにします。きっと、まっとうな顧客には代理店なりSilabsのサポートが対応してくれるのでしょう。

こうして求めた値を使うように変更して、試験をしてみたところ、メデタク番号が表示できるようになりました。



わかってみれば、たったこれだけのことなんですが、すっかりGUIソフトを信じていたので、ずいぶんと時間がかかってしましました。

ナンバーディスプレイに挑戦する -- その2

2008-12-13 23:20:06 | SLIC
モデム信号さえ出せば、番号表示できそうなところまではきたので、そのモデム信号の出し方を調べました。Si3215ではモデム信号で使うFSK信号の出力機能を持っているのですが、その説明はデータシートにはほとんど記載されておらず、別紙のAN32を参照せよという書き方になっていました。AN32の方をダウンロードして読んでみると、信号を出すのに必要な処理がレジスタの設定値例を含めて具体的に説明してあります。

FSKというのは、データの0/1に応じて搬送波の周波数を変化させる変調方式です。Si3215では、マーク(データ1)ならびにスペース(データ0)の時に使用する周波数と、その時間を設定できるようになっています。基本的に1ビットの出力機能しか持っていないので、送信するデータに応じて、正しくタイミングを取って順番にビット列を送出してやる操作はソフトウェアで実現してやらなくてはなりません。
内部には2ビット分のバッファを持っているので、1ビット分データの周波数を送出している時間内に、次の送信ビットをあらかじめ用意しておいてやります。送出時間が経過すると、タイマー満了割り込みがかるとともに2ビット目のデータの送信が始まります。割り込み処理で、次に送信すべきビットを書き込んでやることで、連続したデータの送信がおこなわれるという仕組みです。

こういった処理の手順もAN32に書いてあったのですが、内容を確認してみると。。。
  1. 表2で説明されているSi3215を使う場合に設定すべき間接レジスタの番号が間違っている
  2. 例示されている設定値は、周波数として2200Hz/1200Hzを使用した場合の値になっている

ことに気が付きました。WikipediaでCaller IDを調べてみるとどうやら米国ではBell 202という規格のFSKを使用しており、そこで使用されている周波数が2200Hz/1200Hzになっているようです。

NTTのナンバーディスプレイではモデム信号としてはV.23が使用されていますので、周波数として2100Hz/1300Hzを使用するように設定を変更しなければなりません。Silabsが用意してくれている、GUIソフトの出番です。周波数と出力レベルを指定してやると、設定すべきレジスタの値を算出してくれます。



算出された設定値を使って、発信者番号の送信処理を組んでみたのですが、まだ番号表示できません。実験には新たにclidコマンドを用意しました。端末起動信号用のRINGを送出したら、オフフックを待って、それを検出したらモデム信号を送出するという一連の処理を連続的に行うコマンドです。



送信しているのは発信者番号 0120506 に相当するモデム信号です。実際のデータが始まる前に充分に長い連続したマークを送出することで、全体が300bitになるようにわざと長さを調節してみました。1200bpsのレートで送出しているので、送出時間は1/4秒となるハズで、ほぼそれに近い248msが所要時間として表示されています。ですので、送出に要する割り込み処理が間に合っていないとかいうことは無いと考えているのですが。

安もの電話をつないで、実際の音を聞いてみると、モデムっぽい音はちゃんと出ているようなのですが。。。モデム信号を確認する方法を考えた方がいいのかなぁ。

ナンバーディスプレイに挑戦する -- その1

2008-12-11 00:09:10 | SLIC
予想していたよりも簡単にDTMF検出ができてしまって、SLICの基本的な使い方もわかってしまいました。SIPの方も発信は確認できているので、基本通話ができるメドが立った感じです。しかし、せっかく$150も払って買ったSLICボードですので、もう少し使いこなしてやろうという欲が出てきました。そんなわけで、ナンバーディスプレイに挑戦してみることにしまいた。

アナログ電話に関する技術的な情報は、NTTが電話サービスのインタフェースとして公開しています。この技術参考資料の中でナンバーディスプレイについても解説されているので、この仕様に沿って必要な信号をSLICから送出してやれば、電話機は発信者番号を表示してくれるはずです。

技術参考資料からナンバーディスプレイのシーケンスを抜き出すと下図のようになります。NTTの方が書いたこの記事からの拝借です。



極性反転というのは、RJ11の2本の線の極性を反転してやる操作で、これはSLICの64番レジスタで操作できます。次の情報受信端末起動信号というのは、0.5秒鳴動/0.5秒休止の周期で呼出し信号を送出してやることのようです。ですので、これもSLICのRING関連のレジスタを設定してやることで、実現できます。普通の2秒/1秒の周期の呼出し信号の場合には電話機は着信音を鳴らしますが、この情報受信端末起動信号の場合にはナンバーディスプレイ対応の電話機は着信音を鳴らさないのです。ナンバーディスプレイに対応していない安物電話機では、こんな芸当はできないので、短い周期でベルが鳴り始めます。

一次応答信号というのは、なんのことはない、Off-hook信号のことです。実際には人間が受話器をとりあげているわけではないですが、電話機が自動的にオフフック操作をすると思えばいいでしょう。これを受けて、SLIC側から発信者番号情報をモデム信号として送信してやります。モデム信号については、SLICが持っているFSK信号の送信機能を利用することで送信できます。

電話機側ではモデム信号を受信して、それに対応する番号情報を表示すると、受信完了信号を送信します。この信号もなんのことはない、実体はオンフック信号です。

シーケンスは理解できたので、初めの部分だけでも早速実験してみようということで、実験環境構築。自宅の電話機をつなげてみました。



ファームウェアの側では、最初に極性反転して、ベル周期を変えた鳴動を開始するためのコマンドslic clidを追加しただけです。



コマンドを入れて、しばらくするとOff-Hookが検出されてます。つまり、電話機が情報受信端末起動信号に対して一次応答信号を送ってきているのが確認できたことになります。この時、電話機のLCDには次のように表示されていました。どうやら番号情報の受信待ちの間は、このように表示するようになっているようです。



本来であれば、ここで番号情報をモデム信号で送ってやるべきなのですが、まだそんな機能は用意できていないので、何も送れません。待つこと数秒で電話機側がタイムアウトして送ってくるのが受信完了信号に対応するOn-Hookです。電話機側の表示は次のようになりした。



何も情報送ってませんからね。と、いうわけで送るべきモデム情報さえ送ってやれば、番号表示してくれそうです。

ひかり電話から発呼できるようになった

2008-12-09 00:19:27 | VoIP
SIP TAのSIPスタックの作業を少し進めた結果、発呼ができるようになりました。時たま音声パケットを拾い損ねるか、SLICに渡し損ねるかしているようで、音がひずんでしまいます。ひととおり発着信処理が動いてから、見直した方が良さそうです。

ひかり電話のルータには、複数の電話機端末を接続でき、内線番号を割り当てられます。内線間での通話ができるので、試験のために(通話料金の発生する)外線を使わなくてもすむのがとっても助かります。

次なる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を製作中ですので、実際の作業に入れるのは来年になるかもしれませんが。。。