人体センサー 制作:2007-09-30〜2007-11-10
デジタル時計の人体センサーの動作が何だか不安定な気がするので、センサー部分だけの実験回路を作りました。楽勝と思って作り始めたデジタル時計だが苦戦中だ。
基板パターンと回路図。センサーだけではつまらないのでAC100をON/OFFできるトライアックとモーターやリレーをON/OFFする回路も付けた。タイマーはPICでプログラム制御。
基板のサイズが70×70なので、100×75の基板はちょっと大きすぎます。けちって感光基板の感光面にテープを貼って切断したら、こんなになってしまった。感光剤は硬く脆いようです。貼ったテープは右の粘着力の弱い物。ただし、表面がつるつるの物にはかなり強く密着する。
もう一枚買ってあったので再度実験。今度はテープを貼らずに感光面を下にして、カッターの上に紙を一枚下に敷いて切断。切り落とされた方のかたわれは切断時に変形するので若干のダメージ有り。もう一方はほぼダメージ無し。
気温が低いためか、それとも10日ほど前に作った現像液を使ったためか不明だが、感光がなかなか進まない。10分近く現像に時間がかかった。
出来はそんなに悪くない。100V用の穴は大きすぎ。アダプターソケットの穴も同じく大きすぎ。
あっという間に完成。
つまらない工作なので半田付けしているところを撮影してみました <− MOVIE
すぐ左にカメラがあるので左手を置く場所が無い。人差し指と中指で半田を挟んでいる。かなり苦しい体制での撮影。
手前に移っているのは中指です。カメラの位置が悪かったが撮り直すのも面倒だった。
半田は必要に応じて使い分けている。上のMOVIEで使っている半田は銀色ラベルの0.65mm径の半田。この径が一番使いやすい。無洗浄タイプなので半田の乗りがいまいち。右の紫ラベルの物は無洗浄タイプではないが、ものすごく半田の乗りがいい。
動作が変 <− MOVIE なぜか手を近づけると動くの図
動作がおかしい問題はMCLRのプルアップで解決する。PIC16F648AはMCLRのプルアップ抵抗無しでいけるはずなのだが.... _MCLR_ONの方にチェックを付けていたのが原因。抵抗無しの場合は_MCLR_OFFの方にチェックを付けるのが正解。何だか逆に感じるのだが。MikroBASICが変なのか?
動作させてみるがやはり不安定。各部の電圧を調べてみると、そもそも電源電圧が20mV程度フラフラ変動している。これの影響を受けているような感じ。
フォトカプラが電源のふらつきの原因のようなので外してみた、電源電圧がふらつくほど電流を流していないのだが、抵抗付け間違えたかな?電源のふらつきは解消したが、動作に変化はない。原因がわからなくなった。ブレッドボードで組んで動いていたのだから基板にすればもっとまともに動くと思ったのだが。オペアンプ回路だから一点アースとか気にしなければいけないのかも。再度ブレッドボードで組んで配線いろいろいじって確認してみよう。
ブレッドボードで回路を組みました。
ブレッドボードだとうまく動く <−MOVIE
センサーの直ぐ近くの回路だけを、動作不安定な基板で、それ以外をブレッドボードで動かしてみる。この時点では安定動作しています。
敏感すぎるだけなのかと思って、反応を鈍くするため縦に並んでいるダイオードを2個直列にしてみましたが、確かに感度が鈍るのですが不安定さは解消しません。
この回路は2段階増幅していますが、1段目をプリント基板、2段目以降をブレッドボードにしてみました。この状態で動作不安定。1段目に原因有りということになります。
何度か実験しているうちに、上の写真の状態でも安定して動くことがある。何だかわからなくなってきた。ブレッドボードの方が安定動作するのは、下にアルミ板が敷いてあるからだろうか?
2段増幅回路の両方ともカットオフ周波数1.6Hzのバンドパスフィルターになっているので、抵抗値を半分にしてカットオフ周波数を3.2Hzに変更してみた。ノーマル状態では1m程度の距離に手をかざしても反応するが、カットオフ周波数3.2Hzにすると50cm以上の距離で反応しなくなる。カットオフ周波数を変えると感度が鈍くなる。
実験しているうちに電源装置が壊れてしまった、出力をショートさせてしまったので何かが飛んだみたいだ。パイロットランプは点灯しているが、電圧表示LEDと左側の電源が入らない。右側の電源の出力は正常に出ている。
ヒューズが飛んだだけだった。かなり昔に作ったのでヒューズを2個使った設計だったことも忘れていた。壊れたことよりも設計通りにヒューズが飛んだことに感心してしまった。コンパイル直後のプログラムがバグ取りもせずにそのまま動いた気分。ヒューズがもったいないので飛ばしてみる実験は当然やっていない。
プリント基板の方も抵抗値を変えてみた、感度が鈍くなり遠くの物に反応しなくなるが、周波数が高くなっているため動きの遅い物に反応せず、早い物に反応するようになった。人体を検知するのに適当な周波数は2Hz付近だそうだ。電源の善し悪しに影響されやすいみたいなので、パスコンを裏面に半田付けしてある。
実用レベルで動くようになった <−MOVIE
モーターを動かす実験。フォトカプラで絶縁してあるので動いてもセンサーに影響ありません。
照明拡大鏡をON/OFFしてみた。あとはタイマープログラムを作れば完成だ。
AC100Vの実験 <−MOVIE(よいこのみんなは部屋をあかるくしてパソコンから離れてみてね) 悪いおじさんは普通に見てね、ちょっと目にしみるよ
やっと完成。消費電力は秋月電子のアダプターを使用して1Wちょっと。アダプター自体の消費電力が0.9Wほどある。100Vが基板上に来ているのに、他にアダプターが電源として必要になるのがかっこ悪い。AC100Vを接続したまま、5V電源を抜いても大丈夫です。
これがセンサー部分の回路図。回路図全体はこれ
PICのプログラム <−MicroBASICのソース&HEX
回路図&基板パターン <−EAGLEのファイル一式。センサー部分の部品レイアウトがだいぶ変わっています。
PICのプログラムはこんな仕様
1.センサーが安定すると緑LEDが点灯する
2.センサーが反応すると赤LEDが点灯する
3.センサーが反応すると、AC100VがONする、そしてモーターのON/OFF回路もONする
4.センサーの反応が無くなってから30秒経過するとAC100V、モーターON/OFF回路がOFFする
MicroBASICの無料版でコンパイルできるサイズなので、プログラムが書ける人はいじってみて下さい。サンプルプログラムではやってませんがセンサーはRB7に繋がっているのでポート変化割り込みも使えます。
0001 '-------------------------------------------------------------- 2007-11-09 ----- 0002 ' JINTAI SENSOR Timer PIC16F648A Clock 20MHz 0003 '------------------------------------------------------------------------------- 0004 program Jintai 0005 0006 '---- symbol definisions ---------------------------- 0007 symbol PORT_OUTPUT = 0 0008 symbol PORT_INPUT = 1 0009 0010 symbol SENSOR_TRIS = TRISB 0011 symbol SENSOR_PORT = PORTB 0012 symbol SENSOR_BIT = 7 0013 0014 symbol AC100V_TRIS = TRISB 0015 symbol AC100V_PORT = PORTB 0016 symbol AC100V_BIT = 2 0017 0018 symbol MOTOR_TRIS = TRISB 0019 symbol MOTOR_PORT = PORTB 0020 symbol MOTOR_BIT = 1 0021 0022 symbol LED_RED_TRIS = TRISA 0023 symbol LED_RED_PORT = PORTA 0024 symbol LED_RED_BIT = 2 0025 0026 symbol LED_GREEN_TRIS = TRISA 0027 symbol LED_GREEN_PORT = PORTA 0028 symbol LED_GREEN_BIT = 1 0029 0030 symbol SENSOR_ON = 1 0031 symbol SENSOR_OFF = 0 0032 0033 symbol MOTOR_ON = 1 0034 symbol MOTOR_OFF = 0 0035 0036 symbol AC100V_ON = 1 0037 symbol AC100V_OFF = 0 0038 0039 symbol LED_ON = 1 0040 symbol LED_OFF = 0 0041 0042 0043 main: 0044 dim counter as word 0045 0046 '---- port A digital INPUT-OUTPUT (comparetor off)-------- 0047 CMCON.CM2 = 1 0048 CMCON.CM1 = 1 0049 CMCON.CM0 = 1 0050 0051 '---- disable port B pull-up ------------- 0052 OPTION_REG.NOT_RBPU = 1 0053 0054 SENSOR_TRIS.SENSOR_BIT = PORT_INPUT 0055 AC100V_TRIS.AC100V_BIT = PORT_OUTPUT 0056 MOTOR_TRIS.MOTOR_BIT = PORT_OUTPUT 0057 0058 LED_RED_TRIS.LED_RED_BIT = PORT_OUTPUT 0059 LED_GREEN_TRIS.LED_GREEN_BIT = PORT_OUTPUT 0060 0061 LED_GREEN_PORT.LED_GREEN_BIT = LED_OFF 0062 LED_RED_PORT.LED_RED_BIT = LED_OFF 0063 MOTOR_PORT.MOTOR_BIT = MOTOR_OFF 0064 AC100V_PORT.AC100V_BIT = AC100V_OFF 0065 0066 Delay_ms(500) 0067 counter = 0 0068 while( True ) 0069 if SENSOR_PORT.SENSOR_BIT = SENSOR_ON then 0070 counter = 0 0071 else 0072 counter = counter + 1 0073 end if 0074 Delay_ms(100) 0075 if counter > 10 then 0076 break 0077 end if 0078 wend 0079 LED_GREEN_PORT.LED_GREEN_BIT = LED_ON 0080 0081 counter = 0 0082 while( True ) 0083 if SENSOR_PORT.SENSOR_BIT = SENSOR_ON then 0084 LED_RED_PORT.LED_RED_BIT = LED_ON 0085 MOTOR_PORT.MOTOR_BIT = MOTOR_ON 0086 AC100V_PORT.AC100V_BIT = AC100V_ON 0087 counter = 0 0088 else 0089 LED_RED_PORT.LED_RED_BIT = LED_OFF 0090 if counter < 60000 then 0091 counter = counter + 1 0092 end if 0093 end if 0094 Delay_ms(10) 0095 0096 '----- 3000 = 30sec ------------------------ 0097 if counter >= 3000 then 0098 MOTOR_PORT.MOTOR_BIT = MOTOR_OFF 0099 AC100V_PORT.AC100V_BIT = AC100V_OFF 0100 end if 0101 wend 0102 end.
プログラムの解説:
1〜3行目
コメント。先頭が ’ になっている行はコメント。
4行目
プログラムの名前
7行目〜40行目
シンボルの定義。これを定義しておくとイコールの左側の文字が右側の文字で置き換えられる。
変数とは違います。
例えばポートBの0ビット(つまりRB0)にLEDが繋がっていたときに
PORTB.0 = 1
と書くとLEDが点灯しますが、PORTBの0ビットに何が繋がっているか意識しながら
プログラムを書かないといけなくなります。
symbol LED_PORT = PORTB
symbol LED_BIT = 0
symbol LED_ON = 1
と定義しておくと、以下のように書くことが出来ます
LED_PORT.LED_BIT = LED_ON
プログラムのロジック部分を書く前に、回路図を見ながらこのシンボル定義を書いてしまいます。
そうすると後は回路図を見なくてもプログラムが書けます。
44行目
変数の定義です。wordは16ビットです。取り得る値の範囲は0〜65536です。
52行目
ポートBの弱プルアップを無効にしています
54〜59行目
ポートが入力ポートなのか出力ポートなのかを決めています
61〜64行目
出力を初期化しています。
LED,モーターON/OFF回路、AC100Vをoffしています。
66〜79行目
センサーが安定するまでこのwhileループで待っています。回路が安定するまで電源投入してから7〜8秒かかります。
カウンター(counter)にゼロをセットして100ms間隔でセンサーの状態を監視して、連続して10回(つまり1秒間)センサーの反応がなければ安定したと見なします。
安定したら最後に緑LEDを点灯させます。
82〜101行目
センサーが反応したときだけ赤色LEDを点灯させています。
センサーを10ミリセカンド間隔で監視して、3000回(つまり30秒間)センサーが反応しなかったら、AC100VとモーターON/OFF回路をOFFします
30秒以内にセンサーが反応すると、反応した時点から更に30秒待たないとOFFされません
97行目の3000を変更すればON時間を変更出来ます。但しこの値は60000(つまり600秒)より大きくできません。
もし、もっと長い時間ONしていたいなら、counterをlong型に変更すればOK
90行目でカウンターのオーバーランを防いである。
トランスレス電源をブレッドボードで組んでみた。とてもシンプルな回路。AC100Vと絶縁されていないので変に触ると感電するが、電流はほんのちょっとしか流れない。パーツケースの中にあった耐圧の高いコンデンサは0.1μFが2個だけしかなかったので、それを使った。もうちょっと容量が大きいと電流も多く取り出せるが人体センサーとLED1個程度なら大丈夫。定電圧はツェナーダイオードを使用して取り出している。固定電圧のツェナーダイオードが無かったのでTL431という可変容量の物を使用した。この回路で出力は5mA程度取り出せる。
人体センサーの回路と電源回路を合体。消費電力は0.4W程度に出来た。100ケーブルはテスターのカールコードを使ったがコイルになっているので何らかの影響があるかも。
さすがに、この回路を駆動する電流は取り出せない。PICも20MHzで動いていて大食いだし、フォトトライアックやフォトカプラーをONさせるのにはそれなりに電流を流さないとダメ。トランスレス電源のコンデンサーを大きくすれば大丈夫だと思うが、消費電力はアダプターを使用するのと大して変わらなくなってしまうので無駄な電線を省略したい用途以外には向いていない。
電源電圧の変動に敏感なので、DC−DCコンバーターを使用してみた、これだとかなり急激に電源電圧が変動しても電源出力が安定している。大食いの回路と同居しなければいけないときには有効。デジタル時計はこの方法に決定。