リモートワークでやってみたこと

こんにちは。medibaで2020年10月からManagerをやっている小林です。

この記事はmedibaのエンジニアメンバーでやっている[mediba Advent Calendar 2020](https://qiita.com/advent-calendar/2020/mediba) の8日目の記事となります。
今回はリモートワークに切り替わり、やってみようと思ってたことをを実際にやってみたので記事にしてみようと思います。

# やりたかったこと
私は現在実家に住んでいて自分の部屋で仕事をしています。
リモートワークの中、部屋で仕事をしていてちょっと怖いのが、MTG中に親が部屋に凸ってくることです。
幸いにもまだMTG中に部屋に凸られたことはありません(笑)
やりたかったことは、この突然の出来事を事前に察知できないものかということです。

# どうやるのか
今回は __Raspberry Pi__ と __人体赤外線感応モジュール__ を使用して実現しようと考えました。
__人体赤外線感応モジュール__ で人を検知したらslackに通知する仕組みとなります。
ちなみに、__Raspberry Pi__ を使うのも今回初めてです。
初心者の記事だと思って、温かい目で見守って頂けると幸いです。

# Raspberry Piの準備
先程も __Raspberry Pi__ 初心者と書きましたが、ずぶの素人なので今回はRaspberry Pi4のスターターキットを購入しました。
Raspberry Piを始めるにあたり、必要なものは揃っていたので非常に助かりました。
動画で必要な組み立てや、初回のセットアップ方法も説明してくれるので初心者にもとっつきやすかったです。
で、こちらが組み上げてたRaspberry Pi4です。

![ラズパイ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874509/d4940a4f-b26f-32b6-00bd-8459fe5743e5.jpeg)

ヒートシンクとCPUファンはシール剥がして貼るだけだったので非常に簡単でした。
これだけでものづくりしてる感が出てワクワクします(笑)
あとは、SDカードに挿して電源を入れてOSをインストールしていきます。
画面指示に従うだけだったので、今回はOSのセットアップについては割愛します。

# 人体赤外線感応モジュールを取り付ける
今回使用する __人体赤外線感応モジュール__は、HC-SR501を使用します。
値段もそんなに高くないので手を出しやすかったです。
ジャンパーワイヤー(メス-メス)も購入しております。
早速取り付けていきます。
CPUのファンにもGPIOを使っているので、__人体赤外線感応モジュール__はこんな感じで取り付けました。

![接続済み.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874509/fcdf98cc-2a14-3d49-6291-bbb153dde166.jpeg)


CPUファンの配線もあるので写真だと見づらいですが、図だとこうなります。

![ピン配置.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874509/b365ecb3-21a1-6c61-a735-ee4c21dc857f.png)

# 人体赤外線感応モジュールが動いているか確認
Raspberry Piに人体赤外線感応モジュールを取り付けたので、実際に動いているか確認します。
下記のコードをRaspberry Piに配置し、実行します。

```python:sensor.py
import time
import RPi.GPIO as GPIO

# インターバル
INTERVAL = 1

# スリープタイム
SLEEPTIME = 20

# 使用するGPIOのBCMの番号
GPIO_BCM_NO = 24

# GPIOの初期設定(BCMで指定)
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_BCM_NO, GPIO.IN)

if __name__ == '__main__':
  try:
    while True:
      # センサー感知    
      if(GPIO.input(GPIO_BCM_NO) == GPIO.HIGH):
        print("部屋に近づく人を検知")
        time.sleep(SLEEPTIME)
      else:
        print("反応なし")
        time.sleep(INTERVAL)
    except KeyboardInterrupt:
      print("終了中")
    finally:
      GPIO.cleanup()
      print("終了します")
```

### 実行コマンド

```sh
$ cd path/ファイル格納場所
$ cd python3 sensor.py
```

__人体赤外線感応モジュール__ から反応があると``GPIO.input(GPIO_BCM_NO)``の値に変化があるはずです。
手をかざすと反応があります。
この配線とコードで問題なく、人を検知できそうです。

### コマンド実行結果
コマンドを実行中はターミナルに以下の出力がされます。
人を検知した場合は、__部屋に近づく人を検知__ が出力されます。
これはセンサーに手をかざした場合に出力されたものです。

```
反応なし
反応なし
反応なし
部屋に近づく人を検知
^C終了中
終了します
```

# slackに通知する
slackに通知するためにpipで下記のプラグインをインストールします。

* slackwebをインストール

```sa
$ sudo pip3 install slackweb
```

先程のコードを下記にようにします。

```python:sensor.py
import time
import RPi.GPIO as GPIO
import slackweb

# インターバル
INTERVAL = 1

# スリープタイム
SLEEPTIME = 20

# 使用するGPIOのBCMの番号
GPIO_BCM_NO = 24

# GPIOの初期設定(BCMで指定)
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_BCM_NO, GPIO.IN)

if __name__ == '__main__':
  try:
    while True:
      # センサー感知
      if(GPIO.input(GPIO_BCM_NO) == GPIO.HIGH):
        # slackのwebhookのURLを指定
        slack = slackweb.Slack(url="https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxxxx")
        slack.notify(text="<!here> 部屋に近づく人を検知")
        print("部屋に近づく人を検知")
        time.sleep(SLEEPTIME)
      else:
        print("反応なし")
        time.sleep(INTERVAL)
    except KeyboardInterrupt:
      print("終了中")
    finally:
      GPIO.cleanup()
      print("終了します")
```

これで、__人体赤外線感応モジュール__ が人を検知すると指定したslackのチャンネルに下記の様に通知がきます。

![slack通知.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874509/df39a1a6-4d63-0bd9-ecf8-5db3b97e6d83.png)


slackの通知についてはラグがないので、リアルタイムに検知できます。
結構役に立ちそう(笑)

と思いきや、これを家に設置するとこんな感じです。

![設置.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874509/1e7a516e-6489-9b20-ae64-168b955ed1e7.jpeg)

ダサい(笑)
廊下にRaspberry Pi置きっぱなしはないですね(笑)
まだまだ改良の余地がありそうです。
人が部屋に近づくのは検知できましたが、色々調整が必要となります。。

# おわりに
今回始めてRaspberry Piを使用して作りたいものを作ってみました。
結果としてはいまいちな感じでしたが、作ってみてかなり楽しかったです。
まだ改良の余地があるので、今後も改良していこうと思います。
medibaにはサークルでこういった工作系のサークルもあります。
私も上記のサークルに所属しています。
こういった機会に触れることができるのはリモートワークで働く中でいい刺激になりました。