Видеокамера OV7670. Введение.

Обработка изображений — это весьма востребованная сторона разработок эмбеддеров. Охранно-следящие устройства и видеодокументирование, мультимедиа и связь — только некоторые из областей применения, где требуется обработка изображений. Конечно не секрет, что для разработчиков-любителей, за редким исключением, цена комплектующих имеет важное, порой решающее значение. Поэтому неудивительно, что при закупках народ ориентируется в первую очередь на недорогие комплектующие. Примером недорогой видеокамеры служит OV7670, купленная на Деалэкстиме за 12,90 $. Знаю, товарищи, знаю, что на ебее она ещё дешевле 🙂 Вот она, камера, у нас в руках.
OV7670_cameraДальнейшая задача — снять с неё изображение и вывести его на подходящий экранчик — такой вот  минимум. Причём не будем задаваться целью выжать из камеры всё, что ей предначертано. Снять и вывести изображение — для начала хватит! Ну, а потом уже, после понимания сути,  продолжим извращаться во всех ракурсах 🙂 Перед началом рассуждений повторюсь: для понимания излагаемого материала необходимо иметь определенные познания и навыки — здесь не будут пояснений в плане, что такое пиксель или I2C, предполагается, что читатель слегка подготовлен. Ну, с Богом!
С чего же начать? Ну, наверное, погуглить и почитать, что о ней пишут, воспользоваться, так сказать, наработанным опытом. Мне здорово помогла вот эта статья, например. Там, кстати, есть ссылка на даташит изделия.
………………………………………………………………..
OV7670 формирует изображение с максимальным разрешением 640 х 480 и может выдать его со скоростью до 30 кадров в секунду. Видеоинтерфейс использует синхроимпульсы по кадрам VSYNC, по строкам HREF и по пикселям PCLK. Данные пикселя, представляющие собой закодированную информацию об его цвете, выдаются по 8-ми разрядному параллельному интерфейсу D7-D0 по тактам PCLK. Имейте в виду, что один пиксель не равен одному байту. В случае кодировки RGB данные о цвете пикселя выдаются в двух байтах, а для YCbCr -кодировки — там посложнее, но об этом после.
Для OV7670 существуют множество настроек. К примеру можно использовать такие форматы кадра: — VGA (640 х 480); — QVGA (320 х 240); — CIF (352 х 240); — QCIF (176 × 144); — ручное масштабирование.
Как уже упоминалось имеется две основных кодировки цвета пикселя. Это  YCbCr — кодировка, с которой я пока ещё досконально не разбирался, и уже известная мне RGB — кодировка. RGB доступна в следующих вариантах : RGB565, RGB555 и RGB444. Цифры обозначают количество бит на каждый цвет. К примеру RGB565 — 5 бит на красный, 6 бит на зеленый и 5 бит на синий. А в передаваемых через 8-ми разрядный параллельный порт D7 — D0 двух байтах одного пикселя расстановка при этом  будет следующая:

Для RGB565:RGB565 Для RGB555: RGB555

Для RGB444: RGB444

Кроме указанных есть ещё множество настроек (регулировки усилений по цветам, уровни серого, полярности сигналов, внутренняя PLL и пр.)  К некоторым мы ещё вернёмся в будущем, а кому интересно сейчас — читайте даташит.
Рассмотрим разъём 9×2 для подключения OV7670 :
con_OV7670VDD — питание;
GND — общий;
SDIOC — (вход) тактовый сигнал последовательного интерфейса SCCB управления камерой;
SDIOD — (вход/выход) информационный сигнал (данные) последовательного интерфейса SCCB управления камерой;
VSYNC  — (выход) импульс кадровой синхронизации;
HREF — (выход) импульс строчной синхронизации;
PCLK — (выход) тактовый импульс выдачи байта с параллельного порта  D7 — D0;
XCLK — (вход) главный тактовый импульс для работы OV7670;
D7 — D0 — 8-ми битный параллельный видеовыход;
RESET (Сброс) — вывод аппаратного сброса камеры;
PWDN — вывод аппаратного включения/выключения камеры.

