マイコン工作実験日記

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

キーを付けた

2008-01-19 17:36:46 | W-SIM
これまで空いていた場所に電話用のテンキーを配置しました。千石で700円で売られていたのを見つけて使ってみました。



全部で12キーなので、3 X 4のマトリックス構成です。従い端子は7端子でいいはずなのですが、どういうわけかキーの下部についている端子は8つあります。裏側のネジをはずして調べてみると、一番左の端子はベタアースのパターンになっていました。



テンキーが付いたので、電話番号の入力はできますが、オンフック等の操作をするためのキーがありません。そこでLCDの右側にジョグダイアル風のナビゲーション・スイッチを付けてあります。値段が高いけど、2.54mmピッチで簡単に取り付けられるので便利です。上廻し、下廻し、プッシュの3種類の操作ができます。

これらをつなぐには、テンキーで7ポート、ナビゲーション・スイッチで3ポートの、合計10ポートが必要です。当初はI²CのGPIO Expanderを使うことも検討していましたが、AT91SAM7S256の未使用だったPIOピンを数えると、11ポートあったので直接つないでいます。CODECが出力ポート機能を持っており、LEDやモータをつなぐのにポートを消費せずに済んだので助かりました。

AVRと同じように、AT91SAM7SにもPin Change割り込みの機能があるので、これを使ってキーの検出をすることもできますが、どうせチャタリング処理も必要となるので、20ms周期でポーリングして処理することにしました。

LCDの左上にある丸いのが円盤型振動モータです。ゴムシートの上に載せてみましたが、うまいことブルブルと震えることができずにいます。

これでようやくと電話機としての格好が整いました。いちおう、キーを使っての発信や着信もできるようにソフトも組んだので、次回の記事で説明することにします。

マナーモード

2008-01-17 23:38:24 | W-SIM
秋月で売られていた円盤型 振動モータを付けてみました。2個100円で売られていたモノです。未使用だったCODECの出力ポートGP3に直結しただけです。ソフトの方も簡単に処理を追加、デバックシリアルからのコマンド入力で鳴動処理をトーンか震動か選択できるようにしました。

モータを基板の上に置いただけの状態の時には、振動させるとモータがガタガタと動いていたのですが、モータについていた両面テープのシールをはがして基板に接着したところ、着信があっっても振動しているのかどうかわからなくなってしまいました。わずかに「ブーン、ブーン」と鳴動サイクルに合わせて唸っているし、触ってみれば確かに振動しているのですが... 基板が重すぎるのかもしれませんが、モータと基板の間にある程度の「あそび」を持たせないとうまいこと振動してくれないのかもしれません。

発着信時処理の改善

2008-01-16 11:34:25 | W-SIM
昨日の記事で、「着信に応答しないとW-SIMが勝手に切断してしまう」問題について書きましたが、その対策法がわかりました。そもそも問題の認識が間違っていました。正確には、W-SIMが切断しているのではなく、網側から切断されていました。以下がそのログです。

RING
PROTOCOL=0
ID=
CAUSE=USER REQUEST

DISC

REASON:66

PROGIND:0

NO CARRIER

REASON:66

DISCメッセージが切断要求があったことを示しており、切断原因(0x66 = 102)はタイマの満了を示しています。

以前から奇妙に感じていたのですが、W-SIMに対して別の電話機から発信すると、呼出音(RBT: Ring Back Tone)が聞こえないのです。W-SIM側で着信に応答すると、発信側ではダイアル後、呼出音がせずにいきなりつながってしまうのです。この動作について考えてみると、

「おそらく着信が入ってもW-SIMが網に対してALERTINGメッセージを送出していないのだろう」

と推測することができます。網側は着信を知らせるSETUPを打ってから、端末側の着信処理が進んで、適切な応答が返ってくるのを待っています。必要な応答が一定時間内に返ってこない場合には、網側から切断をおこなってきます。切断されるまでの時間がおよそ10秒だったので、NTTのISDN技術参考資料を調べてみるとT310タイマーが10秒に設定されており、ちょうど発生している現象に符合します。このタイマーの停止条件より、網側は、W-SIMからALERTING, CONNECTあるいはDISCが送られてくるのを待っていると考えられます。この仮定が正しければ、W-SIMにはALERTINGを送出するための手段として、なんらかの仕掛けが用意されているのに違いありません。そう考えてWikiのATコマンド一覧を見直してみると、AT@CALLEDというコマンドがあるのに気が付きました。説明が無いのですが、如何にも自分が呼び出しを検知したことを通知するかのようなネーミングではありませんか。

