syouwa-taroのアイコン画像

オムツがぬれているか服の外から検出する

syouwa-taro 2021年02月20日に作成

オムツがぬれているか服の外から検出する

#はじめに
赤外線センサーを使い、オムツの濡れを検出してみた。服の上からでも検出可能であった。応用として洗濯ものの乾きを検出する実験も行い、わずかに検知することができた。

仕組み

赤外線センサ―(Thermopile)でオムツから出る赤外線を検出し、ぬれていると温度が下が事を検出する。
ただし外気温 体温 服装などで絶対的なぬれている温度は決まらず単純に検出は困難である。
今回はセンサーを上下に首振り移動させ温度変化を計測し、温度変化があればおむつがぬれていると判断し検出している。実際に実験してこの方法が一番検出しやすかった。センサーのデバイスはマイクロ波 焦電デバイ Theropile等を比較したが、マイクロ波は感度がとれず、焦電デバイスは値段も感度も良かったがエラーが多く、安定して検出できる高価(2千円)なthermopileを使用。

動作

スタートSWを押すとPIC16F88によりOPアンプで増幅したThermopileの電圧を読み込み、同時にサーボを動かすPWMを発生させサーボに取り付けたsensor boardを上下首振りして往復させ温度変化を計測し、ぬれている判断をするとLEDを点灯。

その他

サーボを動かすには電力が必要で、専用の単3X3本を追加している。
PICのCコンパイラーが不安定(なにか変更を加えると動かなくなりバージョン変更でも動かなくなることがある(>_<))でアセンブラ作成。

主な材料

マイコン      PIC16F88
Thermopile    OTP537F2
OPアンプ      LM358
サーボモーター   PICO STD
電源SW
検出スタートタクトSW
マイコン用5Vレギュレーター
検出表示LED
006Pスナップ
単3 3本 電池ホルダー

オムツぬれたかな中身

回路図

オムツぬれたかな

ここに動画が表示されます

結果と考察

実験ではそこそこあかちゃんぬれたオムツの検出がパジャマの上からでもできたが、実施のfieldでは、やはり感度不足で実用で役に立つまではまだ一工夫必要であった。
ぬれたオムツ検出は介護施設でも有効で、今回原理と有効性が確かめられ最近の精度の良いサーモグラフなどを用いる事によりサーボも不要でコンパクトで精度の良い2号機にもチャレンジしてみたい。別件ですが、サーボがギーーと音を立てて検出する様は、工作としては成功でした。

ソースコード

オムツぬれたかな

