注釈
こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。
参加する理由は?
エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。
独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。
特別割引:最新製品の独占割引をお楽しみください。
祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。
👉 私たちと一緒に探索し、創造する準備はできていますか?[ここ]をクリックして今すぐ参加しましょう!
4.1.1 カメラ
はじめに
このセクションでは、ボタンを押すとLEDが点滅しながら写真を撮るカメラを作成します。
必要な部品
このプロジェクトに必要なパーツは以下の通りです。
一式をまとめて購入する方が便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
|---|---|---|
Raphael Kit |
337 |
以下のリンクから、各パーツを個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
|---|---|
回路図
T-Board Name |
physical |
wiringPi |
BCM |
GPIO17 |
Pin 11 |
0 |
17 |
GPIO18 |
Pin 12 |
1 |
18 |
実験手順
ステップ1: 回路を組み立てます。
ステップ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.")
コード説明
BUTTON_PINに接続されたボタンが押されているかどうかを確認します。if GPIO.input(BUTTON_PIN) == GPIO.LOW:
ボタンにはプルアップ抵抗が使用されているため、通常状態は
HIGHです。 ボタンが押されると信号がLOWになり、写真撮影プロセスが開始されます。写真を撮る前に、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 が撮影準備をしていることを示します。
タイムスタンプを使用してユニークなファイル名を生成し、写真を撮影します。
timestamp = time.strftime("%Y%m%d_%H%M%S") filename = os.path.join(user_home, f"my_photo_{timestamp}.jpg") camera.capture_file(filename)
タイムスタンプにより、各写真のファイル名が重複しないようになります。 画像はユーザーのホームディレクトリに保存されます。
LED を 0.5 秒間点灯させ、写真が撮影されたことを知らせます。
GPIO.output(LED_PIN, GPIO.HIGH) time.sleep(0.5) GPIO.output(LED_PIN, GPIO.LOW)
この短い点灯が撮影成功を示すサインになります。
ボタンが一度押された際に複数回反応してしまうのを防ぐため、短い遅延を追加します。
time.sleep(0.3)
このデバウンス処理により、安定したボタン動作が保証されます。