さっそく着信時処理に小さな修正を加えました。RINGを検出した際にAT@CALLEDを送出するようにしただけです。実際に試してみると ビンゴ!! です。発信側では、呼出音(RBT)が聞こえるようになり、切断されることもなくなりました。着呼時のメッセージの流れは次のようになっていると考えられます。

発信については以前DTEモードでのCTS信号において「DTR信号をいじってみると良さそうだ」と書きましたが、どうやらBREAK信号の送出も有効なことがわかりました。ただし、どのくらいの期間BREAKを送出すれば良いのかがわかりません。不定なのかもしれません。現在は、ATコマンドの送出に先立ち、CTS信号が出るまでBREAKを送出し続けるようにしていますが、このように対処するようにしてから確実にATDでの発信ができるようになりました。

OKI CODEC - TONE生成機能を使う

2008-01-15 10:07:18 | W-SIM
ML7041は、トーン生成機能も持っています。DTMFを生成するだけでなく、着信音(RING)にも使えるようなトーンもいくつか持っています。これらのトーンは相手側に送ることもできますし、自分側で鳴らすこともできるようになっています。この機能を使って、着呼があると着信音を鳴らすようにしてみました。



かなり電話っぽい感じがしてきました。まぁ、最初からW-SIMは電話なわけですが。。。
W-SIMといえば近頃はAndoroidが話題のようですが、こうして自分でマイコンで制御するのも楽しいものです。

処理の手順は次のようにしています。
  1. 着呼が入ったことをRINGメッセージにより検知する。
    • 出力デバイスを一時的にスピーカに切り替え、スピーカアンプを入れる。
    • 着信音に対応するトーンを選択し、CODECを設定する。
    • 着信音鳴動タスクを起動する。

  2. 応答があったことをCONNECTメッセージにより検知する。
    • 着信音鳴動タスクを停止する。
    • 出力デバイスを元の選択に戻す

  3. 切断されたことをDISCメッセージにより検知する。着信音鳴動中であれば、応答の場合と同じ処理で着信音を止める。

ML7041のトーン生成機能は トーンを連続して生成するだけなので、着信音鳴動タスクにより「2秒鳴動、1秒休止」という鳴動サイクルを作成しています。

モニタ上での動作ログは次のようになります。応答操作はmodem answerというコマンドを入れることでおこなっています。ところが、しばらく応答操作をしないでいるとW-SIMが勝手に切断してしまいます。おそらくレジスタか何かを設定しないといけないのでしょうが、どうすればいいのかわかりません。


OKI CODEC - 出力ポート機能を使う

2008-01-14 11:36:52 | W-SIM
ML7041はGP1からGP4までの4つの出力ポートを持っており、I²Cで制御することができます。これらのポートはオープンドレインになっており、LEDを直接ドライブすることができます。GP1だけは、音声データの符号ビットに応じでポートをオン/オフすることもできるようになっています。必要な設定さえ行ってしまえば、あとは通話時の音声内容に応じてポートの出力が変化してくれるはずです。
GP1にLEDをつなげると、どんな感じで光るのか興味がわいたので、手持ちの黄色をつないでみました。

普通に会話している状態だと、ちょっと明滅がわかりにくい感じです。無音区間できれいに消えてくれればいいのですが、符号の倒れ方によっては点灯状態になるかもしれません。天気予報(177)を呼んでみたところ、無音区間できれいに消灯状態になってくれました。そのようすを動画にしてみました。スピーカ出力にもハム音が載ってしまっているのですが、まだ解決方法を調査していません。




出力としてスピーカを選択しておき、177をダイアルします。これらの操作は全てデバック・モニタから行っています。操作はこんな感じです。


OKI CODEC - マイクのノイズ

2008-01-13 18:26:35 | W-SIM
イヤホンが簡単に動いたので、期待を込めて次のステップであるマイクの接続へと進みました。ML7041はマイクアンプも内蔵していますが、第一段のマイクアンプのゲインは外付けの抵抗で設定してやる必要があります。マイクとしてはイヤホンと同じようにPC用のヘッドセットのマイクを使うことを想定します。実際にはコンデンサマイクなので、電源も供給してやる必要がありますので、データシートの応用回路例のように回路を組みました。



