« 2012年8月12日 - 2012年8月18日 | トップページ | 2012年9月16日 - 2012年9月22日 »

2012年8月26日 - 2012年9月1日の1件の記事

2012年8月30日 (木)

アナログ工作にはまる:焦電型赤外線センサーユニットの制作

 電波時計のデコードを考えているうち、工作が思わぬ方向に曲がってしまった。いつもの脱線である。まあ、今、何か作りたい大きなテーマがあるわけではない。こういう気ままな寄り道は所長の好むところでもある。

 FPGAのDE0とか、雑誌付録の何台かの手付かずの32ビットプロセッサー、FreeRTOSを使ったLPC2388のネット制御など懸案は山積しているが、これというアプリケーションが見当たらないので腰が重い(これを現実逃避とも言うが)。つい手元の電子部品で遊んでしまう。

電波時計ユニットにフォトカプラー接続(8/19/2012)

 このところの電子工作と言えば、Aitendoの電波時計ユニットである。あとから買った40,60kHz両バンドモジュールが思いのほか感度が良くて実用化してみようという気になってきた。窓際にアンテナを出して電波を安定的に受け、本体を工作コーナーに置いて、工作室の標準時計としても良い。

 そうなると次のステップは、JJYパルスのデコードである。1秒に一回(1bps)という気の長いデータなので、マイコンにはどんなロジックでも組み込める。ただ、単純に1秒ごとのパルスの長さを測っているだけでは、ノイズに弱いデコードになってしまうだろう。

 それに、ひとつパルスを取り損なったら、今までのデータをすべて破棄して、次の59秒のマーカーまで休むのでは効率が悪い。ひとつのエラーでデータを最初から取り直すような厳格なプログラムでは正確な時刻を取得するのに何十分もかかる可能性がある。何かインテリジェントな方法がないだろうか。

S_p8195132 こうしたノイズに強いデコードロジックの開発のために、まずは現在の受信状態をオシロか何かでしっかり把握しておく必要がある。しかし、電波時計ユニットは何故かオシロやロジアナをつなぐと、PCデスクの前でも出来ていた受信が不能になってしまう。

 デジタルノイズがプローブを通して入るからだろう。このままではLEDの点滅を見ているだけで先に進まない。JJYのシミュレーターもあるが、これは今度は完全すぎて本当のテストにならない。どうしたものか。

 そのうちアイデアが閃いた。フォトカプラーである。フォトカプラーで絶縁すれば、デジタルノイズが防げるかもしれない。フォトカプラーは最近いくつかの工作に応用して経験値が上がっている。思い立ったら動きは早い。早速、フォトカプラーをブレッドボードに差して実験を開始した。

 うまく行った。PCデスクの前でも順調にJJYの1秒パルスを受信できるようになり、オシロからやっとそれらしい波形を観測できるようになった。ただ、結構ノイズが多い。アンテナの角度が微妙だ。

S_p8195133

 当面の観察の結果だが、ノイズは立ち上がりか立下りの時に多く発生し、パルスの中間では少ない。チャタリング防止のような考え方でかなりのノイズは防げそうである。一方、パルスの中間のノイズは防ぎようがないが、これも100ms以内で元へ戻るようなら、なかったものとするロジック(チャタリングと同じ)で除去できるかもしれない。

 つまり、立ち上がりの割り込みでチャタリング防止のように立ち上がりを検知してから10ms程度の待ちを入れると、かなりノイズは防ぐことが出来そうである。しかも立ち上がりパルスは厳密には正時0秒なので、こちらにある程度の精度のクロックがあればノイズは無視できる。

 中間のノイズは、一旦デコードして、かけはなれたパルス長(200、500、800msの3種で許容値が決まっている)になるなら、その立下りを無視する。判定できなければ(殆どがデータパルスだろう)データフレームを持っているので、そのブロックだけのデータを無効にして次の1分でとりなおす。日や時間などは、急には変わらないので全部取り直す必要はない。あれこれ本格的にロジックを考え始めた。

 そのうち、掲示板でChaNさんのサイトにも電波時計の制作記事があることを知った。何と10年以上も前の2001年の記事である。Tiny2313の前身のチップAT90S2313時代の作品だ。ソースコードもついている。

 ダウンロードしてみた。プログラムはアセンブラーだ。回路図もある。何々、クロックが4.194304MHzという半端な周波数を使っている。これはどういうわけだ。ソースコードを読むうち、彼のデコードアルゴリズムを知って目から鱗が落ちた。

 連続してデータを見るのではなく、サンプリングで値をとり、サンプリングの間隔を、2のべき乗で(2の22乗)の周波数で分割してずれないようにしている。そうか、こういう方法ならチャタリング防止などは考える必要がない。マーカーが決まればかなり正確にデータがとれる。

 人のソースは見ないと頑張っていたが、やっぱり独断でことを進めるのは効率が良くない。先人の智恵をもっと調べることも重要だ。大きなヒントを貰った。このスタイルを真似て作ってみよう。半端な周波数の石は手に入らないが、分周とカウンターの上限を工夫すれば、きっちりした時間を作ることは可能だ。