Как следует из описания разъёма управление настройками камеры осуществляется через последовательный интерфейс SCCB. Не стоит волноваться, оказывается этот интерфейс — полный аналог  I2C ! Соответственно SDIOC — это сигнал SCL, а SDIOD — SDA.
Теперь убедимся в работоспособности OV7670 . Это довольно просто. Я использовал, например,  макетку STM32F100C4. Подал с неё на камеру питание 3,3 В, а с вывода MCO вдул 24 МГц на вход XCLK. . Теперь с помощью осциллографа следует убедится в наличии сигналов на: — выводе PCLK — там будут те же 24 МГц; — выводе VSYNC30 Гц (настройки по умолчанию 30 кадров с секунду); — выводе  HREF приблизительно 14,4 кГц (по умолчанию формат VGA 640х480, т.е 30 кадров по 480 строк — 30х480=14400); — выводах  D7-D0 — там должны быть видны информационные посылки (т.е. изменения нулей и единиц)… Is it so?  Поздравляю — Ваша камера вроде бы рабочая 🙂 Для ясности видеоинтерфейса приведена осциллограмма из даташита.
Oscillograms_VGAТут, я думаю вопросов не должно возникать. Единственное, что путает мысли — это осциллограмма HSYNC, ведь такого сигнала на выходе камеры нет! Просто не обращайте на неё внимание — это внутренний сигнал OV7670. Он показан здесь, похоже, из даташитов на подобное устройство — не рисовать же разработчикам даташиты для каждой модели камеры 🙂 Я вообще хотел его в Паинте стереть, но подумал, что будут вопросы.

А сейчас выложу мои размышления по поводу подключения OV7670 к микроконтроллеру и непосредственно её работы… Я не претендую на их абсолютную научность и непогрешность, т.к не являюсь специалистом в области видеотехники. Может быть будут какие-то неточности и ошибки, в т.ч. и в терминах — не судите строго.
1-й способ, который напрашивается сразу — это прямое подключение видеосигналов камеры к дисплею. Микроконтроллер в таком случае будет настраивать режимы работы видеокамеры и дисплея и управлять ими. Рисунок ниже пояснит мои слова:
Fig_1Очевидно, что это самый простой способ, т.к. микроконтроллеру не нужно производить захват и обработку видеосигнала. Одна проблема — дисплеев с такой настройкой по данным я не встречал. Строчные и кадровые — без проблем, а вот формат входных данных не тот 🙁

2-й способ — подключение всех сигналов с видеокамеры на микроконтроллер, дальнейшая их в МК обработка, приведение к необходимому формату и отправка на дисплей для отображения. Параллельно с обработкой видео контроллеру нужно ещё и управлять камерой и дисплеем. Рисунок ниже:
Fig_2Этот способ самый «тупой», хотя и самый гибкий. Можно не заморачиваться с форматом входных и выходных данных, следовательно можно использовать различные типы камер и дисплеев. Но недостаток существенный — контроллер должен быть очень»шустрым», чтобы на лету «ловить», «переваривать» и «выплёвывать» видео в дисплей! AVR-ка вряд ли потянет.

Придумался мне ещё один, 3-й способ. В общем он похож на 1-й, но для преобразования данных D7-D0 и их тактовых импульсов PCLK можно применить несложную схемку, собранную на простых логических элементах, регистрах и триггерах. Ну, по типу, как организована связь с внешним ОЗУ у ATmega 8515, 64, 128.
Fig_3

Предполагаю, что это наиболее оптимальный способ подключения видеокамеры к дисплею. Довольно гибкий (логикой можно преобразовывать данные к любому необходимому виду, причём «на лету») и нетребовательный к производительности микроконтроллера, т.к. не нужно захватывать и преобразовывать видео (думаю Мега48 потянет).
Фиг его знает, может я тут ахинею несу ? Тогда прошу почтенных видеогуру меня направить на путь истинный 🙂 А сейчас я, пожалуй, возьму свою видеокамеру OV7670, макетку с ATmega48, дисплей uDisp320240 и попытаюсь вывести хоть какое-то изображения с камеры на дисплей по 2-му способу. Об этом в следующей статье.

Запись опубликована в рубрике Разное с метками , . Добавьте в закладки постоянную ссылку.

