Подключение камеры OV7670 к Arduino Uno

Видеокамеры (камеры) в настоящее время находят широкое применение в электронной промышленности и имеют множество применений, таких как система мониторинга посетителей, система наблюдения, система учета посещаемости и т.д. Камеры, которые мы используем сегодня, умны и имеют множество функций, которых не было в предыдущих моделях камер. Современные цифровые камеры не только захватывают изображения, но также захватывают и высокоуровневые описания изображений и анализируют то, что они видят. Они широко используются в робототехнике, искусственном интеллекте, машинном обучении и т. д. Захваченные кадры обрабатываются с помощью искусственного интеллекта и машинного обучения, а затем используются во многих приложениях, таких как обнаружение номерных знаков, обнаружение объектов, обнаружение движения, распознавание лиц и т. д.

Внешний вид проекта подключения камеры OV7670 к Arduino Uno

В этой статье мы рассмотрим подключение наиболее часто используемого сейчас модуля камеры OV7670 к плате Arduino Uno. Аналогичным образом ее можно подключить и к плате Arduino Mega. Модуль камеры достаточно тяжел в подключении поскольку он имеет большое количество контактов. Также при использовании камеры достаточно важен выбор проводов, которыми вы ее подключаете, поскольку качество проводов может значительно влиять на качество картинки и уровень зашумленности видеоизображения.

Камера OV7670 работает от напряжения 3.3V, поэтому следует избегать прямого ее подключения к обычным контактам ввода/вывода Arduino, которые работают с напряжением 5V. OV7670 является камерой с буфером FIFO (first in, first out – первым пришел, первым вышел). Но в этом проекте мы будем захватывать изображения без использования данного буфера. Мы постарались максимально упростить данный проект чтобы его можно было повторить даже начинающим радиолюбителям.

Необходимые компоненты

Аппаратное обеспечение

  1. Плата Arduino Uno (купить на AliExpress).
  2. Модуль камеры (Camera Module) OV7670 (купить на AliExpress).
  3. Резистор 10 кОм – 2 шт.
  4. Резистор 4,7 кОм – 2 шт.
  5. Соединительные провода.

Программное обеспечение

Arduino IDE
Serial Port Reader (для анализа выходного изображения)

Некоторые особенности модуля камеры OV7670

OV7670 представляет собой модуль камеры с буфером типа FIFO. В настоящее время он производится несколькими фирмами и доступен с различной распиновкой. OV7670 обеспечивает полномасштабное (full frame) 8 битовое изображение в окне. OV7670 умеет работать с различными форматами видео изображения. В VGA разрешении камера обеспечивает до 30 кадров в секунду.

Модуль камеры OV7670 включает:

  • массив датчиков изображений (разрешения примерно 656 x 488 пикселов);
  • тактовый генератор;
  • процессор обработки сигналов;
  • аналого-цифровые преобразователи;
  • генератор тестовых шаблонов;
  • цифровой сигнальный процессор;
  • устройство для масштабирования изображений;
  • цифровой видео порт;
  • светодиод и выход управления стробоскопической вспышкой.

Датчик изображения камеры OV7670 управляется с помощью шины SCCB (Serial Camera Control Bus - последовательная шина управления камерой) по протоколу I2C (контакты SIOC, SIOD) с максимальной частотой синхронизации 400 кГц.

Внешний вид модуля камеры OV7670 показан на следующих рисунках.

OV7670 модуль VGA камеры

OV7670 модуль VGA камеры

Модуль камеры OV7670 (со снятой линзой)

Модуль камеры OV7670 (со снятой линзой)

Модуль камеры OV7670 (нижняя сторона платы)

Модуль камеры OV7670 (нижняя сторона платы)

