文書の表示以前のリビジョンバックリンクPDF の出力全て展開する/折り畳むODT 出力文書の先頭へ この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。 ====== 人体(焦電型赤外線)検出ユニット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}} ===== ソースコード ===== <code c 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); } } //********************************************************************** </code> ===== 動作確認 ===== いつものブレッドボードで確認しました。 左側から、焦電型赤外線センサ、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}} <callout type="warning" title="著作権表示 copyright notice"> このページは稲崎様の閉鎖した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]] </callout> elechobby/picdic/pic16f88/76.txt 最終更新: 2025/10/17 14:29by 127.0.0.1