文書の表示以前のリビジョンバックリンクPDF の出力全て展開する/折り畳むODT 出力文書の先頭へ この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。 ====== 簡易近接スイッチ(赤外線方式) ====== ===== 概要 ===== 最近の公衆トイレには、自動水洗方式が多く採用されています。 利用者が用を足して離れると、自動で水洗してくれます。 どのような仕組みなのか詳しくは分かりませんが、利用者の検出には、おそらく赤外線による近接スイッチ方式 を使用しているものと考えられます。 そこで今回は、同様の機能(近接スイッチ)を実現してみました。 センサーには、安価で入手可能な、シャープ測距モジュール「GP2Y0A21YK」を使用しました。 <GP2Y0A21YKの概観> {{:imgpaste:202004:htmikan-20200429-145021.png}} <簡易近接スイッチ(赤外線方式)の仕様> * スイッチの感応距離を自由に設定可能とします。(10cm~80cm) * 設定した感応距離以下になると、LEDが点滅し、ブザーが鳴ります。 ===== 動作原理 ===== 測距モジュール「GP2Y0A21YK」の出力電圧を常時監視し、設定された電圧以上になると、LEDおよび圧電スピーカを制御します。 ===== 動作原理(ハードウェア) ===== ◎距離の測定 「GP2Y0A21YK」は、対象物までの距離に比例(非線形)した電圧を出力するので、この電圧を利用します。 <GP2Y0A21YKの特長> * 測定距離=10~80cm * 出力=アナログ電圧出力 * 電源=4.5V~5.5V * 消費電流=30~40mA <GP2Y0A21YKのブロックダイアグラム> {{:imgpaste:202004:htmikan-20200429-145132.png?500}} <GP2Y0A21YKの特性> {{:imgpaste:202004:htmikan-20200429-145142.png?400}} ===== 動作原理(ソフトウェア) ===== ◎距離の測定 「GP2Y0A21YK」の出力電圧を、A/D変換で50回取り込み、その平均値を求め、距離電圧とします。 ◎感応距離の設定電圧(リミット) スイッチ(SW)が押下されると、その時の距離電圧をEEPROMに記録し、感応距離の設定電圧とします。 感応距離の場所に、対象物を置いてから、スイッチを押下してください。 EEPROMに記録されるので、次回起動時からは設定が不要となります。 ◎制御出力 距離電圧が、設定電圧を上回ると、LEDを点滅させ、ブザーを鳴らせます。 ===== 回路図 ===== {{:imgpaste:202004:htmikan-20200429-145225.png}} ===== ソースコード ===== <code c 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); } } } //********************************************************************** </code> ===== 動作確認 ===== 「GP2Y0A21YK」には、リード線を半田付けして、ブレッドボードに接続しています。 {{:imgpaste:202004:htmikan-20200429-145408.png?500}} 左側:距離電圧が、設定電圧以下の時は、LEDおよびブザーの制御はしません。 右側:距離電圧が、設定電圧を超えると、LEDが点滅し、ブザーが鳴ります。 {{:imgpaste:202004:htmikan-20200429-145418.png}}{{:imgpaste:202004:htmikan-20200429-145421.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/pic12f683/38.txt 最終更新: 2025/10/17 14:29by 127.0.0.1