Камера использует следующие квитирующие (подтверждающие) сигналы:

  • VSYNC: Vertical Sync Output (выход вертикальной синхронизации (для строк) – низкий уровень во время кадра;
  • HREF: Horizontal Reference (горизонтальная синхронизация (для колонок) – высокий уровень во время активных пикселов ряда (строки);
  • PCLK: Pixel Clock Output (пиксельная синхронизация (тактовый сигнал передачи байта из параллельного порта D0–D7) – независимый генератор синхронизирующих импульсов. Данные правильны на нарастающем фронте.

В дополнение к этому камера оперирует еще следующими сигналами:

  • D0-D7: параллельный цифровой 8-битный видеовыход в формате YUV/RGB;
  • PWDN: Power Down Mode Selection - включение (лог. 0) и выключение (лог. 1) камеры;
  • XCLK: внешнее тактирование (синхронизация);
  • Reset: сигнал сброса.

Камера OV7670 синхронизируется с помощью генератора на 24 МГц. Это обеспечивает выход пиксельной синхронизации (PCLK) 24 МГц. Буфер типа FIFO имеет память на 3 Мбит. Генератор тестовых шаблонов формирует шаблон цветовых полос – с 8 полосами, с постепенным уменьшением к серому цвету (fade-to-gray).

Схема проекта

Схема подключения модуля камеры OV7670 к плате Arduino Uno представлена на следующем рисунке.

Схема подключения модуля камеры OV7670 к плате Arduino Uno

Внешний вид получившейся у нас конструкции проекта показан на следующем рисунке.

Внешний вид конструкции проекта

Объяснение программы для Arduino

Полный текст программы приведен в конце в статьи, здесь же мы рассмотрим его наиболее важные фрагменты.

Для работы с камерой OV7670 нам понадобится встроенная в Arduino IDE библиотека. Никаких внешних библиотек, которые необходимо скачивать, мы в этом проекте использовать не будем, только встроенные библиотеки.

После подключения в программе необходимых библиотек нам необходимо сконфигурировать регистры для работы с камерой OV7670.

Функция Setup() в нашем проекте будет включать все необходимые установки, необходимые для захвата изображений. Первой функцией, которую мы применим, будет arduinoUnoInut() – она используется для инициализации платы Arduino Uno. Она отключает все глобальные прерывания и устанавливает настройки для интерфейсов связи, такие как синхронизацию для ШИМ (широтно-импульсная модуляция), выбор контактов прерывания, настройки предделителя, добавление бита четности и стоповых битов.

После конфигурирования платы Arduino необходимо сконфигурировать камеру. Для инициализации камеры нам необходимо всего лишь изменить значения регистров (с тех, которые в них по умолчанию). Также необходимо добавить задержку, зависящую от того, какую частоту микроконтроллера мы используем. Чем медленнее микроконтроллер, тем большая задержка необходима между захватом кадров.

Мы в нашем проекте будем использовать формат видеоизображения QVGA (320 × 240), поэтому нам необходимо установить необходимое разрешение для камеры. Это можно сделать с помощью следующей команды:

В этом проекте мы будем работать с монохромными изображениями, поэтому в регистрах необходимо установить соответствующие значения с помощью команды:

С помощью следующей функции мы также будем записывать необходимое шестнадцатеричное значение в регистр. Если после этого вы будете получать зашифрованные изображения, то можете попробовать изменить второй параметр в представленной команде с 10 на 9/11/12. Но в большинстве случаев параметр 10 работает превосходно, поэтому у вас не будет необходимости изменять его.

Следующая используемая нами функция предназначена для получения разрешения изображения – в этом проекте мы будем использовать разрешение 320 x 240 пикселов.

Также в программе присутствуют функции для конфигурирования протокола I2C для получения данных с камеры. Они включают инициализацию связи по данному протоколу (Read), установку адреса, передачу и считывание данных. Более подробно про это можно прочитать в статье про использование интерфейса I2C в Arduino.

Загрузите представленный в конце статьи код программы в плату Arduino, затем откройте программу Serial Port Reader и после этого вы сможете захватывать кадры.

Как использовать Serial Port Reader для считывания изображений

Программа Serial Port Reader имеет интуитивно понятный интерфейс пользователя и ее можно скачать по следующей ссылке. Она захватывает изображения в формате base64 и затем декодирует их чтобы сформировать изображение на экране. Для работы с данной программой выполните следующую последовательность шагов.

Шаг 1. Подсоедините вашу плату Arduino к одному из USB портов вашего компьютера.

Внешний вид программы Serial Port Reader при запуске

Шаг 2. Нажмите на “Check” чтобы найти COM порт, к которому подключена плата Arduino.

Нахождение COM порта в программе Serial Port Reader

Шаг 3. Нажмите на кнопку “Start” чтобы начать считывать изображения последовательно.

Считывание изображений с камеры в программе Serial Port Reader

Шаг 4. Можно сохранить необходимое изображение, нажав на кнопку “Save Picture”.

Далее приведены примеры изображений, полученные с помощью камеры OV7670.

Меры предосторожности при работе с камерой OV7670

  1. Старайтесь для соединения с камерой использовать как можно более короткие провода.
  2. Избегайте “неплотных” соединений на всех контактах Arduino и OV7670.
  3. Поскольку в данном случае вы используете достаточно много соединений остерегайтесь короткого замыкания.
  4. Если плата Arduino UNO формирует напряжение 5V на своих портах ввода-вывода, то используйте понижение уровня этого напряжения.
  5. Используйте для OV7670 входное напряжение 3.3V поскольку более высокое напряжение может повредить модуль камеры.

Представленная статья является лишь примером работы платы Arduino с модулем камеры. Поскольку плата Arduino имеет достаточно мало памяти, то работа с изображениями камеры может быть не такой “идеальной”, на какую вы рассчитывали. Для улучшения изображений с модуля камеры в этом случае рекомендуется использовать более мощные микроконтроллеры с большим объемом памяти.

Исходный код программы (скетча)

Комментарии к тексту программу оставил в оригинале (на английском языке), но если потребуется (статья вызовет интерес), могу перевести их для вас.

Видео, демонстрирующее работу проекта

(Проголосуй первым!)
Загрузка...
178 просмотров


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *