防犯アラーム(振動検知)
概要
一戸建て住宅の空き巣の侵入経路で一番多いのは、窓からの侵入だそうです。
そこで、窓からの侵入の防犯対策として、ドアや窓の振動を感知して警報機(ブザー、LED等)が作動する装置を製作しました。
<仕様>
- 3方向(XYZ)の振動を検出可能とします。
- 振動の検出感度は、2段階(高低)に切り替え可能とします。
- 警報は、光(LED)と音(ブザー)で知らせます。
- 電池2本で動作可能とします。
動作原理
3方向(XYZ)の揺れの検出には、加速度センサー(KXM52)を使用します。
加速度センサーの詳細については、XYZ加速度(ガル)表示ユニットをご覧下さい。
<警報レベル>
無振動時のセンサー出力電圧に対して、振動時のセンサー出力電圧が、ある一定の値を超えた場合に、警報レベルに達したものとします。
<感度切り替え>
警報レベルの2段階(高感度、低感度)切り替えは、無振動時電圧と振動時電圧の差分の大小で行います。
PICのA/D変換は、10ビットなので出力値として、0~1023の値を得ることが出来ます。
そこで無振動時電圧(V1)と振動時電圧(V2)より、次式で感度を切り替えます。
高感度=(V2-V1)>10
低感度=(V2-V1)>100
感度切り替えは、起動時のスイッチ(SW1)状態を判断することにより行います。
高感度モード=SW1がオン(Vss接地)
低感度モード=SW1がオフ(Vdd接地)
<ブザー音>
PIC内臓のCCPモジュールをPWMモードで使用し、1kHzの信号(矩形波)を発生させ、圧電スピーカを駆動することにより、ブザー音を発生させます。
回路図
ソースコード
- vibrationDetect.c
//********************************************************************** /* 「防犯アラーム(振動検知)」 */ //********************************************************************** #define LED GPIO.F5 #define SW GPIO.F3 //********************************************************************** void Pwm_Change_DutyEx(unsigned int duty_ratio) { CCPR1L = duty_ratio >> 2; CCP1CON.DC1B0 = duty_ratio & 0b00000001; CCP1CON.DC1B1 = (duty_ratio & 0b00000010) >> 1; } //********************************************************************** unsigned long measurement(unsigned short channel) { static unsigned int cnt; static unsigned long ad; // ad = 0; for (cnt = 0; cnt < 10; cnt++) { ad += Adc_Read(channel); } return (ad / 10); } //********************************************************************** double offset_x, offset_y, offset_z; void initKXM52() { LED = 1; // offset_z = (double)measurement(0); // offset_y = (double)measurement(1); // offset_x = (double)measurement(3); // LED = 0; } //********************************************************************** void alarm() { static short cnt; // for (cnt = 0; cnt < 10; cnt++) { LED = 1; Delay_ms(100); Pwm_Start(); LED = 0; Delay_ms(100); Pwm_Stop(); } } //********************************************************************** void main() { static double ad_z, ad_y, ad_x; static int limit; // OSCCON = 0b01110000; // クロックを8Mhzに設定する。 CMCON0 = 0b00000111; // コンパレータは使用しない。 ANSEL = 0b00011011; // A/D変換を使用する。 TRISIO = 0b00011011; // Pwm_Init(1000); // 1kHz duty=50% Pwm_Change_DutyEx((PR2 * 4) / 2); Pwm_Stop(); //感度設定 limit = 100; if (SW == 0) { while (SW == 0) { LED = 1; Delay_ms(50); LED = 0; Delay_ms(50); } limit = 10; } // Delay_ms(1000); initKXM52(); // while (1) { ad_z = measurement(0); ad_y = measurement(1); ad_x = measurement(3); // if (labs(ad_z - offset_z) > limit) { alarm(); } if (labs(ad_y - offset_y) > limit) { alarm(); } if (labs(ad_x - offset_x) > limit) { alarm(); } // while (SW == 0) { initKXM52(); Delay_ms(50); } } } //**********************************************************************




