====== 人体(焦電型赤外線)検出ユニットV2 ======
===== 概要 =====
以前にも、人体(焦電型赤外線)検出ユニットを作成しましたが、今回は、焦電型赤外線センサの信号を増幅するアンプ(LM386)を1個のみ使用し、増幅率を200倍にしてみました。前回は2個使用で400倍でした。
===== 動作原理 =====
以下の処理を繰り返します。
* 焦電型赤外線センサの信号をLM386で200倍に増幅する。
* 増幅された電圧を、PICのA/D変換で取り込み電圧換算する。
* 取り込んだ電圧をLCDに表示させる。(数値表示とバー表示)
* 取り込んだ電圧が前回の電圧に比べ50mV以上変化(相対値比較)しているかを計算する。\\ ※通常はボリュームを取り付けて、比較用のアナログデータとし、その電圧と先程取り込んだ電圧を比較\\ する絶対値比較が行われますが、調整が煩わしいので相対値比較方式を採用しました。
* もしも変化していれば、500msecの間、LED点灯、ブザーON、LCDに"*"マーク表示をする。
* 100msecスリープする。
※感度の調整は、50mVの値を修正することにより行います。
* 感度を上げるには、50mVの値を小さくします。
* 感度を下げるには、50mVの値を大きくします。
===== 回路図 =====
{{:imgpaste:202004:htmikan-20200429-192021.png}}
===== ソースコード =====
//**********************************************************************
/*
『人体検出(焦電型赤外線センサ)』
*/
//**********************************************************************
#define LED PORTA.F2
//**********************************************************************
unsigned int measurement(unsigned short channel)
{
unsigned int ad, cnt;
// 電圧を50回累積測定する。
ad = 0;
for (cnt = 0; cnt < 50; cnt++) {
ad += Adc_Read(channel);
}
return (ad);
}
//**********************************************************************
void Pwm_Change_DutyEx(unsigned int duty_ratio)
{
CCPR1L = duty_ratio >> 2;
CCP1CON.F6 = duty_ratio & 0b00000001;
CCP1CON.F7 = (duty_ratio & 0b00000010) >> 1;
}
//**********************************************************************
void main()
{
static unsigned char buf[8], cnt;
static unsigned int newV, oldV, diff;
//
OSCCON = 0b01110000; // クロックは8Mhz
CMCON = 0b00000111; // コンパレータは使用しない。
// A/D変換を使用する。
ANSEL = 0b00000010;
ADCON1.VCFG1 = 0;
ADCON1.VCFG0 = 0;
// ポートを初期化する。
TRISA = 0b00111010;
TRISB = 0b00000111;
// LCDを初期化する。
Lcd_Custom_Config(&PORTB,4,5,6,7,&PORTA,0,7,6);
Lcd_Custom_Cmd(LCD_CURSOR_OFF);
Lcd_Custom_Cmd(LCD_CLEAR);
Lcd_Custom_Out(1, 1, "HumanSensor V1.0");
Delay_ms(500);
Lcd_Custom_Cmd(LCD_CLEAR);
// PWM(ブザー用)を初期化する。
Pwm_Init(1000); // 1Khz
Pwm_Change_DutyEx((PR2 * 4) / 2);
Pwm_Start();
Delay_ms(500);
Pwm_Stop();
// 変数の初期化
newV = 0;
oldV = 0;
diff = 0;
LED = 0;
//
while (1) {
// 電圧の測定
newV = measurement(1);
newV = (unsigned int)(((double)newV * 4.8828125) / 50.0);
// 電圧の表示
WordToStr(newV, buf);
Lcd_Custom_Out(1, 1, buf);
Lcd_Custom_Out(1, 6, "mV");
// 電圧のバー表示
buf[0] = 0xFF;
buf[1] = 0x00;
for (cnt = 1; cnt <= 16; cnt++) {
if ((newV / (312 * cnt)) == 0)
break;
Lcd_Custom_Out(2, cnt, buf);
}
for (; cnt <= 16; cnt++) {
Lcd_Custom_Out(2, cnt, " ");
}
// 電圧の変化のチェック(前回に比べて50mV以上の変化か?)
// 感度上げるには、50mVの値を小さくする。
// 感度下げるには、50mVの値を大きくする。
diff = (newV >= oldV) ? (newV - oldV) : (oldV - newV);
if (diff > 50) {
LED = 1;
Lcd_Custom_Out(1, 16, "*");
Pwm_Start();
Delay_ms(500);
Pwm_Stop();
Lcd_Custom_Out(1, 16, " ");
LED = 0;
}
// 電圧値の保存
oldV = newV;
// 100msecの遅延
Delay_ms(100);
}
}
//**********************************************************************
===== 動作確認 =====
いつものブレッドボードで確認しました。
左側から、焦電型赤外線センサ、LM386、PIC16F88、LED、ブザー(奥)、LCD(手前)になります。
{{:imgpaste:202004:htmikan-20200429-192119.png?500}}
焦電型赤外線センサは、赤外線集光レンズを取り付けると感度が良くなります。
このレンズを取り付けると、検知距離は20~30mくらいになるそうです。
{{:imgpaste:202004:htmikan-20200429-192134.png?500}}
左:検出前
右:検出後
{{:imgpaste:202004:htmikan-20200429-192144.png}}{{:imgpaste:202004:htmikan-20200429-192148.png}}
このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]]
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]]