文書の過去の版を表示しています。


簡易近接スイッチ(赤外線方式)

最近の公衆トイレには、自動水洗方式が多く採用されています。
利用者が用を足して離れると、自動で水洗してくれます。
どのような仕組みなのか詳しくは分かりませんが、利用者の検出には、おそらく赤外線による近接スイッチ方式
を使用しているものと考えられます。

そこで今回は、同様の機能(近接スイッチ)を実現してみました。
センサーには、安価で入手可能な、シャープ測距モジュール「GP2Y0A21YK」を使用しました。

<GP2Y0A21YKの概観>

<簡易近接スイッチ(赤外線方式)の仕様>

  • スイッチの感応距離を自由に設定可能とします。(10cm~80cm)
  • 設定した感応距離以下になると、LEDが点滅し、ブザーが鳴ります。

測距モジュール「GP2Y0A21YK」の出力電圧を常時監視し、設定された電圧以上になると、LEDおよび圧電
スピーカを制御します。

◎距離の測定
「GP2Y0A21YK」は、対象物までの距離に比例(非線形)した電圧を出力するので、この電圧を利用します。

<GP2Y0A21YKの特長>

  • 測定距離=10~80cm
  • 出力=アナログ電圧出力
  • 電源=4.5V~5.5V
  • 消費電流=30~40mA

<GP2Y0A21YKのブロックダイアグラム>

<GP2Y0A21YKの特性>

◎距離の測定
「GP2Y0A21YK」の出力電圧を、A/D変換で50回取り込み、その平均値を求め、距離電圧とします。

◎感応距離の設定電圧(リミット)
スイッチ(SW)が押下されると、その時の距離電圧をEEPROMに記録し、感応距離の設定電圧とします。
感応距離の場所に、対象物を置いてから、スイッチを押下してください。
EEPROMに記録されるので、次回起動時からは設定が不要となります。

◎制御出力
距離電圧が、設定電圧を上回ると、LEDを点滅させ、ブザーを鳴らせます。

proximity_sensor.c
//********************************************************************** 
/*
  <簡易近接センサー> 
*/
//********************************************************************** 
#define BYTE    unsigned  short
#define WORD    unsigned  int
#define DWORD   unsigned  long
#define ON      1
#define OFF     0
sbit    LED     at  GPIO.B4;
sbit    SW      at  GPIO.B3;
//********************************************************************** 
WORD    measurement()
{
        BYTE    cnt;
        WORD    ad;
        //
        ad = 0;
        for (cnt = 0; cnt < 50; cnt++) {
                ad += ADC_Get_Sample(0);
        }
        return(ad / 50);
}
//********************************************************************** 
void    main()
{
	WORD    ad, limit;
	//
        OSCCON = 0b01110000;
        CMCON0 = 0b00000111;
        ANSEL  = 0b00000001;
        TRISIO = 0b00101001;
        //
        PWM1_Init(1000);
        PWM1_Set_Duty(PR2 / 2);
        PWM1_Stop();
        //
        ADC_Init();
        //
        LED = OFF;
        limit = EEPROM_Read(0);
        limit <<= 8;
        limit |= EEPROM_Read(1);
        //
        while (1) {
        	ad = measurement();
        	if (limit < ad) {
        		LED = ON;
        		PWM1_Start();
        	        Delay_ms(100);
        		LED = OFF;
        		PWM1_Stop();
        	        Delay_ms(100);
		}        	
        	if (SW == 0) {
        		limit = ad;
        		EEPROM_Write(0, (limit >> 8) & 0xFF);
        		EEPROM_Write(1, limit & 0xFF);
        	}
        }
}
//**********************************************************************

「GP2Y0A21YK」には、リード線を半田付けして、ブレッドボードに接続しています。

左側:距離電圧が、設定電圧以下の時は、LEDおよびブザーの制御はしません。
右側:距離電圧が、設定電圧を超えると、LEDが点滅し、ブザーが鳴ります。

如何でしょうか?
本スイッチは「ホームセキュリティ対策」にも、多いに役立ちそうですね!{^_^}!

  • elechobby/picdic/pic12f683/38.1588139706.txt.gz
  • 最終更新: 2025/10/17 14:27
  • (外部編集)