Камера Raspberry Pi и съёмка по событию
Добавь к Pi камеру — и получишь основу для умного дверного звонка, фотоловушки или кормушки с трансляцией для кота.
Камера превращает Pi из «чувствующего» компьютера в «видящего». А связка камера плюс датчик движения — это уже настоящая система наблюдения.
Представь будку для кормления уличных котов: кот подходит, датчик движения замечает гостя, камера делает кадр и присылает тебе на телефон фото «вот кто сегодня заходил». Или фотоловушка на даче, которая снимает только когда кто-то проходит мимо, и не забивает карту памяти тысячами одинаковых пустых кадров. Всё это собирается из тех же кубиков, что мы уже трогали, плюс одна новая деталь — камера. Именно зрение делает проекты по-настоящему «вау».
У Raspberry Pi есть специальный разъём CSI для камеры — отдельный от USB. Подключив официальный модуль камеры, можно делать фото и видео. В Raspberry Pi OS Bookworm за это отвечает современный стек libcamera и библиотека Picamera2. Разъём CSI выбран не случайно: обычный USB слишком медленный для потока видео в высоком разрешении, а CSI — это широкая скоростная «труба» прямо к процессору, по которой кадры летят без задержек.
Как работает под капотом
Камера-модуль
|
плоский шлейф (CSI)
|
+-----------------+
| Raspberry Pi |
| libcamera | -> обработка кадра
| Picamera2 (py) | -> снимок в файл
+-----------------+
Что происходит между «кот подошёл» и «файл snapshot.jpg на диске»? Сенсор камеры — это решётка из миллионов крошечных ячеек, каждая измеряет, сколько света на неё упало. Эти сырые данные по шлейфу CSI попадают в libcamera, которая делает «проявку»: настраивает яркость, баланс белого, убирает шум и собирает из точек цветную картинку. Только потом Picamera2 сжимает результат в JPEG и кладёт в файл. Вот почему камере нужны те самые 1-2 секунды после старта — она в это время подбирает экспозицию, как глаз привыкает к свету, войдя с улицы в комнату.
свет -> сенсор -> сырые точки -> libcamera (проявка)
-> Picamera2 (сжатие в JPEG) -> файл .jpg
Работа с камерой зависит от железа, поэтому это пример для Pi:
from picamera2 import Picamera2
from time import sleep
cam = Picamera2()
cam.start()
sleep(2) # даём камере настроить экспозицию
cam.capture_file("snapshot.jpg")
cam.stop()
А логику «когда снимать» можно отладить в браузере. Сделаем простое правило: снимаем только если есть движение и с прошлого снимка прошло достаточно времени (чтобы не делать сотню кадров подряд). Попробуй сам ▶
# Логика съёмки по событию с защитой от спама (cooldown)
events = [
(0, "motion"), (1, "motion"), (2, "quiet"),
(9, "motion"), (10, "motion"), (20, "motion"),
]
cooldown = 5 # минимум секунд между снимками
last_shot = -100
shots = 0
for t, kind in events:
if kind == "motion" and (t - last_shot) >= cooldown:
shots += 1
last_shot = t
print(f"t={t}: движение -> СНИМОК #{shots}")
elif kind == "motion":
print(f"t={t}: движение, но ждём cooldown")
print(f"Сделано снимков: {shots}")
Часто к фотоловушке хочется добавить ещё одно правило: давать снимкам осмысленные имена, чтобы потом не утонуть в файлах вроде snapshot.jpg, перезаписывающих друг друга. Удобно класть в имя время съёмки и порядковый номер. Эту чисто строковую логику тоже легко отрепетировать без камеры. Попробуй сам ▶
# Генерируем уникальные имена файлов для снимков
shots = [(9, 0), (135, 1), (3700, 2)] # (секунд от старта, номер)
for seconds, n in shots:
hh = seconds // 3600
mm = (seconds % 3600) // 60
ss = seconds % 60
name = f"cam_{hh:02d}-{mm:02d}-{ss:02d}_{n:03d}.jpg"
print(name)
Частые ошибки
- Снимают сразу после старта. Камере нужны 1-2 секунды на настройку экспозиции.
- Сотни кадров в секунду. Без cooldown датчик движения завалит диск снимками.
- Плохо вставлен шлейф. Если камера не видится — переподключи CSI-шлейф контактами в нужную сторону.
- Все снимки с одним именем. Файл
snapshot.jpgкаждый раз перезаписывается — добавляй время или номер в имя. - Снимают в полной темноте обычной камерой. Без подсветки кадр будет чёрным; для ночи нужна камера NoIR и ИК-прожектор.
Best practices
- Добавляй cooldown между снимками, как в примере.
- Клади снимки в отдельную папку с датой в имени файла.
- Для ночной съёмки рассмотри камеру NoIR с ИК-подсветкой.
- Следи за местом на карте памяти и удаляй старые кадры, иначе диск однажды переполнится.
- Делай один прогрев камеры при старте программы, а не пересоздавай объект на каждый снимок — так быстрее.
Связка «датчик движения плюс камера» — это твой первый настоящий мини-проект на стыке нескольких устройств: один компонент решает «когда», другой делает «что». Точно так же устроены дверные звонки с камерой и видеоняни, только в красивом корпусе и за большие деньги. Поняв принцип, ты сможешь собрать собственную версию буквально из горсти деталей.
Итоги. Камера подключается через CSI и управляется через Picamera2, а libcamera «проявляет» сырые точки сенсора в готовый JPEG. Связка с датчиком движения даёт систему наблюдения, cooldown защищает от лавины снимков, а осмысленные имена файлов — от хаоса на диске. Дальше соберём логику умного дома.