アナログづいて今度は焦電センサーアンプ組立て(8/20/2012)

フォトカプラーを電波時計ユニットに入れてデータ波形の取得に成功した。アナログが楽しい。ただ、ChaNさんのコードを見て、開発の道筋が見えてくると安心して逆にやる気を失うという、いつもの悪い癖がでて、次のステップが進まなくなった。

 そのうち、ウェブで8ピンAVRのTiny13の制作例を探しているうち、Napionというディバイスを見つけて気分が変わった。Tiny13は電波時計ではなく、この間の小型モーターの制御(ワンショットパルスの生成、前記事参照)に使おうと考えているCPUチップである。

Napion

 それはともかく、Napionとは、Panasonicが出した焦電型赤外線センサーとアンプを組み込んだ人感センサーチップである。これだけで人や動物の接近をTTLパルスで出力する。へー、こんな便利なセンサーがあるんだと調べてみたら、単品でも売っている。ただ、少し高い。千石で¥1100だ。

 そういえば、当研究所には昔、秋月で用もないのに焦電センサー(RE210 ¥100)と集光(フレネル)レンズ(¥300)を買ってあったことを思い出した。 センサー出力をオペアンプで増幅してやらないとデジタル処理が出来ないことがわかり、そのままになっている。 何故かこれを急に作りたくなった。恐らくNapionを欲しいなと一瞬思い、それが¥1000以上するとわかった反動だろう(もっと安くで手に入るのになぜ作らない)。

S_p8195130

 人感センサーなら応用はいたるところにある。作っておいて無駄になることはあるまい。当研究所のテーマは予測のつかないきっかけで決まるというのは恒例のことである。今回も何の脈絡もないオペアンプの増幅回路を汎用基板に作り始めた。 電波時計?え、それがどうしたのという変わり身の早さである。

焦電センサーはあっけなく動く(8/21/2012)
 焦電センサーのアナログアンプ回路のお手本は、ウェブ上に沢山ころがっている。データシートに掲載された参照回路は増幅率が1万倍、秋月の焦電センサーキットの回路では、1600倍である。中をとって2000倍のアンプを組む(45×45)。オペアンプは定番のLM358。レールツーレールのLM662までは必要ないだろう。

 アンプのあとのダイオードを使ったコンパレーターやNE555のパルス生成の部分は、それこそTiny13の出番である。とりあえずはNapionと同じようにTTLの出力が出るところまで、ブレッドボードではなく汎用基板を切り出して直接作ることにする。

 久しぶりの細かいハンダ付けが楽しい。オペアンプの周りにCRが密接に配置され彩りも綺麗だ。半日で完成した。配線を何度も確かめる。アンプがどんな出力を出してくるか楽しみである。

S_p8215139 出力をオシロにつなぎ、通電する。暫く動かない。ふーむ、誤配線か、と考え始めたころ(約10秒後)、突然、出力は1(負論理なので入力なし)に上がり、さらにその30秒後波形があらわれた。このセンサーは通常の動きをするまでに40秒近くかかるようだ。おーし、手をかざすと波形が変化する。

 赤外線を感知してパルスを出しているのは間違いないが、この素子が動くまでこんなに長時間かかるとはどこにも書いていない。しかも詳しい波形の様子を見せてくれるところも少ない。

 微分波形が出ているようだ。人間の手など赤外線を出す物体が動いてきて赤外線を検知するとまず大きな立下りパルスが出て、出力はほぼ0V(入力あり)になる。手をそのままにしていても、このあと1秒もしないうちにパルスは元へもどる。そこで手を動かしてセンサーから離れると、再びここで立下りパルスが出る。

S_p8215137 面白い。フレネルレンズをつけてみた。この効果はすごい。感知するエリアが劇的に狭くしかも高感度になる。3メーター以上離れていても感知する(説明書によると10mまで検知するそうだ)。

初めてのTiny13のプログラミング(8/24/2012)
 8ピンAVR、Tiny13の登場である。去年の暮、Dragonを入手して、AVRのパラレルプログラミングがいつでも可能になり、秋月で面白がって3ヶ程買ってあった。当研究所最小のAVRである(Tiny10は小さすぎて使い道が思いつかない。それに処理環境がない)。

 小型モーターのon/off制御に使おうと思っていたが、意外なところで登板の機会が巡ってきた。まずはブレッドボードに組み込む。8ピンなので準備もあっけない。リセットピンを使わなければシリアルプログラミングが出来るようなのでISPをつけて早速テストする。よし、問題なくAVRSPはTiny13を認識した。ヒューズビットを換えてクロックを4.8MHzにする。

 ソフトの開発である。Cでどれだけ入るか、もし入らなければアセンブラーに行こうと考えている。今度のアプリではUARTはそれほど必要ではないが、今後のこともあるので、とりあえずISP-UARTを入れてみた。UARTだけで600バイト消費した。残りの400バイトでロジックを組まなければならない。