ゲイン設定の抵抗は実際には5Kと500Kの半固定抵抗を使い、調整ができるようにしてあります。アンプ部分は反転増幅回路になっているので、ゲインは100倍になります。実際に動かしてみると増幅率はまぁいいようなのですが、音声が聞こえないくらいにノイズが載ってしまっています。試しにアナログ部分の電源を切り離して単三電池2本(3V)に替えてみるとノイズがなくきれいに相手と話すことができますので、電源にノイズが乗っていることは明らかです。電源がマイク出力に影響し、それを100倍に増幅してしまっているのですね。
あれこれ試してみると、どうやらPCMが動きだすとW-SIMからノイズが出るようです。

W-SIMへ供給する3.3Vを別の3端子でUSB 5Vから作ってみると、かなりノイズが削減できることがわかりました。ところが、追加でカラーLCDをつないでみると、また大きなノイズが乗ってきてしまいました。LCDのドータカードにはバックライトLEDのための昇圧回路が載っており、そいつがスイッチングノイズを出すようです。

ノイズ生成源の方での対処は困難なので、マイク側でノイズを削減する方法を採るしかありません。調べてみると、やはりこういう場合にはCRで作成したノイズフィルタを入れるのがお約束になっているようです。



上図のように2.2Kと100uFを追加しただけでノイズはきれいに消えて、快適に通話できるようになりました。

OKI CODEC - 音が出た

2008-01-12 23:05:34 | W-SIM
OKIのコーデック ML7041を使ったボードを組んでみました。CODEC周り以外は、前回のTIのCODECを使ったボードと同じです。そのためソフトの方も変更が必要なのはCODEC関係だけですみます。その上、TIの時と同じようにI2C制御ですので、実際にはレジスタに書き込む値を変更する程度の作業量でソフトの修正は済んでしまいます。


とりあえず、電源とデジタル部分の配線を終えたところで、チップの動作確認をとります。ブート後I2Cを初期化してレジスタをダンプするようにソフトを組んで電源を入れたのですが、これが動かない!! CODECを壊したかとあせってしまいます。初期化もレジスタの読み書きも、ソフトについてはTIのCODECを使ったボードで動作確認済みの部分ですので、ソフトに問題がないことは明らかです。配線を見直すも、電源とI2Cの2本だけなので、間違いないことは簡単に確認できちゃいます。残るはタイミングの問題かということで、データシートを見直すとTIとOKIとの違いが見つかりました。

TIのCODECではI2Cのクロックとして400KHzまでサポートしています。そのため、AT91SAM7S側ではおよそ200KHz弱のクロックを生成するようにしていました。ところが、OKIのCODECではクロックは100KHzまでとなっています。どうやらクロックが速すぎてちゃんと動作しなかったようです。クロックを半分に落として改めて試験すると無事にレジスタダンプが採れました。内容もデータシートで説明されている初期値のとおりでひと安心。

次にアナログ部分の配線と確認へ進みます。ML7041ではイヤホン出力が2つ、スピーカ出力ひとつ、それにマイク入力3つをサポートできます。このうち、イヤホンは外付け部品として直流カットのコンデンサをひとつつけるだけで直接ドライブすることができるので、まず最初にイヤホンをつなげてみました。ジャックにPC用のヘッドセットを挿して、デバックモニタから117をダイアルすると、時報がきれいに聞こえてきました。PCMの読み込みもD/A変換も全部CODECチップがやってくれるので、AT91SAM7Sのソフトは何もしていないわけですが、やっぱり音が出て聞こえるというのは、「動いた!!」という実感があり嬉しいですね。

イヤホンに続いてマイクとスピーカも配線しましたが、マイクの動作で苦労することになりました。この件については、明日の記事で書くことにします。


CODEC再挑戦

2008-01-09 23:19:04 | W-SIM
いったん断念したCODECの接続ですが、再挑戦しようと思います。nicoで使われているOKIのMSM7732の値段を、昨年末秋葉のあるお店に問い合わせたところ単価2,940円との回答でした。あまりにも高すぎるので、こいつは使えません。OKIのCODEC製品を改めて調べてみるとML7041という製品があることがわかりました。MSM7732と違って制御用のシリアルもI2Cになっており、こちらの方が使いやすそうです。

OKIを扱っている通販を探したところコアスタッフに在庫があり、単価も486円。即、発注しました。こいつで、もう一度組んでみることにします。

開発環境 - JTAG

