RaspberryPi3 B+で人感センサーを作ってみた

rightです。

今回はRaspberryPi(以降ラズパイ)と集電赤外線センサーを使用して、
人感センサーを作ってみました。
人や動物など温度を持つ物体は赤外線を放出しています。
集電赤外線センサーは、この赤外線を感知して人や動物の有無を検知できるので、
人感センサーとして使用できます。

# 1.環境
### [H/W]
- Raspberry Pi3 Model B+ (以降ラズパイ)
- 集電赤外線センサー(HC-501)
- 発光ダイオード(赤) (以降LED)
- 抵抗(100Ω)
- ジャンパー線

### [S/W]
- Python3 (Ver.3.9.2)
- OpenCV2 (Ver.4.6.0)
- NumPy (Ver.1.23.1)
```
$ python3
Python 3.9.2
>>> import cv2
>>> cv2.__version__
'4.6.0'
>>> import numpy
>>> numpy.__version__
'1.23.1'
```
### ライブラリ更新手順
https://qiita.com/right_engineer/items/93041ff178c33fbc4898

# 2.基本機能
今回はRaspberry Pi3 Model B+に集電赤外線センサーを接続した。
併せて、集電赤外線センサーが反応した際に5秒間LEDを光らせ、
コンソールに検知日時を表示させた。

# 3.ハードウェア仕様
### 3.1.配線図
![infrared_sensor_circuit.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613720/572f250b-49c7-b2a3-370c-72c28fd4bf74.png)

### 3.2.解説
### [集電赤外線センサー]
集電赤外線センサーには、VCC = 5Vを入力電圧とする。
出力電圧は、Low:0V、Hi:3.3Vとなる。
出力先はラズパイのGPIO18(入力)とした。

### [LED]
LEDのカソード(-)側には抵抗100Ωを接続した。(※)
入力元はラズパイのGPIO23(出力)とした。
※LEDに接続する抵抗の抵抗値選定は3.2.1.を参照。

### 3.2.1.LEDに接続する抵抗の選択
LEDに流れる電流値、ラズパイに流れる電流値を考慮して抵抗値を選定する。
①LEDにかかる順電圧V_fを調べる。(今回使用したLEDの場合、V_f = 2.0V)
②基板側の許容電流値I_limを調べる。(ラズパイのGPIO端子の場合、I_lim = 16mA)
③LEDの順電流I_fを調べる。このとき、I_fが許容電流値I_lim以下の電流値となるように設定する。
　(今回使用したLEDの場合、データシート上、TypでI_f = 20mAであり、I_lim = 16mAを超えているため、I_f = 10mAとした。)
④電源電圧Vを調べる。(ラズパイのGPIO出力の場合、V=3.3V)
⑤下記計算式で抵抗値Rを求める。
⑥選定した抵抗を使用した際に流れる電流がI_limを超えないことを確認する。
![resi_dic_cal.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613720/7aefa09d-73e5-eea4-4fce-9193a77a05d8.png)
![circuit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613720/d4f87dc8-bf03-fb60-d626-f9da4071005a.png)
今回の場合、R = (3.3-2.0)/0.01 = 130[Ω]
今回は、130[Ω]の代わりに100[Ω]の抵抗を使用。
念の為、100[Ω]の抵抗を使用した際に流れる電流を計算してみると、
I = 1.3/100 = 0.013[A] = 13[mA]
であるため、基板側の許容電流値I_lim = 16[mA]を超えていないため問題なし。

### 3.3.データシート
使用した電子部品のデータシートは、以下から入手可能。
### 集電赤外線センサー[HC-501]
https://akizukidenshi.com/catalog/g/gM-14064/
### LED(赤)[ELEGOO Upgraded Electronic Fun Kits]
https://www.elegoo.com/products/elegoo-electronics-fun-kits-4-versions?_pos=2&_sid=35dcf3904&_ss=r

# 4.ソフトウェア仕様
### 4.1.ソースコード
```
import wiringpi as pi
import time
import datetime

SENS_PIN = 18
LED_PIN = 23

pi.wiringPiSetupGpio()
pi.pinMode(LED_PIN, pi.OUTPUT)
pi.pinMode(SENS_PIN, pi.INPUT)
print("Operating the Sencer.")

while True:
    if(pi.digitalRead(SENS_PIN) == pi.HIGH):
        dt_now = datetime.datetime.now()
        print(dt_now)
        pi.digitalWrite(LED_PIN,pi.HIGH)
        time.sleep(5)
    else:
        pi.digitalWrite(LED_PIN,pi.LOW)
        time.sleep(1)
```

### 4.2.解説
以下の通り、ライブラリを呼び出す。
・WiringPi：ラズパイのGPIOを制御するためのライブラリ
・time：プログラムの一時停止などができるライブラリ
・datetime：時刻取得などができるライブラリ
```
import wiringpi as pi
import time
import datetime
```
変数にGPIO番号を格納する。
SENS_PIN：集電赤外線センサーを制御するGPIO番号
LED_PIN：LEDを制御するGPIO番号
```
SENS_PIN = 18
LED_PIN = 23
```
GPIOを初期化する。
```
pi.wiringPiSetupGpio()
```
以下の通り、GPIOピンのモードを設定する。
・LED_PIN(18)：出力モード
・SENS_PIN(23)：入力モード
```
pi.pinMode(LED_PIN, pi.OUTPUT)
pi.pinMode(SENS_PIN, pi.INPUT)
```
集電赤外線センサーの出力がONのとき、
ターミナルに現在の時刻を表示して、
LEDを5秒間点灯させる。

集電赤外線センサーの出力がOFFのとき、
LEDを消灯させる。
```
while True:
    if(pi.digitalRead(SENS_PIN) == pi.HIGH):
        dt_now = datetime.datetime.now()
        print(dt_now)
        pi.digitalWrite(LED_PIN,pi.HIGH)
        time.sleep(5)
    else:
        pi.digitalWrite(LED_PIN,pi.LOW)
        time.sleep(1)
```

### Github URL
https://github.com/righteng/RaspPi_infr

# 5.動作確認
RaspberryPiに接続した集電赤外線センサーが物体検知した際、
ターミナル上に現在の時刻が表示され、LEDが点灯しました。
![result.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613720/efadfc1b-a40b-31f8-9b6d-c8dd9b921c98.png)