25 комментариев: Видеокамера OV7670. Введение.

  1. Иван говорит:

    А если использовать вот такую камеру http://kosmodrom.ua/el.php?name=C328-7640

  2. s_black говорит:

    С указанной Вами камерой работать ещё проще — просто обмен по RS-232. Однако она транслирует виде уже в JPEG-формате, поэтому отображать видео нужно или на компьютере, или с применением декодера.

  3. Иван говорит:

    этот декодер jpeg на каком контроллере (минимально) можно запустить.

  4. s_black говорит:

    В некоторых ARM-ах есть встроенный декодер видео. Имеются специализированные микросхемы — кодеры/декодеры.

  5. Зверюга говорит:

    А продолжение статьи будет? Очень интересно.

  6. s_black говорит:

    Конечно будет! Работаю сейчас над этим вопросом.

  7. SoS говорит:

    Спасибо автору хоть что то стало понятно. Я единственное не понял как настроить разрешение. Мне вообще нужно специфическое разрешение 640 х 24 (полоса). А по поводу мощного контроллера мажет реально взять мощный, например ARDUINO DUE.

  8. s_black говорит:

    Уважаемый SoS! Настройки разрешения кадра именно камеры указаны в статье — там нет 640 х 24. Но проблема легко решается съёмом информации именно 24 строк (при настройках камеры 640 х 480) управляющим микроконтроллером. Успехов!

  9. Andrew_kmr говорит:

    А лучше использовать данную камеру с FIFO буфером AL422, на дисплей шину данных можно параллельно с шиной данных буфера подключить, т.к. есть сигнал отключения выхода буфера OE, в результате удалось выжать 30 кадров/сек при разрешении 320х240 ))

  10. s_black говорит:

    Можно, конечно! И не только способом задействования ФИФО. Я много экспериментировал с выводом информации. Но мне хотелось вывести картинку именно АВР-кой, пусть и очень медленно. Засада состоит в том, что есть ограничения по минимальной частоте синхроимпульсов ((( Поэтому приходится осваивать сейчас ПЛИС-ы — с ними возможности резко улучшаются. Параллельно собирал адаптер на дискрете (отдельных микросхемах). Времени, жаль, нет, чтобы описАть все эксперименты (((

  11. Andrew_kmr говорит:

    Так этот буфер и нужен, чтобы быстро записывать данные с камеры и медленно считывать любым MCU. Единственно объем мал у буфера, 384к не хватит на полное разрешение 640х480 если в 16 бит режиме.

  12. Владимир говорит:

    Ждём с нетерпение продолжения, у самого такая камера, пока не смог подключить.

  13. Alex говорит:

    Использовал подобную второй схеме связку — мега88 + lcd ls020 + camera от е700 samsung. получилось выводить изображение 160х120, в цвете 6fps, в ч/б 12fps.
    Дальше нужен уже мощней контроллер.

  14. leo говорит:

    А есть какие нибудь аналоги AL422?
    Найти не так-то просто, заказывать откуда то — очень долго ждать.

  15. s_black говорит:

    Не в курсе, т.к. работаю с камерой без ФИФО. Погуглите — найдёте аналог.

  16. Евгений говорит:

    Интересная идея, можно для видеожучков использовать. Я пока не видел полностью автономных устройств с видеозаписью — а тут очень экономично в плане питания

  17. max говорит:

    Показуха какаято.

  18. s_black говорит:

    А в чём выражается показуха?

  19. max говорит:

    Где хоть что-то от своего труда , зачем писать то, что сам не опробовал. В теории и 6 летний ребенок все умеет, только верстать статьи не умеет, смысл написания статьи был ???

    Вы уж извините за критику. Пытаюсь найти примеры для инициализации GBR 4:2:2, самому не получается заинициализировать, постоянно натыкаюсь на копипасты одного и того же, вот…

  20. s_black говорит:

    Вы, что? С дуба упали? Уж извините за резкость ((( Где у меня что-то скопипащено? Все статьи написаны на основе ЛИЧНЫХ разработок! Прочитайте статью где я запустил камеру. Возьмите оттуда исходник и инициализируйте себе на здоровье.

  21. .олег говорит:

    Что нибудь удалось добиться? Тоже имею такую камеру…модуль SD.
    Реально ли как то перекидывать информацию на флэшку? и вообще, если эта камера не для Ардуинки, куда ж ее тогда вообще можно использовать?!)

  22. s_black говорит:

    Камера работает нормально. С неё идут все положенные сигналы нормальной формы, длительности, и уровня. Проблема с дисплеем — где-то я не учитываю какую-то настройку. Информацию на флешку писать можно без проблем — только вот с какой частотой? По крайней мере фотки делать уж точно можно. Использовать можно для устройств документирования факта события (по датчику делать снимки). Например сфотать морду лица чела, который пытается залезть в форточку, или птичку, которая лезет в свой скворечник (задача для юннатов) 🙂

  23. Инженер666 говорит:

    где продолжение?

  24. s_black говорит:

    Упражняюсь в английском ))) Очень тщательно изучаю ДШ на дисплей — там куча пересекающихся настроек — где-то что-то упускаю.

  25. Merl1n говорит:

    Смог подключиться к этой камере после нескольких недель попыток
    http://privateblog.info/arduino-uno-i-kamera-ov7670-primer-ispolzovaniya/

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

Ваш e-mail не будет опубликован.