2008-01-07 23:10:50 | Weblog
W-SIMの方はLCDをつなげたところで、しばらく停滞中。きょうは、開発に使用しているARM用JTAGについて書いておこうと思います。

わたしが使用しているJTAGはKrisTechのUsbScarabという製品です。ポーランドの会社の製品ですが、昨年Sparkfunで扱っているのを見つけて購入したものです。当初はOLIMEXのJTAG USB OCDを購入することを考えていたのですが、Sparkfunではいつも在庫切れ状態なので、在庫のあるUsbScrabを買ってみることにしました。値段は$75くらいでした。どうやらSparkfunでは在庫を売り切るとともに取扱いを止めてしまったようで、今ではProgrammarの一覧の中にUsbScarabを見つけることはできません。

わたしは他のJTAGを使ったことがあるわけではありませんが、UsbScarabもどうやらFT2232ベースのようであり、仮想COMポート機能も備えているしOpenOCD対応も詠っています。KrisTechでは、UsbScarab用のARMデバッガを用意しており、こいつを使うことでLPC2000とAT91SAM7に対してはフラッシュの書き込みがおこなえます。I/Oレジスタを調べるための機能も各CPU用にあらかじめ用意されており、簡単に使えて重宝しています。このデバッガで間に合ってしまっているので、結局OpenOCDも使わずにいます。



上記のようにいったんデバイスを選択しておくとともに、ファイルロード時の動作を指定しておくことで、ELFファイルを読み込む度に自動的にフラッシュの書き換えをおこなってくれます。ソースのコンパイルはvmware上のLinuxで行っていますが、Windowsとのファイル共有をおこなってくれるhgfs機能を使うことで、コンパイルにより生成されたELFをARMデバッガで読み込めるので結構快適です。Eclipse+OpenOCDというのが当世風なのでしょうが、バカチョンで使える簡便さからコイツを使い続けています。

AT91SAM7にはSAMBAというシリアルまたはUSBを用いたローダ機能も用意されていますが、SAM7-H256とUsbScarbaを同時に購入して使い始めたので、一度も使ったことがありません。やはりJTAGでの書き込みは快適ですね。一度、こいつに慣れてしまうと時間がかかったりジャンパの設定変更が必要なシリアルでのロードは苦痛です。

以前DWMのおまけARM基板を使っていた時には、増設したRAMで走るコードは128KB近くになっていました。この時には32KBのフラッシュには、SDカードのドライバ, FAT FSとHEXローダを焼いておき、このコードを使ってSDカードに書き込んだHEXファイルをRAM上にロードするようにしていました。ノートPCとしてLets Noteを使っているので、SDカード渡しはさほど時間もかからず、それなりに便利でした。

さて、UsbScarabなんですが、いつの間にかUsbScarab2という製品にアップデートされているようです。外観にはなんの変化も無いようなので、内部回路が何か変わったのだと思われますが、どういう変更があったのかまったく不明です。


LCDをつなげる

2008-01-03 17:08:41 | W-SIM
LCDをつなげてみました。aitendoで仕入れたNokia 3310 B&W をつなげるつもりでいたのですが、どうもコネクタがぐらついて接触がよろしくない。断念してSparkfunで買い置きしてあったNokia 6610 Colorに変更しました。



Nokia 3310はトラ技の記事でもすでに何回か登場しているようですが、6610もsolitonに加えてイチゴLinuxがsparkfunの代理店になったことで入手性が良くなったので、利用者も増えているのではないでしょうか。近頃はaitendoにも置いてあるようです。わたしは、2年ほど前からSparkfunを使うようになりましたが、最初に買ったもののひとつがこの液晶です。製品紹介の注意書きにもありますが、ほんとにこいつのコネクタは弱いです。何度か抜き差ししていて、ひとつダメにしました。それ以来、キャリアボードのコネクタに装着する際には、接着して固定するようにしています。

このLCDは3310と同じようにSPIでつなげられますが、3310ではC/D(Command/Data)の切り替え指示をSPIとは独立した端子でおこなうようになっているのに対し、このLCDではSPIデータ中の1bitとして指定するようになっています。そのため、SPIでの送信データ長が9bitになります。ATSAM7のSPIは9bit~16bitも扱えますので、簡単に処理できます。もちろんDMAできるので、いったんバッファに書き込むデータを溜めこんでおいてから一気に書き出すようにしています。


とりあえずは、お約束の表示ができたところまでにしておきます。