目次
- 作品の目的
- 準備するもの
- こぐまのトンピーの準備・回路作成
- 赤外線カメラの動作確認
- Opencvのインストール
- コードの作成
- スマホアームを取り付ける
- 参考にしたサイト
作品の目的
家族のいびきがうるさくて眠れない日々。いびきは仰向けで寝ると舌が喉の奥に下がり気道が圧迫され、かきやすくなります。そのため、就寝中の頭上に赤外線カメラを設置し、顔認識した際に音を鳴らすことで、いびきをかくのを予防する作品を作成しました。なお、音を鳴らす機能にはこぐまのトンピーを使用します。
準備するもの
・ Raspberry Pi4 ModeB
・ こぐまのトンピー
・MOSFET
・ ブレッドボード
・ワニ口クリップ
・ 抵抗(220Ω)
・ 電池ボックス(単3電池2本)
・ジャンパー線
・赤外線カメラ
・フレキシブルスマホアーム(ダイソー)
こぐまのトンピーの準備・回路作成
①こぐまのトンピーの端子を取り出す
トンピーが座っている切り株の底面にある2つのネジを外して、プラスとマイナスの端子を取り外します。
②回路を作成する
下記リンクを参考に回路を作成します。なお、今回は21番ポートを使用しました。
参照ページ
赤外線カメラの動作確認
Raspberry Piにカメラモジュールをセットした後、Raspberry Pi側の設定画面を開き、インターフェースのカメラを有効にして再起動します。次にターミナルに下記のコマンドを入力し、テストとして静止画を撮影します。なお、就寝時に使用するため、暗闇下でも撮影します。
// カメラが認識されているか確認する
$ vcgencmd get_camera
// 下記のように表示されればOK
$ supported=1 detected=1
// 静止画を撮影する
$ raspistill -o sample.jpg
Opencvのインストール
①顔認識の際に使用するOpencvをインストールします。
// パッケージを最新にする
$ 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
②次に顔認識するカスケードファイルをダウンロードします
下記リンクからダウンロードします。
参照ページ
コードの作成
3秒以上仰向けで寝るとトンピーが鳴るようコードを作成します。
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()
スマホアームを取り付ける
参考にしたサイト
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