Камера 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
py
Курс по теме
Пройдите курс «Python с нуля» — по шагам, с проверкой
8 уроков · ~14 ч · теория, упражнения и экзамен с бейджем
Открыть курс →