【RaspberryPi】 人感センサーを使って検知したことをプログラムで出力する

# -
毎日試しては更新するように心がけます:walking_tone1:

# この記事について
今回はRaspberryPのスターターキットを購入したので色々と遊んでみる
OSOYOO(オソヨー) Raspberry Pi... https://www.amazon.jp/dp/B01M6ZFNSS?ref=ppx_pop_mob_ap_share


まずは人感センサー
ラズパイに人感センサーを繋いで赤外線で人、物を検知する。
それをプログラム上に出力する。

ネットの記事を何個か見て試してみたが上手くいかず少しつまずいた

# 動作環境
- Raspberry Pi Model B+
- Python3.7.4

# 用意するもの
- Raspberry Pi Model B+
- 電源アダプター（5V/3000mA）
- 人感センサー(HC-SR501 PIR motion sensor)
- ジャンパワイヤ 3本

## センサー
![sensor.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149008/fb9125da-7e93-4c38-6c21-d2b8ea7b4ed9.jpeg)


|       |       |
|:------------------:|:------------------:|
|       動作電圧       | DC5V - 12V |
|       出力       | LOW - 0V , HIGH - 3.3V |
|        遅延時間        | 調整可能 (0.3-18秒) |
|         遮断時間         | 0.2秒 |
|       検出範囲       | 7m未満 120度未満 |
|      動作温度      | -15 ~ 70度 |
| トリガーモード | LOWは繰り返し× |

トリガーモードがよく理解できなかった
自分なりの解釈は

*遅延時間が5秒の場合*
LOWは、検知し遅延時間中にさらに検知してもその検知はトリガーされない

HIGHの場合は検知し遅延時間中にさらに検知したら
直前に検知した遅延時間がトリガーされる

うまく説明できないので
![10443648-A0CB-44D4-B2BE-0B45ACFDD07F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149008/977e628f-b1e2-9a20-dc5e-125107561651.jpeg)

要するにLOWは延長してくれないけどHIGHは延長してくれるっていう理解でいいのかな

はい、次

# プログラムを書く

```human_sensor.py
import RPi.GPIO as GPIO
import time

PIN = 14

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN, GPIO.IN)

try:
    print ('-----Start-----')
    n = 1
    while True:
        if GPIO.input(PIN) == GPIO.HIGH:
            print("{}".format(n) + "回目検知")
            n += 1
            time.sleep(2)
        else:
            print(GPIO.input(PIN))
            time.sleep(2)
except KeyboardInterrupt:
    print("Cancel")
finally:
    GPIO.cleanup()
    print("-----end-----")
```


# 感度、遅延時間の調節

少しいじってみた感じ感度調節の方はあまり差がわからなかった
けど手をかざせばほとんど反応するから精度は悪くないと思う。

問題は遅延時間

![118643BF-B510-4CB1-8939-5F45E874393B.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149008/8c6d3085-975d-34e0-4a66-01f45afbcd43.jpeg)

遅延時間の範囲は0.3秒-18秒。

試しに写真の位置に合わせて測ってみようと思い計測(だいたい5-7秒くらいかなーと予測)

結果…
*56秒*

あまり意味がわからなかったのでとりあえず左に回してもう一度計測(数値で言えば0の状態)

結果は遅延無し
これは思ったように動いた。

…
…

# 計測する

|||
|:-----------------|------------------:|:------------------:|
| 1回目|        56秒        |
| ２回目|        52秒        |
| 3回目|        56秒        |
| 4回目|        55秒        |
| 5回目|        52秒        |
| 6回目|        56秒        |
| 7回目|        55秒        |
| 8回目|        52秒        |
| 9回目|        51秒        |
| 10回目|        56秒        |

計測してもよくわかんないけど大体50秒-56秒遅延されてた。
ちなみに途中で計測は終了したが右にいっぱい(数値で言えば100の状態)回して止めた時点では2500秒(41分)だった。
もしかしたら途中で誤検知してしまったかもしれないがさっきの写真くらいの位置で平均して50秒だったら右いっぱい回したら永遠に検知状態かも。


＊なぜこうなるのかわかる方がいれば是非教えてください:bow_tone1:

# 動かしてみる

![human_sensor_ブレッドボード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149008/13f91c4f-505f-3545-0fc3-c237224bf9f2.jpeg)

**追加**
ジャンパワイヤ +2本
ブレッドボード
抵抗 220Ω
LED 2V 10mA


| ピン | ポート |  |
|:-----------------|------------------:|:------------------:|
| 2 | 5V | 5V(OUT) |
| 6 | GND | GND |
| 8 | 14 | 制御(UCC) |
| 10 | 15 | 制御(UCC) |
| 14 | GND | GND |



わかりやすいように指を検知したらLED光らせてみる

＊LEDの光らせ方は[前回の記事](https://qiita.com/kazuppp/items/fa895c81dffc80042be5)に書いてます。

```human_led_sensor.py
import RPi.GPIO as GPIO
import time

PIN = 14
LED = 15 # 追加

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN, GPIO.IN)
GPIO.setup(LED, GPIO.OUT) # 追加

try:
    print ('-----Start-----')
    n = 1
    while True:
        if GPIO.input(PIN) == GPIO.HIGH:
            print("{}".format(n) + "回目検知")
            GPIO.output(LED, GPIO.HIGH) #　追加
            n += 1
            time.sleep(2)
            GPIO.output(LED, GPIO.LOW)　# 追加
        else:
            print(GPIO.input(PIN))
            time.sleep(2)
except KeyboardInterrupt:
    print("Cancel")
finally:
    GPIO.cleanup()
    print("-----end-----")

```
検知してから２秒後にLEDを消すようにした。

こんな感じ

![212855F5-0EEA-4AF6-8E7B-AA147C387292.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149008/e7c4a65c-2bcd-ab79-3225-5a71346d641b.gif)

# まとめ

- 多少反応は悪いがある程度検知する
- 遅延時間が上手く動かなかったがそれ以外はある程度動いた
- 調べてる段階では難しくてできるかなーと思ってたけど実際に動かしてみたらつまずきはしたがやり切れた。

今度は監視カメラのように物体を検知した時にカメラを起動して写真をとるようにしたい。

# 参考記事

[OSOYOO-HC-SR501 PIRモーションセンサー](http://osoyoo.com/2017/05/27/hc-sr501-pir-motion-sensor/)
[OSOYOO-Raspberry Piで人体感知センサーモジュールを作動し、LEDを点灯する](http://osoyoo.com/2017/03/15/raspberry-pi%E3%81%A7%E4%BA%BA%E4%BD%93%E6%84%9F%E7%9F%A5%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E4%BD%9C%E5%8B%95%E3%81%97%E3%80%81led%E3%82%92/)