人体(焦電型赤外線)検出ユニットV2

以前にも、人体(焦電型赤外線)検出ユニットを作成しましたが、今回は、焦電型赤外線センサの信号を増幅するアンプ(LM386)を1個のみ使用し、増幅率を200倍にしてみました。前回は2個使用で400倍でした。

以下の処理を繰り返します。

  • 焦電型赤外線センサの信号をLM386で200倍に増幅する。
  • 増幅された電圧を、PICのA/D変換で取り込み電圧換算する。
  • 取り込んだ電圧をLCDに表示させる。(数値表示とバー表示)
  • 取り込んだ電圧が前回の電圧に比べ50mV以上変化(相対値比較)しているかを計算する。
    ※通常はボリュームを取り付けて、比較用のアナログデータとし、その電圧と先程取り込んだ電圧を比較
    する絶対値比較が行われますが、調整が煩わしいので相対値比較方式を採用しました。
  • もしも変化していれば、500msecの間、LED点灯、ブザーON、LCDに“*”マーク表示をする。
  • 100msecスリープする。

※感度の調整は、50mVの値を修正することにより行います。

  • 感度を上げるには、50mVの値を小さくします。
  • 感度を下げるには、50mVの値を大きくします。

humanSensor2.c
//********************************************************************** 
/*
  『人体検出(焦電型赤外線センサ)』 
*/
//********************************************************************** 
 
#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(手前)になります。

焦電型赤外線センサは、赤外線集光レンズを取り付けると感度が良くなります。
このレンズを取り付けると、検知距離は20~30mくらいになるそうです。

左:検出前
右:検出後

著作権表示 copyright notice

このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。詳細
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.Details
  • elechobby/picdic/pic16f88/76.txt
  • 最終更新: 2025/10/17 14:29
  • by 127.0.0.1