人体(焦電型赤外線)検出ユニット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); } } //**********************************************************************




