焦電型赤外線センサとリードスイッチを組み合わせた高精度な在室検知

 トイレにしばらく籠っていると電気が消えて、再びセンサを反応させるためにウネウネ動いたことはありませんか?この機器を導入すればそれが不要になります。

機器の概要

 焦電型赤外線センサとリードスイッチを用いた在室検知器です。動体検出とドアの開閉状態から人の居る/居ないを論理的に決定付けることにより、一般的な人感センサのように部屋の中に入った後じっとしていても不在扱いされることがありません。

使用するセンサ

焦電型赤外線センサ

 いわゆる人感センサに使われるものです。このセンサは人間等の発する赤外線を焦電体に集光して温度変化させ、それにより生じる表面電荷によって動体検出を行います。このような焦電体の働きを焦電効果といいます。今回はPanasonicのEKMC1603112を使用します。

 下図はセンサの構造を簡単に図示したものです。実際はレンズ形状を工夫して検出範囲を広げたり、焦電体を複数並べて検出精度を上げたりしています。

 焦電効果は焦電体の温度”変化”がないと起こりません。つまり原理上、動かない物体は焦電体が温度変化しない⇒焦電効果が生じないので検出できません。これで何が起こるかというと、「トイレにしばらく籠っていると電気が消える」現象が起こるわけです。

リードスイッチ

 磁力に反応してON/OFFするスイッチで、防犯システムの一部として窓や扉に設置されています。磁石はリードスイッチに対して平行に近づけるのがポイントで、垂直に近づけると動作しない可能性があります。これは下図のように、リードスイッチの外側から磁化させないと接点がそれぞれS極/N極にならないためです。

 リードスイッチ本体と磁石が一体になって売られているものもあります(秋月電子リンク)。ドアスイッチに使うならこちらの方が便利です。今回はJIN SON ENTERPRISEのMC-14AGを使用します。

回路図

 PICマイコンを使用します。PIC12LF1822は内部プルアップを持っているのでリードスイッチを直接接続できます。一方焦電型赤外線センサはプルダウンが必要で、このPICは内部プルダウンを持っていないので外付け抵抗を接続しています。LED1は室内に人が居る時に点灯します。

 参考までに、焦電型赤外線センサEKMC16030012(Panasonic)の結線図です(データシートより)。

動作

 機器の動作を下表に示します。表示灯は部屋の中に人が居る時に点灯します。ポイントは8番目の動作で、扉が閉まっている状態で動体検出が有→無に変化しても在室状態が保持される点です。ここが一般的な人感センサとの違いで、動かない人を検出できない焦電型赤外線センサの欠点を扉の開閉状態を検出することで補っています。

番号
(リードスイッチ)
動体検出
(焦電型赤外線センサ)
表示灯
(点灯⇒在室)
1点灯
2点灯
3消灯
4消灯
5消灯
6点灯
7点灯
8点灯

製作

 そんなに複雑じゃないのでサクッと。

 基板の四隅に付いている足みたいなのは北川工業のミニカードスペーサです(秋月電子リンク)。貼り付けボスに比べて足の面積が小さいので小さいケースにも使用できます。

 基板にはPICkit3を接続するためのピンヘッダを立てておきます。マイコンを実装する際にこれがあると、後々プログラムを変更する際に便利なので習慣にしています。電池ケースは基板の穴を広げてタッピングネジで固定します。

 焦電型赤外線センサもイイ感じのアルミケースに入れてやります。

 完成。左上:リードスイッチ、右上:焦電型赤外線センサ、中央:表示灯

動かしてみる

 2つのセンサを部屋の内側に、表示灯は部屋の外に取り付けました。この状態で人の移動を模擬してみると、表示灯は以下のように動作しました。設計通り、人が中にいる間だけ点灯して在室を表示します。

  1. 部屋に誰もいない→消灯
  2. 部屋の中に入る→点灯
  3. 扉を閉める→点灯
  4. しばらくじっとしている→点灯
  5. 部屋から出る→消灯

 これをトイレに設置すればもう赤外線ダンスをする必要がなくなるでしょう。

ソースコード

【開発環境】
ライタ:MPLAB X IDE
コンパイラ:XC8 Compiler
書き込み器:PICkit 3

// PIC12F1822 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT is running and disabled in Sleep)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON        // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF       // PLL Enable (4x PLL enabled)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF         // Low-Voltage Programming Enable (Low-voltage programming enabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>

#define Dopen RA2  //リードスイッチ(開扉で1)
#define Pyro RA4 //焦電型センサ(動体に反応で1)
#define LED RA5 //表示灯(1で点灯)

#define _XTAL_FREQ 31000



void main(){
    
    OSCCON=0b00000011;  //内部オシレータ(LFINTOSC)を使用、f=31kHz
    OSCSTAT=0b00000010; //LFINTOSCのみ使用
    ANSELA=0x00;    //すべてのピンをデジタルI/Oピンに設定
    TRISA=0b00010100;   //RA2,RA4を入力、それ以外は出力に設定
    OPTION_REG=0b01111111; //内部プルアップを許可
    WPUA=0b00000100;   //RA2を内部プルアップ

    PORTA=0;

    //焦電型センサ安定のため電源投入時に30秒待機
    char wait=0;
    while(wait<60){
        LED=~LED;
        __delay_ms(500);
        wait++;     
    }
    
    while(1){
        
        //扉が開くと表示灯は焦電型センサの反応に連動する。
        while(Dopen==1){
            __delay_ms(500);
            if(Pyro==1){
                LED=1;
            }else{
                LED=0;
            }
        }
        
        /*もし閉扉中に人の動きを検知すれば、
         *室内に人が入ったみなして「在室」状態を固定する。
         */ 
        while(Dopen==0){
             __delay_ms(500);
             if(Pyro==1){
                 LED=1;
             }
             }
        }
    }
タイトルとURLをコピーしました