;****************************************************************************************** ; 電圧計サンプル ; Program Name :oonoおむつサーモパイル電圧検出 ; Programer : ; Create date : Version 1.0 2015.11.10 ; History : ;****************************************************************************************** ; (0)Display ; 7 Segment Diode ( Anode common type ) ; 内部オシレータを使用する ; (1)Descript I/O ; B0~B6 : 7 Segment diode (a~g) ; B7,A1 : ADC Input (Analog Input) A1:温度電圧入力14pin ; A0 : Alarm LED出力  A0:13pin ; A7 : Input Mode omutu scan 開始キー入力 A7:12pin ;****************************************************************************************** LIST P=PIC16F88 INCLUDE "P16F88.inc" __CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO __CONFIG _CONFIG2 , _IESO_OFF & _FCMEN_OFF ADANSL EQU 3AH ;AD 左レジスタ MSB~ 左詰で8ビット ADANSR EQU 3BH ;AD 右レジスタ ~LSB 左詰で2ビット ADANSRR EQU 3EH ADANSRRR EQU 3FH ADDIFSUM EQU 40H CHKCNT EQU 41H ;現在のチェック位置  050hポイントx往復 CHKCNTW EQU 42H CNTPMH EQU 43H CNTPML EQU 44H CNTWT EQU 45H CNTWT3 EQU 46H GORT EQU 47H ;BIT0往復フラグ 0往PWM増加  1復PWM減少 ;BIT1キーフラグ 0なし 1あり 1往復=2周するまで保持 ;BIT2気温Save 0まだ 1済 ADKION EQU 48H ;基準温度=気温 CNTWT4 EQU 49H ;気温測定 安定時間 0E0h=1.8msX128=2秒 ADMINP EQU 4AH ;過去Minimum ;ADMINN EQU 4BH ;新しいMinimum候補 HANTHI EQU 4CH ;気温よりおむつ温度高い時の判定範囲 ORG 0 GOTO START ORG 4 GOTO START START ; Bank0での設定 BANKSEL PORTA ; PortAのBankを選択する(Bank0 ※PortBは0,2,3にあるので指定注意) CLRF PORTA ; PortAの初期化(Bank0) CLRF PORTB ; PortBの初期化(Bank0,1,2,3) MOVLW 070h ;01c=60°###############サーボinit=180°:050hセッ####################ト MOVWF CHKCNT ; MOVWF CNTPMH CLRF CNTPML ;0だとdecfszでマイナスになりSKIPしないBUG INCF CNTPML,1 CLRF GORT ; B2:気温Saveフラグ まだ0 済1 B1:連続キーフラグ なし0  B0:往復フラグ 往0 MOVLW 0FFh ;minデータ 最初はダミーでOFFhをいれておく MOVWF ADMINP ; Bank1での設定 BANKSEL ANSEL ; ANSELのBankを選択する(Bank1) MOVLW B'01111110' ;内部OSC選択,内部OSCに4MHzを選択 MOVWF OSCCON MOVLW B'01000010' ;AN6(RB7),AN1(RA1)をAnalog-Input, 他をDegitalに設定 MOVWF ANSEL ; Degital Inputに設定(Bank1) MOVLW B'10100010' ;B'00100010' MOVWF TRISA ; PortAのI/O設定(Bank1) 17pinA0:温度電圧入力  16pinA7:おむつ測定開始キー入力 MOVLW B'10000000' MOVWF TRISB ; PortBのI/O設定(Bank1) MOVLW B'00000000';左詰 B'10000000'7(ADFM):10Bitを右詰めで得る,6:?(どっちでも),5-4:ReferはVoltage-GND,3-0:None MOVWF ADCON1 ;(Bank1) ; Bank0に戻す BANKSEL PORTA ; PortAのBankを選択する(Bank0 ※PortBは0,2,3にあるので指定注意) ; デモ表示 MAIN ;CALL DEMO0 ; 電源投入時に7-Segment Displayが正常に点灯するか確認する(約5秒) ;CALL DEMO1 ; デモを表示する(約10秒) ;(1)電圧計モード MADIN CALL KEY ;16pinRA7:startkey in CALL DSPA ;18pinRA1:thermovolt in 17pinRA0 AlarmLEDout CALL PWM ;1pinRA2:pwm out GOTO MADIN ;****************************************************************************************** ; Function Name : KEY ; Disctiption : 測定開始キー入力 (normalH) ; Input : 16pinRA7:startkey in ;****************************************************************************************** KEY BANKSEL PORTA ;BANK0を選択する ;BTFSS GORT,2 ;temp FLG チェック ;CALL TEMP ;まだなので温度Save BTFSC PORTA,7 ;A7:12pin スキャン開始キー入力L:ON H:OFF RETURN ;なし そのままぬける なしでも往復終わるまで連続フラグHのままにする Normal H BTFSC GORT,1 ;連続キーフラグチェック RETURN ;連続キーフラグHなのでそのままぬける BSF GORT,1 ;初めてのキーなので連続キーflg set BCF GORT,0 ;初めてのキーなので往復フラグ 往:0 set MOVLW 070h ;020hサーボ60度############scan start initalize050h#################### MOVWF CHKCNT ;Scan start 位置 MOVWF CNTPMH ;PWM dutyHstart 位置:050h ;CLRF CNTPML ;PWM dutyLstart 位置:000h⇒001でないとdecでfffと誤動作 CLRF ADDIFSUM ;初めてのキーなので積算0とする RETURN ;****************************************************************************************** ; Function Name : DSPA ; Disctiption : A端子の電圧を表示する ; Input : 18pinRA1:thermovolt in 17pinRA0 AlarmLEDout ;****************************************************************************************** DSPA BANKSEL PORTA ;BANK0 セット ; 気温Saveされているか BTFSS GORT,2 ;気温フラグ CALL TEMP ;0なのでSave(2秒間待つ) ; 連続キー状態か調べる 連続キー:Lならばなにもしないで戻る BTFSS GORT,1 ; RETURN ;連続キーF:Lなのでなにもせず戻る ; (1)A端子の電圧を得る 入力電圧計算 CALL GETVA CALL GETVA ; 電圧を10⇒8(adresH ⇒ adresL(MSB8BIT)+2(LSB2BIT delete))にシフトして短縮 BANKSEL PORTA ; BANK0を選択する ; Minimum電圧を比較して探す ;MOVF ADMINP,0 ;過去MINデータ =W ;SUBWF ADANSL,0 ;今回データ - 過去MINデータ= W ;BTFSC STATUS,C ;負の時 C=0 正の時C=1先回>今回=減少 skip ;GOTO SOKKAI ;今回が大きいのでMINそのままで判定する必要なし 回数カウントへ ;MOVF ADANSL,0 ;minデータNew入れ替え ;MOVWF ADMINP ; 基準温度以下を積算する ; 基準温度と基準温度以下との差を積算する 前に気温ADKIONより高い電圧は加算しない  MOVF ADANSL,0 ;Scan計測電圧=W SUBWF ADKION,0 ;気温ー計測=W BTFSS STATUS,C ;気温より計測が高ければ差を加算しない  CLRW ;負=C=0=気温より高いので加算=W=0とする ; 基準温度と低い方の温度計測との差を積算    *GUGENDEMOスタート電圧と比較して高ければ積算しない=濡れていない可能性大きいので・・ ADDWF ADDIFSUM,1;W(差)+先回までの積算=今回までの積算 ; omutu 判定 MOVLW 080h ;###########判定値=20h以上 ぬれた!!############ SUBWF ADDIFSUM,0 ;積算ー判定値W BTFSC STATUS,C ;ぬれた=正:C=1 CALL ALMON ;積算オーバー AlarmLED ON ; omutu 判定 ;SUBWF ADKION,0 ;気温ーMIN=W ;BTFSC STATUS,C ;C=1 ぬれた=正=気温より低い  C=0 気温より高いので濡れた再度判別行う ;GOTO ALMON ;AlarmLED ON ;MOVWF HANTHI ;判定範囲のチェク ;COMF HANTHI ;補数で範囲わかりやすく0 ~ ** ;#############判定範囲を**Hとする ;MOVLW  006h ;SUBWF HANTHI,0 ;BTFSS STATUS,C ;正:範囲外  負:範囲内0~10h ; GOTO ALMON ;AlarmLED ON ; 測定回数終了? SOKKAI DECFSZ CHKCNT ; RETURN ;チェック回数途中 MOVLW 070h ;###########020hサーボ60度戻り不連続でにすAC変化強める##CHKCNTM=0A0h ;チェック回数設定 100回:20msx100=2秒周期#### MOVWF CHKCNT ; BTFSS GORT,0 ;往復フラグ 0往PWM増加  1復PWM減少 GOTO RTSET ;往終了 復セット BCF GORT,0 ;往復終了 往セット=0 BTFSC PORTA,7 ;scan開始キー入力L確認 あり:連続キーフラグ1のまま なし:連続キーグラグ0でPWM停止 BCF GORT,1 ;連続キーフラグ=0 往復終了しキー入力ないのでPWM停止  CALL ALMOFF ;回数終了 LEDOFF MOVLW 0FFh ;minデータ 最初はダミーでOFFhをいれておく ;MOVWF ADMINP CLRF ADDIFSUM ;念のため積算0設定 RETURN RTSET BSF GORT,0 ;往終了 復セット=1 MOVLW 070h ;020hサーボ60度############scan start initalize050h#################### ;MOVWF CHKCNT ;Scan start 位置 MOVWF CNTPML ;PWML dutyLstart 位置:050h ;CLRF CNTPMH ;PWMH dutyHstart 位置:000h decfszで誤動作 001hとする RETURN ;****************************************************************************************** ; Function Name : GETVA ; Disctiption : A端子の電圧を得る ; Input : なし ; Output : ADANSL,ADANSR ;****************************************************************************************** GETVA BANKSEL PORTA ; BANK0を選択する ; ADCON0[7:6] サンプリング周波数;Fosc/32(OSC周波数の1/32:最も遅い設定) ; ADCON0[5-3] Chanel-1(AN1)を選択 ; ADCON0[2] Go/Done ; ADCON0[1] None ; ADCON0[0] A/D-Converter ON MOVLW B'10001101' MOVWF ADCON0 ;(Bank0) GETVA1 BTFSC ADCON0,2; ADCの開始フラグが完了するまで待つ GOTO GETVA1 ; ADCの開始フラグが完了するまで待つ MOVFW ADRESH ; 左詰上位8ビットデーター収集   **上位2ビットデータ収集(Bank0) MOVWF ADANSL ; 左詰上位上位8ビットデーターをLeftに代入  **2ビットデータ代入 ;BCF STATUS,C ; ;RRF ADANSL,1 ; BANKSEL ANSEL ; Bank1を選択する MOVFW ADRESL ; 左詰下位2ビットデーターを収集 **下位8ビットデータ収集(Bank1) BANKSEL PORTA ; BANK0を選択する MOVWF ADANSR ; 左詰下位2ビットデーターをRightに代入**下位8ビットデータ代入 RETURN ;****************************************************************************************** ; Function Name : ALMON ; Disctiption : Alarm LED 点灯 ; Input : なし ; Output : W:0FFh PORTA0:H ;****************************************************************************************** ALMON BANKSEL PORTA ;BANK0を選択する BSF PORTA,0 ;Alarm LED ON ;GOTO SOKKAI RETURN ;****************************************************************************************** ; Function Name : ALMOFF ; Disctiption : Alarm LED 消灯 ; Input : なし ; Output : W:000h PORTA0:L ;****************************************************************************************** ALMOFF BANKSEL PORTA ;BANK0を選択する BCF PORTA,0 ;Alarm LED OFF RETURN ;****************************************************************************************** ; Function Name :TEMP ; Disctiption : 気温をSave ; Input : なし ; Output : 気温=ADKION ;****************************************************************************************** TEMP BANKSEL PORTA ;BANK0を選択する BSF PORTA,0 ;Alarm LED ON 気温測定中表示 MOVLW 0E0h ;1.8秒X128=2秒 MOVWF CNTWT4 TEMP1 CALL WT1MS3 ;18mswait DECFSZ CNTWT4 GOTO TEMP1 ; AD気温電圧=気温基準ブロック電圧 をADKIONにSave ; (1)A端子の電圧を得る 入力電圧計算 CALL GETVA CALL GETVA BANKSEL PORTA ; BANK0を選択する MOVF ADANSL,0 ;AD 左(MSB8BIT) ⇒ W MOVWF ADKION ;気温基準save BSF GORT,2 ;temp save flg set BCF PORTA,0 ;Alarm LED OFF RETURN ;****************************************************************************************** ; Function Name : PWM ; Disctiption : サーボPWMOUT for PICO-STD(GWS) 20ms周期  min ; Input : なし ; Output : PORTA2 ;****************************************************************************************** PWM ;minimum front 1ms:H BANKSEL PORTA ;BANK0指定 BTFSS GORT,1 ;連続キーフラグ確認 RETURN ;連続キーフラグないのでPWM出さずにぬける BSF PORTA,2 ;PWML ⇒ H CALL WT1MS ; 1mswait サーボPWMミニマムパルス幅 ;servo 位置パルスからON・duty パルスをつくる 0~1ms:H MOVF CHKCNT,0 ;現在のcheck位置をWにLoad BTFSC GORT,0 ;往復チェック 0往  1復 GOTO PWM1RT ;復 DUTYONOF MOVWF CNTPMH ;往 フレーム内のPWMH時間:dutyon SUBLW 071h ;070hだとCNTPML=0でdecfszで誤動作 020hサーボ60度#########PWM(max:CHKCNTM/2)ーPWMH時間=PWML時間####### MOVWF CNTPML ;フレーム内のPWML時間:dutyoff=CNTPML ;BSF PORTA,2 ; ;ON・duty パルスをつくる  0~1ms:H 位置パルスdutyoff 1~0ms:L PWM1 CALL WT1MS2 DECFSZ CNTPMH,1 ; GOTO PWM1 ; BCF PORTA,2 ;PWMH ⇒ L ;OFF・duty パルスをつくる  0~1ms:H 位置パルスdutyoff 1~0ms:L PWM2 CALL WT1MS2 DECFSZ CNTPML,1 ; GOTO PWM2 ; BCF PORTA,2 ;PWML ⇒dutyon/off終了:1ms幅 残り18msPWML PWM3 CALL WT1MS3 RETURN ;PWM 1フレーム終了 ;復PWM出力 PWM1RT MOVWF CNTPML ;復フレーム内のPWML時間:dutyoff=CNTPML SUBLW 071h ;070hだとCNTPML=0でdecfszで誤動作020hサーボ60度########PWM(max:CHKCNTM/2)ーPWMH時間=PWML時間####### MOVWF CNTPMH ;復 フレーム内のPWMH時間:dutyon ;BSF PORTA,2 ; GOTO PWM1 ;復 DutyON/OFF H・Lを往と逆転 ;****************************************************************************************** ; Function Name : WT1MS ; Disctiption : WAITする(1ms程度、PWMミニマムパルス) ; Input : なし ;****************************************************************************************** WT1MS MOVLW 0E0h ; 1msWait 0E0:800 0D0:720μS  0C0:650 0B0:620 050:240 NG 0A0:560 MOVWF CNTWT ; WT1MS1 NOP NOP NOP NOP DECFSZ CNTWT,1 GOTO WT1MS1 RETURN ;****************************************************************************************** ; Function Name : WT1MS2 ; Disctiption : WAITする PWMの変化幅(0.01msx100ポインt=⊿1ms程度、PWM ONdutyパルス) ; Input : なし ;****************************************************************************************** WT1MS2 ;MOVLW 001h ; 002h0.005mswait servo90°動作遅い  008h0.01msWait/sample050h servo180° ;MOVWF CNTWT ; WT1MS2J ;NOP ;NOP ;DECFSZ CNTWT,1 ;GOTO WT1MS2J RETURN ;****************************************************************************************** ; Function Name : WT1MS3 ; Disctiption : WAITする PWMの変化しない後半(18ms程度、PWM OFFdutyパルス) ; Input : なし ;****************************************************************************************** WT1MS3 MOVLW 0F0h ; 18msWait 0F0h:周期19.9ms MOVWF CNTWT ; WT1MS3J MOVLW 033h MOVWF CNTWT3 WT1MS3JJ DECFSZ CNTWT3,1 GOTO WT1MS3JJ DECFSZ CNTWT,1 GOTO WT1MS3J RETURN END

参考文献

サーモパイルの応用
PIC16F88割り込みでサーボをうごかす

2
ログインしてコメントを投稿する