いびきを予防する作品作ってみた

## 目次
- 作品の目的
- 準備するもの
- こぐまのトンピーの準備・回路作成
- 赤外線カメラの動作確認
- Opencvのインストール
- コードの作成
- スマホアームを取り付ける
- 参考にしたサイト

## 作品の目的
<img src="https://user-images.githubusercontent.com/117970552/203921198-c3bc80fe-85e3-4f18-ba46-40abb5dcfd4f.jpg" width="70%">

家族のいびきがうるさくて眠れない日々。いびきは仰向けで寝ると舌が喉の奥に下がり気道が圧迫され、かきやすくなります。そのため、就寝中の頭上に赤外線カメラを設置し、顔認識した際に音を鳴らすことで、いびきをかくのを予防する作品を作成しました。なお、音を鳴らす機能にはこぐまのトンピーを使用します。

## 準備するもの
・ Raspberry Pi4 ModeB
・ こぐまのトンピー
・MOSFET
・ ブレッドボード
・ワニ口クリップ
・ 抵抗(220Ω)
・ 電池ボックス(単3電池2本)
・ジャンパー線
・赤外線カメラ
・フレキシブルスマホアーム(ダイソー)

## こぐまのトンピーの準備・回路作成
①こぐまのトンピーの端子を取り出す
トンピーが座っている切り株の底面にある２つのネジを外して、プラスとマイナスの端子を取り外します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962015/5f44156c-1340-8235-2765-dbfedb67f977.png" width="50%">

②回路を作成する
下記リンクを参考に回路を作成します。なお、今回は21番ポートを使用しました。
[参照ページ][tonpy2]

[tonpy2]: https://dotstud.io/blog/arduino-nodejs-twitter-connect/

## 赤外線カメラの動作確認
Raspberry Piにカメラモジュールをセットした後、Raspberry Pi側の設定画面を開き、インターフェースのカメラを有効にして再起動します。次にターミナルに下記のコマンドを入力し、テストとして静止画を撮影します。なお、就寝時に使用するため、暗闇下でも撮影します。

```python
// カメラが認識されているか確認する
$ vcgencmd get_camera

// 下記のように表示されればOK
$ supported=1 detected=1

// 静止画を撮影する
$ raspistill -o sample.jpg
```

## Opencvのインストール
①顔認識の際に使用するOpencvをインストールします。

```python
// パッケージを最新にする
$ sudo apt-get update
$ sudo apt-get upgrade

// Opencvをインストール
$ pip3 install opencv-python

// 実行時に必要となるライブラリをインストール
$ sudo apt-get install libatlas-base-dev
$ sudo apt-get install libjasper-dev
```
②次に顔認識するカスケードファイルをダウンロードします
下記リンクからダウンロードします。
[参照ページ][cascade_file]

[cascade_file]: https://github.com/opencv/opencv/tree/master/data/haarcascades


## コードの作成
3秒以上仰向けで寝るとトンピーが鳴るようコードを作成します。

```python
import cv2
import time
import RPi.GPIO as GPIO
from time import sleep

// トンピーを鳴らすための関数
def tonpy_sound():
    
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(21, GPIO.OUT)
  
    GPIO.output(21, GPIO.HIGH)
    GPIO.cleanup()

def function():

    // 赤外線カメラを起動
    cap = cv2.VideoCapture(0)

    // 開始時間を設定
    start_time = time.time()

    while True:
        
        // 顔のカスケードファイルを使用
        cascade_file = "haarcascade_frontalface_default.xml"
        
        // カメラを起動
        cascade = cv2.CascadeClassifier(cascade_file)

        // 1フレームずつ取得する
        ret, frame = cap.read()

        // 左右を反転する
        frame = cv2.flip(frame, 1)

        if not ret:
            break

        // 画像の大きさを変更
        frame = cv2.resize(frame, (500, 500))

        // モノクロにする
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        // 顔認識を実行
        face_list = cascade.detectMultiScale(gray, minNeighbors=10)

        // 顔の部分を四角で囲む
        for (x,y,w,h) in face_list:

            red = (0,0,255)

            // 赤色の枠で囲む
            cv2.rectangle(frame, (x,y), (x+w,y+h),red, 1)

        // 顔を検出した時
        if len(face_list) > 0:

            // 経過時間を指定する
            end_time = time.time()

            // 経過時間を画面に表示する
            print(end_time-start_time)

            // 3秒経過したら，
            if end_time - start_time >= 3:

                // トンピーの再生
                tonpy_sound()

            elif len(face_list) == 0:

                // 時間を元に戻す
                start_time = end_time

        // 結果を出力
        cv2.imshow("human_body_detect", frame)

        key = cv2.waitKey(1)
        if key == 13:
            break

    cap.release()

    cv2.destroyAllWindows()

if __name__ == "__main__":

    function()
```
## スマホアームを取り付ける
ラズパイにスマホアームを取り付ければ完成!!
<img src="https://user-images.githubusercontent.com/117970552/203917232-908aeadc-7b43-46c1-bbc3-e13d533745c3.JPG" width="40%">

## 参考にしたサイト
https://dotstud.io/blog/arduino-nodejs-twitter-connect/
https://fabcross.jp/category/make/mobility/20220609_bunkai_tonpy.html
https://tora-k.com/2020/11/15/raspberrypi4-cammoj/
https://qiita.com/tnoce/items/c819c85a85c16d246be8