注釈

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

参加する理由は?

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

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

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

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

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

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

4.1.1 カメラ

はじめに

このセクションでは、ボタンを押すとLEDが点滅しながら写真を撮るカメラを作成します。

必要な部品

このプロジェクトに必要なパーツは以下の通りです。

../_images/3.1.15camera_list.png

一式をまとめて購入する方が便利です。リンクはこちらです:

名前

このキットのアイテム

リンク

Raphael Kit

337

Raphael Kit

以下のリンクから、各パーツを個別に購入することもできます。

コンポーネントの紹介

購入リンク

GPIO拡張ボード

購入

ブレッドボード

購入

ジャンパーワイヤー

購入

抵抗器

購入

LED

購入

ボタン

購入

カメラモジュール

購入

回路図

T-Board Name

physical

wiringPi

BCM

GPIO17

Pin 11

0

17

GPIO18

Pin 12

1

18

../_images/4.1.1_camera_schematic.png

実験手順

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

../_images/4.1.1_camera_circuit.png

ステップ2: カメラモジュールを接続し、設定を完了してください。詳しくは カメラモジュール を参照。

ステップ3: Raspberry Piデスクトップに入ります。より良い体験のためにスクリーンが必要かもしれません: Raspberry Piを接続する を参照してください。リモートからRaspberry Piのデスクトップにアクセスすることもできます。詳しいチュートリアルは リモートデスクトップ を参照してください。

ステップ4: ターミナルを開き、コードのディレクトリに移動します。

cd ~/raphael-kit/python/

ステップ5: コードを実行します。

sudo python3 4.1.1_Camera.py

コードが実行されると、次の動作が行われます:

  • ライブカメラのプレビュウィンドウが開きます。

  • プログラムはボタンが押されるのを待機します。

  • ボタンが押されると:

    • LED が 3 回点滅します。

    • カメラが写真を撮影します。

    • LED が確認として 0.5 秒間点灯します。

    • 撮影した画像は /home/<username>/ にタイムスタンプ付きのファイル名で保存されます。

  • Ctrl+C を押すと、いつでもプレビューを停止し、GPIO リソースを解放して、プログラムを正常に終了できます。

注釈

PythonのIDEで ~/raphael-kit/python/4.1.1_Camera.py を開き、実行ボタンでコードを実行、ストップボタンでコードを停止することもできます。

PCに写真をダウンロードする方法については FileZilla ソフトウェア をご参照ください。

コード

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

# ----------------------------
# GPIO SETUP
# ----------------------------

BUTTON_PIN = 18  # The push button is connected to GPIO18
LED_PIN = 17     # The LED is connected to GPIO17

GPIO.setmode(GPIO.BCM)  # Use BCM GPIO numbering

# The button uses a 10K pull-up resistor externally.
# When released → HIGH, when pressed → LOW.
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)

# LED is an output (HIGH → ON, LOW → OFF)
GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.output(LED_PIN, GPIO.LOW)  # Ensure LED is OFF at startup

# ----------------------------
# USER DIRECTORY SETUP
# ----------------------------

# Get the current logged-in username
user = os.getlogin()

# Build the path to the user's home directory (ex: /home/pi)
user_home = os.path.expanduser(f"~{user}")

# ----------------------------
# CAMERA SETUP
# ----------------------------

# Create a Picamera2 object
camera = Picamera2()

# Create a preview configuration:
# main → the main camera stream
# size → resolution 800x600
# format → display format used by the preview window
preview_config = camera.create_preview_configuration(
    main={"size": (800, 600), "format": "XRGB8888"}
)

# Apply the configuration to the camera
camera.configure(preview_config)

# Start the preview window using QTGL (GPU-accelerated)
camera.start_preview(Preview.QTGL)

# Start the camera hardware
camera.start()

print("Ready! Press the button to take a photo...")

# ----------------------------
# MAIN LOOP
# ----------------------------
try:
    while True:
        # Check if button is pressed (LOW means pressed)
        if GPIO.input(BUTTON_PIN) == GPIO.LOW:
            print("Button pressed! Taking photo...")

            # Flash LED 3 times to warn before taking the photo
            for _ in range(3):
                GPIO.output(LED_PIN, GPIO.HIGH)
                time.sleep(0.1)
                GPIO.output(LED_PIN, GPIO.LOW)
                time.sleep(0.1)

            # Build a unique filename using current date and time
            # Example: /home/pi/my_photo_20251201_143522.jpg
            timestamp = time.strftime("%Y%m%d_%H%M%S")
            filename = os.path.join(user_home, f"my_photo_{timestamp}.jpg")

            # Capture the image
            camera.capture_file(filename)

            print(f"Photo saved to: {filename}")

            # Turn LED ON briefly to confirm capture
            GPIO.output(LED_PIN, GPIO.HIGH)
            time.sleep(0.5)
            GPIO.output(LED_PIN, GPIO.LOW)

            # Debounce delay to prevent repeated triggers
            time.sleep(0.3)

        # Small delay to reduce CPU usage
        time.sleep(0.01)

# ----------------------------
# CLEAN EXIT WHEN CTRL+C IS PRESSED
# ----------------------------
except KeyboardInterrupt:
    print("\nCtrl+C received, exiting...")

# ----------------------------
# CLEANUP SECTION
# ----------------------------
finally:
    # Safely try to stop the camera preview
    try:
        camera.stop_preview()
    except:
        pass  # Ignore errors if preview wasn't running

    # Safely close the camera device
    try:
        camera.close()
    except:
        pass

    # Reset GPIO pins to a safe state
    GPIO.cleanup()

    print("Program exited cleanly.")

コード説明

  1. BUTTON_PIN に接続されたボタンが押されているかどうかを確認します。

    if GPIO.input(BUTTON_PIN) == GPIO.LOW:
    

    ボタンにはプルアップ抵抗が使用されているため、通常状態は HIGH です。 ボタンが押されると信号が LOW になり、写真撮影プロセスが開始されます。

  2. 写真を撮る前に、LED を 3 回点滅させて視覚的フィードバックを提供します。

    for _ in range(3):
        GPIO.output(LED_PIN, GPIO.HIGH)
        time.sleep(0.1)
        GPIO.output(LED_PIN, GPIO.LOW)
        time.sleep(0.1)
    

    これは Raspberry Pi が撮影準備をしていることを示します。

  3. タイムスタンプを使用してユニークなファイル名を生成し、写真を撮影します。

    timestamp = time.strftime("%Y%m%d_%H%M%S")
    filename = os.path.join(user_home, f"my_photo_{timestamp}.jpg")
    camera.capture_file(filename)
    

    タイムスタンプにより、各写真のファイル名が重複しないようになります。 画像はユーザーのホームディレクトリに保存されます。

  4. LED を 0.5 秒間点灯させ、写真が撮影されたことを知らせます。

    GPIO.output(LED_PIN, GPIO.HIGH)
    time.sleep(0.5)
    GPIO.output(LED_PIN, GPIO.LOW)
    

    この短い点灯が撮影成功を示すサインになります。

  5. ボタンが一度押された際に複数回反応してしまうのを防ぐため、短い遅延を追加します。

    time.sleep(0.3)
    

    このデバウンス処理により、安定したボタン動作が保証されます。

現象の画像

../_images/4.1.1camera.JPG