注釈

こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

参加する理由は?

  • エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。

  • 学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。

  • 独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。

  • 特別割引:最新製品の独占割引をお楽しみください。

  • 祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。

👉 私たちと一緒に探索し、創造する準備はできていますか?[ここ]をクリックして今すぐ参加しましょう!

4.1.4 自動撮影カメラ

はじめに

外出中に、森の中の小さなリスが窓辺を訪れるかもしれません。これらの小さなかわいらしい姿を撮影して残すための自動撮影カメラを作ってみましょう!

必要な部品

このプロジェクトでは、以下の部品が必要です。

../_images/3.1.18components.png

キット全体を購入すると非常に便利です。リンクはこちらです:

名前

このキットのアイテム

リンク

Raphael Kit

337

Raphael Kit

以下のリンクから個別に購入することもできます。

コンポーネントの紹介

購入リンク

GPIO拡張ボード

購入

ブレッドボード

購入

ジャンパーワイヤー

購入

抵抗器

購入

カメラモジュール

購入

PIRモーションセンサーモジュール

-

回路図

T-Board Name

physical

wiringPi

BCM

GPIO17

Pin 11

0

17

../_images/1.1.18_schematic.png

実験手順

このプロジェクトを始める前に、 3.1.1 写真撮影モジュール を完了させてください。

ステップ1: 回路を組み立てる。

../_images/3.1.18fritzing.png

ステップ2: カメラモジュールを接続し、設定を完了させるための参照先: カメラモジュール

ステップ3: Raspberry Pi のデスクトップに移動します。より良い経験のためには画面が必要です。参照先: Raspberry Piの接続 。もしくは、Raspberry Piのデスクトップにリモートでアクセスする詳しいチュートリアルは、 リモートデスクトップ を参照してください。

ステップ4: ターミナルを開き、コードのフォルダに移動します。

cd ~/raphael-kit/python/

ステップ5: 実行する。

sudo python3 4.1.4_AutomaticCaptureCamera.py

コードが実行されると、PIRは周囲の環境を検出し、リスが通過するのを感知すると、カメラが写真を撮ります。 写真の間隔は3秒で、撮影された写真の総数はプリントウィンドウを通じて表示されます。

PIRモジュールには2つのポテンショメータがあり、1つは感度を調整するためのもので、もう1つは検出距離を調整するためのものです。PIRモジュールをよりよく機能させるためには、両方を反時計回りに最後まで回す必要があります。

../_images/PIR_TTE.png

注釈

4.1.4_AutomaticCaptureCamera.py~/raphael-kit/python/ のパスでPythonのIDEで開き、Runボタンをクリックして実行し、Stopボタンでコードを停止することもできます。

コード

注釈

以下のコードは 変更/リセット/コピー/実行/停止 が可能です。しかし、それを行う前に、 raphael-kit/python のようなソースコードのパスに移動する必要があります。コードを変更した後、その効果を直接確認するためにそれを実行することができます。

#!/usr/bin/env python3
import time
import os
import RPi.GPIO as GPIO
from picamera2 import Picamera2

# ----------------------------
# USER DIRECTORY
# ----------------------------
user = os.getlogin()
user_home = os.path.expanduser(f'~{user}')

# ----------------------------
# GPIO SETUP
# ----------------------------
PIR_PIN = 17  # PIR motion sensor connected to GPIO17

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

# ----------------------------
# CAMERA SETUP
# ----------------------------
camera = Picamera2()
camera.start()

print("Motion detection started. Press Ctrl+C to exit.")

# ----------------------------
# MAIN LOOP
# ----------------------------
try:
    i = 1
    while True:
        if GPIO.input(PIR_PIN) == GPIO.HIGH:
            filename = f"{user_home}/capture{i}.jpg"
            camera.capture_file(filename)
            print(f"Motion detected. Saved image #{i}: {filename}")
            time.sleep(3)
            i += 1
        else:
            print("waiting")
            time.sleep(0.5)

# ----------------------------
# KEYBOARD INTERRUPT
# ----------------------------
except KeyboardInterrupt:
    print("\nKeyboard interrupt received. Exiting program...")

# ----------------------------
# CLEANUP
# ----------------------------
finally:
    try:
        camera.close()
    except:
        pass

    GPIO.cleanup()
    print("Program exited cleanly.")

コード説明

  1. 現在のユーザーのホームディレクトリを取得し、撮影した画像の保存先として使用します。

    user = os.getlogin()
    user_home = os.path.expanduser(f'~{user}')
    

    これにより、アクティブユーザー名を取得し、ホームディレクトリへの完全パスを生成します。

  2. GPIO を設定し、PIR モーションセンサーを GPIO17 に入力として構成します。

    PIR_PIN = 17
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(PIR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    

    プルダウン抵抗を使用することで、動きが検出されていないときはピンが LOW を読み取るようになります。

  3. Picamera2 インスタンスを初期化し、カメラを起動します。

    camera = Picamera2()
    camera.start()
    

    カメラを起動しておくことで、動作検知時にすぐ撮影できる状態になります。

  4. PIR センサーの入力状態を読み取り、動きを検出します。

    if GPIO.input(PIR_PIN) == GPIO.HIGH:
    

    PIR が動きを検知すると HIGH を出力し、撮影処理がトリガーされます。

  5. 画像を撮影し、連番ファイル名で保存します。

    filename = f"{user_home}/capture{i}.jpg"
    camera.capture_file(filename)
    

    動きを検出するたびに capture1.jpgcapture2.jpg …というように連番で保存されます。

  6. 動作検知後、3 秒間の遅延を入れます。

    time.sleep(3)
    

    これにより、1 回の動作で短時間に多数の画像が撮影されるのを防ぎます。

  7. 動作が検知されない場合は「waiting」と表示し、少し待ってから再チェックします。

    else:
        print("waiting")
        time.sleep(0.5)
    

    これにより CPU 負荷を抑えながら、継続的な監視を実現します。

  8. キーボード割り込み(Ctrl+C)を処理して安全に終了します。

    except KeyboardInterrupt:
        print("\nKeyboard interrupt received. Exiting program...")
    

    ユーザーが手動でプログラムを停止した際に、終了メッセージを表示します。

  9. 終了前にカメラと GPIO リソースを解放します。

    finally:
        camera.close()
        GPIO.cleanup()
    

    これにより、カメラは正しくシャットダウンされ、GPIO ピンも安全な状態に戻されます。

現象の画像

../_images/4.1.4spycamera.JPG