まず、UARTだけで動くかテストする。駄目だ。字化けしている。クロックがCR発振の4.8Mhzという半端なクロックなので、ボーレートの算出が難しい。なかなか文字化けが解消しない。当所の標準ボーレート38.4kbpsではどうしても合わず、9600bpsへ落とす。やっと落ち着いた(クロックがCRだと38.4kbpsは無理だとあとで気が付いた)。

 パルス検出のルーチンを次に組み込む。ChaNさんの電波時計デコードルーチンのソースにならって、焦電センサーもタイマーのサンプリング方式でロジックを組む。ベタにパルスの立ち上がりを待つのでなく、一定の時間間隔(13.3ms)でパルスの状態を見てやれば、ついでにチャタリングなどのノイズを除去できる。

 ロジックは、仕事の行き帰りなどの空き時間を使って、既に構想は出来ていた。フラグを2つ使って、サンプリングの3つの状態を時系列で調べる。100(0がパルス検出)のとき始めてパルスがあったと判定するロジックだ。101や、00、01、11のときは何もしない。

I/Oポートの調整でトラブル解消(8/25/2012)
 パルス検出ルーチンは、いつものように擬似コードで何度もロジックを確かめながら、C言語のコードに換えていく。検知してからのタイムアウトは常にタイマーを加算しておいて、パルスを発見できなければループのあと常に0に戻し、パルスが出てスイッチが入った後は、タイマーをリセットしないというロジックだ。これでタイムアウトが検出できるはずである。

 コードは800バイト余り。まだ余裕がある。テストである。大丈夫だとは思うが、こういうのは動かしてみなければ始まらない。プログラムは考えたようには動かない。書いたとおりに動く。最初の通電はいつも緊張するが、今回は8ピンAVRなので、気楽に電源を入れる。

 うむ、UARTからメッセージが出た。動いたようだ。焦電センサーが動作し始めるのをオシロの波形を見ながら待つ。動作し始めた。手をかざす。LEDが点灯した。10秒経って消えた。お、消えたのは一瞬ですぐ点灯した。オシロを見ると入力波形に小さなディップが出来ている。

 これが原因か。コンパレーターを入れていないので、0,1の判断は入力ピン任せだが、Tiny13のピンの0の閾値はこんなに高くない。この程度のディップで0と判断されるのはおかしい。それに入力が隣のLED出力ピンの上下に影響されて動いているような感じだ。ソフトが原因でない証拠に時々初期状態に復帰する時がある。デジタルではこんなことは起きない。

 さて、トラブルシューティングである。焦電センサーからの電力不足ということがあるのか。Tiny13のポートの性質なのか。データシートを本気で見直す前に、念のため、PORTBの初期状態を0から1にしてみた。山勘である。

 これが、うまく行ったのである。ピタリとトラブルは解消した。PORTBを1にするのは、ピンが出力の時はピンの出力を1にし、入力のときはチップ内でプルアップする。しかし入力ピンのプルアップは外部で一度試してその効果がないことを確認している。

とにかく、わけがわからないけれど動いたことには間違いない。半日で焦電センサーのデジタル部が完成した。嬉しい。

ミニブレッドボードに移しもう少しテスト。実用性は十分(8/28/2012)
 PCデスクの横の大きなブレッドボードから、持ち運びの出来るミニブレッドボードにTiny13の部分を移し、焦電センサー部を、工作に使っている部品固定スタンドにつけて集光レンズの性能を確認する。

S_p8285141 すごい。感知するエリアは、2~30センチくらいのビーム状だ。5m以上離れていても赤外線の動きをキャッチして鋭く立ち下がりパルスがでることがわかった。階段の下のコーナーに設置すると、階段の最上部に立っただけで人がいることを検知した。タイムアウトは5秒にして、暫く遊ぶ。十分な性能である。

 次にTiny13にsleep機能を入れた。フラッシュサイズは900バイトまで上がったがまだ大丈夫だ。焦電センサーの消費電流は5Vで1mAちょうどくらい。Tiny13は、sleepを入れる前は2.8mA、全体で3.8mAだったが、sleepを入れると0.8mAに低下し、全体では1.8mAになった。

 タイマーのサンプリング時間を長くすればもっと少なく出来るがACを制御するならあまり気にする必要はない。ただ、AC100VからDC5Vにするのが面倒だ。このあいだ安売りショップで買ったUSB用の5V電源は測ったところノイズが多く5.5Vもあった。気をつけないと機械をこわしそうだ。

Pyrosens

 たいしたプログラムではないが、みなさんの参考までにソースコードと、回路図を公開することにする。今のところ地下室に向けての階段の照明に使おうかと思っている。ただし、既存の階段照明に取り入れるのは、資格を持っていないと出来ない。電気工事士の資格が欲しくなってきた。とりあえずは、電気スタンドを秋月のSSRキットでドライブしてやろう。

以下に例によってAVRStudioのプロジェクトフォルダーをzipファイルにして置きます。
フォルダーの中にBSch3Vの回路図も入っています。

「Pyro13.zip」をダウンロード


| | コメント (13) | トラックバック (1)

« 2012年8月12日 - 2012年8月18日 | トップページ | 2012年9月16日 - 2012年9月22日 »