Обработка изображений — это весьма востребованная сторона разработок эмбеддеров. Охранно-следящие устройства и видеодокументирование, мультимедиа и связь — только некоторые из областей применения, где требуется обработка изображений. Конечно не секрет, что для разработчиков-любителей, за редким исключением, цена комплектующих имеет важное, порой решающее значение. Поэтому неудивительно, что при закупках народ ориентируется в первую очередь на недорогие комплектующие. Примером недорогой видеокамеры служит OV7670, купленная на Деалэкстиме за 12,90 $. Знаю, товарищи, знаю, что на ебее она ещё дешевле 🙂 Вот она, камера, у нас в руках.
Дальнейшая задача — снять с неё изображение и вывести его на подходящий экранчик — такой вот минимум. Причём не будем задаваться целью выжать из камеры всё, что ей предначертано. Снять и вывести изображение — для начала хватит! Ну, а потом уже, после понимания сути, продолжим извращаться во всех ракурсах 🙂 Перед началом рассуждений повторюсь: для понимания излагаемого материала необходимо иметь определенные познания и навыки — здесь не будут пояснений в плане, что такое пиксель или 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 двух байтах одного пикселя расстановка при этом будет следующая:
Кроме указанных есть ещё множество настроек (регулировки усилений по цветам, уровни серого, полярности сигналов, внутренняя PLL и пр.) К некоторым мы ещё вернёмся в будущем, а кому интересно сейчас — читайте даташит.
Рассмотрим разъём 9×2 для подключения OV7670 :
VDD — питание;
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 МГц; — выводе VSYNC — 30 Гц (настройки по умолчанию 30 кадров с секунду); — выводе HREF приблизительно 14,4 кГц (по умолчанию формат VGA 640х480, т.е 30 кадров по 480 строк — 30х480=14400); — выводах D7-D0 — там должны быть видны информационные посылки (т.е. изменения нулей и единиц)… Is it so? Поздравляю — Ваша камера вроде бы рабочая 🙂 Для ясности видеоинтерфейса приведена осциллограмма из даташита.
Тут, я думаю вопросов не должно возникать. Единственное, что путает мысли — это осциллограмма HSYNC, ведь такого сигнала на выходе камеры нет! Просто не обращайте на неё внимание — это внутренний сигнал OV7670. Он показан здесь, похоже, из даташитов на подобное устройство — не рисовать же разработчикам даташиты для каждой модели камеры 🙂 Я вообще хотел его в Паинте стереть, но подумал, что будут вопросы.
А сейчас выложу мои размышления по поводу подключения OV7670 к микроконтроллеру и непосредственно её работы… Я не претендую на их абсолютную научность и непогрешность, т.к не являюсь специалистом в области видеотехники. Может быть будут какие-то неточности и ошибки, в т.ч. и в терминах — не судите строго.
1-й способ, который напрашивается сразу — это прямое подключение видеосигналов камеры к дисплею. Микроконтроллер в таком случае будет настраивать режимы работы видеокамеры и дисплея и управлять ими. Рисунок ниже пояснит мои слова:
Очевидно, что это самый простой способ, т.к. микроконтроллеру не нужно производить захват и обработку видеосигнала. Одна проблема — дисплеев с такой настройкой по данным я не встречал. Строчные и кадровые — без проблем, а вот формат входных данных не тот 🙁
2-й способ — подключение всех сигналов с видеокамеры на микроконтроллер, дальнейшая их в МК обработка, приведение к необходимому формату и отправка на дисплей для отображения. Параллельно с обработкой видео контроллеру нужно ещё и управлять камерой и дисплеем. Рисунок ниже:
Этот способ самый «тупой», хотя и самый гибкий. Можно не заморачиваться с форматом входных и выходных данных, следовательно можно использовать различные типы камер и дисплеев. Но недостаток существенный — контроллер должен быть очень»шустрым», чтобы на лету «ловить», «переваривать» и «выплёвывать» видео в дисплей! AVR-ка вряд ли потянет.
Придумался мне ещё один, 3-й способ. В общем он похож на 1-й, но для преобразования данных D7-D0 и их тактовых импульсов PCLK можно применить несложную схемку, собранную на простых логических элементах, регистрах и триггерах. Ну, по типу, как организована связь с внешним ОЗУ у ATmega 8515, 64, 128.
Предполагаю, что это наиболее оптимальный способ подключения видеокамеры к дисплею. Довольно гибкий (логикой можно преобразовывать данные к любому необходимому виду, причём «на лету») и нетребовательный к производительности микроконтроллера, т.к. не нужно захватывать и преобразовывать видео (думаю Мега48 потянет).
Фиг его знает, может я тут ахинею несу ? Тогда прошу почтенных видеогуру меня направить на путь истинный 🙂 А сейчас я, пожалуй, возьму свою видеокамеру OV7670, макетку с ATmega48, дисплей uDisp320240 и попытаюсь вывести хоть какое-то изображения с камеры на дисплей по 2-му способу. Об этом в следующей статье.
А если использовать вот такую камеру http://kosmodrom.ua/el.php?name=C328-7640
С указанной Вами камерой работать ещё проще — просто обмен по RS-232. Однако она транслирует виде уже в JPEG-формате, поэтому отображать видео нужно или на компьютере, или с применением декодера.
этот декодер jpeg на каком контроллере (минимально) можно запустить.
В некоторых ARM-ах есть встроенный декодер видео. ?меются специализированные микросхемы — кодеры/декодеры.
А продолжение статьи будет? Очень интересно.
Конечно будет! Работаю сейчас над этим вопросом.
Спасибо автору хоть что то стало понятно. Я единственное не понял как настроить разрешение. Мне вообще нужно специфическое разрешение 640 х 24 (полоса). А по поводу мощного контроллера мажет реально взять мощный, например ARDUINO DUE.
Уважаемый SoS! Настройки разрешения кадра именно камеры указаны в статье — там нет 640 х 24. Но проблема легко решается съёмом информации именно 24 строк (при настройках камеры 640 х 480) управляющим микроконтроллером. Успехов!
А лучше использовать данную камеру с FIFO буфером AL422, на дисплей шину данных можно параллельно с шиной данных буфера подключить, т.к. есть сигнал отключения выхода буфера OE, в результате удалось выжать 30 кадров/сек при разрешении 320х240 ))
Можно, конечно! ? не только способом задействования Ф?ФО. Я много экспериментировал с выводом информации. Но мне хотелось вывести картинку именно АВР-кой, пусть и очень медленно. Засада состоит в том, что есть ограничения по минимальной частоте синхроимпульсов ((( Поэтому приходится осваивать сейчас ПЛ?С-ы — с ними возможности резко улучшаются. Параллельно собирал адаптер на дискрете (отдельных микросхемах). Времени, жаль, нет, чтобы описАть все эксперименты (((
Так этот буфер и нужен, чтобы быстро записывать данные с камеры и медленно считывать любым MCU. Единственно объем мал у буфера, 384к не хватит на полное разрешение 640х480 если в 16 бит режиме.
Ждём с нетерпение продолжения, у самого такая камера, пока не смог подключить.
?спользовал подобную второй схеме связку — мега88 + lcd ls020 + camera от е700 samsung. получилось выводить изображение 160х120, в цвете 6fps, в ч/б 12fps.
Дальше нужен уже мощней контроллер.
А есть какие нибудь аналоги AL422?
Найти не так-то просто, заказывать откуда то — очень долго ждать.
Не в курсе, т.к. работаю с камерой без Ф?ФО. Погуглите — найдёте аналог.
?нтересная идея, можно для видеожучков использовать. Я пока не видел полностью автономных устройств с видеозаписью — а тут очень экономично в плане питания
Показуха какаято.
А в чём выражается показуха?
Где хоть что-то от своего труда , зачем писать то, что сам не опробовал. В теории и 6 летний ребенок все умеет, только верстать статьи не умеет, смысл написания статьи был ???
Вы уж извините за критику. Пытаюсь найти примеры для инициализации GBR 4:2:2, самому не получается заинициализировать, постоянно натыкаюсь на копипасты одного и того же, вот…
Вы, что? С дуба упали? Уж извините за резкость ((( Где у меня что-то скопипащено? Все статьи написаны на основе Л?ЧНЫХ разработок! Прочитайте статью где я запустил камеру. Возьмите оттуда исходник и инициализируйте себе на здоровье.
Что нибудь удалось добиться? Тоже имею такую камеру…модуль SD.
Реально ли как то перекидывать информацию на флэшку? и вообще, если эта камера не для Ардуинки, куда ж ее тогда вообще можно использовать?!)
Камера работает нормально. С неё идут все положенные сигналы нормальной формы, длительности, и уровня. Проблема с дисплеем — где-то я не учитываю какую-то настройку. ?нформацию на флешку писать можно без проблем — только вот с какой частотой? По крайней мере фотки делать уж точно можно. ?спользовать можно для устройств документирования факта события (по датчику делать снимки). Например сфотать морду лица чела, который пытается залезть в форточку, или птичку, которая лезет в свой скворечник (задача для юннатов) 🙂
где продолжение?
Упражняюсь в английском ))) Очень тщательно изучаю ДШ на дисплей — там куча пересекающихся настроек — где-то что-то упускаю.
Смог подключиться к этой камере после нескольких недель попыток
http://privateblog.info/arduino-uno-i-kamera-ov7670-primer-ispolzovaniya/
Добрый день!
А не подскажите ли методику, как с цветами разобраться. Я подключил камеру и вывел изображение на монитор. Но, с цветами каша. Вроде бы в регистрах прописал RGB565, вроде и два старших бита из камеры, добавляя младшие два нуля, передаю на VGA. А на мониторе все зеленое с проблесками красного. Может скинете ваш проект?
С уважением, Владимир.