Raspberry Pi 5と公式カメラをつないで、「ボタンを押したら写真が撮れる」──。
やってみると簡単そうに見えるけど、実際は小さな地雷がたくさん転がっていました。
この記事は、私がPermission denied、FileNotFoundError、GPIO busy、そしてLow voltage warningと戦いながら、ようやく一枚の写真を撮れるようになった過程の記録です。
同じように詰まっている人に、少しでも届けばうれしいにゃ〜🐱
🧩 環境
- Raspberry Pi 5 Amazon
- カメラモジュール v3 Amazon
Raspberry Pi5は以前とリボン形状が変わったので注意。 - GPIO 17 にタクトスイッチを接続(GNDと直結)
- Raspberry Pi OS (Bookworm)
公式HPからゲットだぜ - Python 3.11
- エディタ:Geany
最初から標準装備。他のテキストエディタでも良い。
🎯 目標
ボタンを押したら写真を撮り、~/Pictures フォルダに保存する。
それだけ。だけど奥が深い。ようこそ地獄の入り口へぇぇぇっ!
⚙️ 1. 準備
まずは必要なライブラリをインストール:
sudo apt update
sudo apt install python3-gpiozero python3-picamera2
raspi-config でカメラを有効化して、GPIOも有効にします。
Raspberry Pi 5はカメラ設定が少し変わっていて、libcameraベースになっているのがポイントにゃ。
そして配線。
写真載っけとくので、見た通りに配線するにゃ。
GPIO17を使用
💡 最初のスクリプト
from gpiozero import Button
from picamera2 import Picamera2
from datetime import datetime
from pathlib import Path
import time
# Save destination: use ~/Pictures
save_dir = Path.home() / "Pictures"
save_dir.mkdir(parents=True, exist_ok=True)
# Button (GPIO17) connected to GND
button = Button(17, pull_up=True, bounce_time=0.05) # Debounce to prevent multiple triggers
picam2 = Picamera2()
picam2.start()
print("Press the button to take a photo. Press Ctrl+C to exit.")
def shoot():
filename = save_dir / f"capture_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg"
picam2.capture_file(str(filename))
print(f"Photo saved: {filename}")
button.when_pressed = shoot
try:
while True:
time.sleep(0.2)
except KeyboardInterrupt:
picam2.close()
コード的には完璧に見える。でも、実際に実行すると……動かない。笑
💥 最初の壁:「Permission denied」
Geanyで実行したら黒いターミナルにこう出た:
Permission denied
(program exited with code: 126)
シンプルに、実行権限がなかっただけ。
Pythonスクリプトは「シェルスクリプトじゃない」ので、chmod +xを付ける必要はなかったけど、Geanyが一時スクリプトとして実行しようとしていたにゃ。
解決策はこれ:
python3 camerabutton.py
Geanyの「Build → Set Build Commands」で実行コマンドを python3 "%f" に直したらスッキリ。
💥 次の壁:「FileNotFoundError」
FileNotFoundError: [Errno 2] No such file or directory: '/home/pi/Pictures/…'
原因は単純。ユーザー名をパスに入れ忘れてた。
だから /home/pi/ なんてフォルダは存在しなかったにゃ。
修正:
save_dir = Path.home() / "Pictures"
save_dir.mkdir(parents=True, exist_ok=True)
これでユーザーを問わず動作するようになった。ちょっとしたちっちゃいことだけど地味に嬉しい改善にゃ〜
⚠️ 警告:「Control Rotation is not advertised by libcamera」
次に、カメラ映像を180度回転させようと picam2.set_controls({"Rotation": 180}) を入れたら、怒られた。
RuntimeError: Control Rotation is not advertised by libcamera
Raspberry Pi 5ではドライバがまだ完全対応していなかったにゃ。
撮影後にPillowで画像を回転させる方法もあるけど、結論:回転させない方が早い。
動くものに余計なことすんなという名言を思い出す。
💥 AIに騙されるな!最大の壁:「GPIO busy」
最後の難関がこれ。
gpiozero.pins.pigpio.PinFactoryError: GPIO busy
これはGPIO17が他のプロセスに掴まれていることを意味していた。
修正方法がわからず、天下のChatGPT5様にお伺いを立てることに。
子曰く、
Raspberry Pi 5では、pigpiodデーモンが裏で動いていることが多く、それがgpiozeroと衝突する。
解決策はこれ:
sudo killall pigpiod
sudo pkill -f python
さらに、起動時にpigpiodを無効化:
sudo systemctl stop pigpiod
sudo systemctl disable pigpiod
....と君はAIから指示されるだろう!
実際はこんな面倒なことはなく、単に、前GeenyでrunさせてたコードがGPIOを塞いでただけ。
🧞♂️←コイツが元凶
なんでもAIの言うことを鵜呑みにせず、目の前のモニターを見ろ!
本当の解決策はGeanyのStopボタンを押すだけだ!
これでGPIOが解放され、ボタンが無事動作した。押すたびにカメラが機能し、写真が保存される。
こんな簡単なことに、いちいち感動できるのがラズパイの醍醐味にゃん
⚡ 「Low voltage warning」
右上に突然出る「⚡ Low voltage warning」。
これは電圧が4.63V以下になった警告で、カメラとGPIOを同時に使うとよく出る。
対策:5V 3A以上の電源アダプタ(できればUSB-C PD対応)を使う。
が、
100w対応高性能アダプタでもだめな時はだめ。
警告が目障りなこと以外は、案外なんとでもなるからアキラメロン。
どうしても気になるなら公式の純正アダプターを要検討するにゃー😽

🎉 完成!
ボタンを押すと、ターミナルに:
Photo saved: /home/***/Pictures/capture_20251009_220110.jpg
そしてフォルダにはしっかり保存された写真。
モニターに撮影した画像が写った瞬間、「ここまで来たか…」と感慨もひとしおだったにゃー
🧭 まとめ
| 問題 | 原因 | 解決方法 |
|---|---|---|
| Permission denied | Geanyがスクリプトを直接実行 |
python3 camerabutton.py で実行 |
| FileNotFoundError |
/home/pi/Pictures が存在しない |
Path.home() を使用 |
| Control Rotation | ドライバ未対応 | 回転を削除 |
| GPIO busy | pigpiodとの競合 | sudo killall pigpiod |
| Low voltage warning | 電源不足 | 5V 3A以上のPDアダプタ |
💬 最後に
たった一枚の写真を撮るまで、何時間もデバッグした。マジでしんどい。
こんな簡単なことをするのにここまで手こずるとは...
でも、その過程でRaspberry Pi 5の挙動やGPIO制御、libcameraの仕様を深く理解できたのでよかったです。
これが誰かのお役に立てれば幸いにゃん。
😽
小さな成功体験の積み重ねが、ハードウェア開発の楽しさにゃ。
もしこの記事があなたのラズパイ工作を救えたなら、ハート置いてってくれるとうれしーにゃ。

