人体センサー 制作: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コンバーターを使用してみた、これだとかなり急激に電源電圧が変動しても電源出力が安定している。大食いの回路と同居しなければいけないときには有効。デジタル時計はこの方法に決定。