TOPMPLAB XC8編(PIC12F675)> ひとの動きを検出したら明かりを点ける(PIC12F675,XC8)


ひとの動きを検出したら明かりを点ける

(PIC12F675,XC8)

更新日2012.5.20
作成日2008.11.1


ひとの動きを検出したら明かりを点ける実験を行います。
夜間、家の前を通ると門灯が点く家がありますがそれと同じ事ができます。

実験回路
今回の実験回路です。
クロックは内部クロックを使い4MHzとしました。

GP2:NaPiOnひとの動きを検出するために、焦電型赤外線センサとアンプを内蔵したNaPiOnを使用します。また、GP2はINT割込みで使います。
GP3:Cds暗い時だけ動作させるように明るさにより抵抗が変わるCdsを接続します。
1MΩの可変抵抗で明るさの感度が調整できます。1KΩの抵抗は保護抵抗です。
GP5:高輝度LED明かり代わりに使いました。SSRを使えば商用電源(家庭のAC100V)を制御できます。
91Ωの抵抗は、電流が20mA以下になるように調整します。
GP0:可変抵抗ひとの動きが無くなっても一定時間は明かりを点けたままにしますが、この時間を可変抵抗で変えられるようにします。GP0はA/D変換で使います。
GP4:LEDデバッグ用です。(NaPiOnの状態を表示)

ブレッドボードに組んだ状態
右下の6ピンヘッダ周りと一部の抵抗は、回路図には有りませんがICSP(In-Circuit Serial Programming)用です。秋月のPICライタなどを使う場合は不要です。

仕様
プログラムの仕様は次の通りです。

  1. ひとの動きを検出したら(INT割込みが発生したら)明かりを点ける(GP5に1をセットする)
    ただし、明るい時(GP3が0の時)は何もしない

  2. ひとの動きが無くなっても、一定時間は明かりを消さない
    この一定時間は、GP0でA/D変換した値によって変更できるようにする

  3. 上記、一定時間経過後に明かりを消し(GP5に0をセット)、SLEEPモードに移行する

  4. 一定時間の基準時間はTMR0割込みで作成する

  5. SLEEPモードで無い時は、NaPiOnの状態をGP4のLEDで表示する
    (GP2の内容をGP4に出力)

この動作の主要部分をイメージ図にすると以下のようになります。


NaPiOnの動作確認
まず始めに、NaPiOnの動作を確認しておきましょう。

今回の回路を使い、以下のプログラムを動かして見て下さい。

#include "pic.h"

static void pic_init();

__CONFIG(FOSC_INTRCIO & WDTE_OFF & PWRTE_ON & MCLRE_OFF & BOREN_OFF);

main()	{
	pic_init();		// PICの初期化

	while(1) {
		GPIO4 = GPIO2;	// GP2(NaPiOn)の状態をGP4(LED)で表示
	}
}

static void pic_init() {
	CMCON = 0x07;		// コンパレータ未使用
	ANSEL = 0x00;		// AN未使用
	TRISIO = 0xCF;		// GP4,5:out
	GPIO = 0;
}
			

NaPiOnの検出範囲で手や体を動かして見て下さい。
角度や距離による違いや体の動かし方などで、NaPiOnの出力がどうなるのかが分かると思います。


A/D変換について
A/D変換については、前のページを参考にして下さい。

前のページでは可変抵抗を10KΩにしましたが、今回は50KΩに変えています。
このためアクィジション時間も長めにしました。
A/D変換の入力抵抗の推奨値は10KΩですが、精度は要求されませんので消費電流を少なくする目的で大きめの可変抵抗にしています。

プログラム

今回のプログラムはこちらです。

プログラムの各ブロックで行っている処理は以下通りです。

CONFIG設定
CONFIGは以下のように設定しています。

__CONFIG(FOSC_INTRCIO & WDTE_OFF & PWRTE_ON & MCLRE_OFF & BOREN_OFF);

クロック内部クロックでGP4,5はデジタルI/Oで使用
WDT未使用
パワーアップタイマ有効
MCLRピンMCLRは無効で、GP3をデジタル入力で使用
BOR電圧低下リセット無効
main
まずPICの初期化(pic_init)を行います。
その後、ループの中で明るさを判定し(GP3が1なら暗い)、以下を繰り返します。
<暗い時>
  1. A/D変換を行い、結果を遅延カウンタにセット
  2. SLEEPフラグが立っていたらGP4,5を0にし(消灯)SLEEPモードに移行
<明るい時>
  1. GP4,5を0にし(消灯)SLEEPモードに移行
pic_init
PICの初期化処理を行います。
・使わないコンパレータを無効にする
・GPIO4,5を出力に設定する
・A/D変換の初期設定を行う
・TMR0割込みINT割込みの初期設定を行う
intr(割込み処理)
TMR0割込みおよびINT割込みの処理を行います。
TMR0割込みの場合は、明かりを消灯するまでの遅延カウンタをカウントダウンし、0になったらSLEEPフラグを立てます。
INT割込みの場合は、遅延カウンタをリセットした後、GP3が1の場合は(暗い)SLEEPフラグを0にしてGP5に1をセット(明かりを点ける)します。
wait_60uS
プログラムループにより約60μ秒待ちます。
この時間は、A/D変換のアクィジション時間として使います。