Камера 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 защищает от лавины снимков, а осмысленные имена файлов — от хаоса на диске. Дальше соберём логику умного дома.

Проверьте себя
1. Зачем в логике съёмки по движению нужен cooldown (минимальный интервал между снимками)?
AЧтобы камера остыла
BЧтобы при долгом движении не наделать сотни кадров и не завалить диск
CЭто требование Python
DЧтобы фото были ярче
2. Через какой разъём подключается официальная камера Raspberry Pi?
AUSB
BCSI (плоский шлейф)
CHDMI
DEthernet