Оглавление:

Сделайте свою камеру: 8 шагов
Сделайте свою камеру: 8 шагов

Видео: Сделайте свою камеру: 8 шагов

Видео: Сделайте свою камеру: 8 шагов
Видео: Как настроить приложение для камер видеонаблюдения iCSee Вся настройка Обновленного приложения 2024, Июль
Anonim
Image
Image
Сделайте свою собственную камеру
Сделайте свою собственную камеру

В этом руководстве объясняется, как создать монохромную камеру с использованием датчика изображения Omnivision OV7670, микроконтроллера Arduino, нескольких перемычек и программного обеспечения Processing 3.

Также представлено экспериментальное программное обеспечение для получения цветного изображения.

Нажмите клавишу «c», чтобы сделать снимок размером 640 * 480 пикселей… нажмите клавишу «s», чтобы сохранить изображение в файл. Последовательные изображения нумеруются последовательно, если вы хотите создать короткий интервальный фильм.

Камера не быстрая (каждое сканирование занимает 6,4 секунды) и подходит только для использования при фиксированном освещении.

Стоимость без учета Arduino и ПК - меньше чашки кофе.

Изображений

Составные части без перемычки показаны на начальном фото.

Вторая фотография - снимок экрана, показывающий программное обеспечение камеры Arduino и фреймграббер Processing 3. На вставке показано, как подключена камера.

Видео демонстрирует камеру в действии. При нажатии кнопки захвата «c» происходит короткая вспышка, за которой следует всплеск активности во время сканирования изображения. Изображение автоматически появляется в окне дисплея после завершения сканирования. Затем изображения появляются в папке «Обработка» после каждого нажатия клавиши «s». Видео завершается быстрым просмотром каждого из трех сохраненных изображений.

Шаг 1: Принципиальная схема

Принципиальная электрическая схема
Принципиальная электрическая схема
Принципиальная электрическая схема
Принципиальная электрическая схема
Принципиальная электрическая схема
Принципиальная электрическая схема

Принципиальная схема для всех версий этой камеры показана на фото 1.

На фото 2, 3 показано, как соединяются перемычки-провода и комплектующие.

Без алюминиевого кронштейна изображения лежат на боку.

Предупреждение

Запрограммируйте Arduino ПЕРЕД подключением любых перемычек к микросхеме камеры OV7670. Это предотвратит выход 5-вольтных выводов из предыдущей программы от разрушения микросхемы камеры OV7670 3v3 вольт.

Шаг 2: Список деталей

Список деталей
Список деталей

Следующие детали были получены с

  • 1 только модуль камеры VGA OV7670 300KP для набора для сборки arduino DIY KIT
  • 1 только кронштейн камеры в комплекте с гайками и болтами
  • 1 только UNO R3 для Arduino MEGA328P 100% оригинальный ATMEGA16U2 с USB-кабелем

Следующие детали были получены локально

  • 18 соединительных кабелей Anly Arduino папа-мама
  • 3 только соединительных кабеля Arduinin типа мама-мама
  • 1 только мини-макет
  • 4 резистора только 4 К7 Ом 1/2 Вт
  • 1 только алюминиевая подставка для лома.

Вам также понадобятся следующие спецификации:

  • https://web.mit.edu/6.111/www/f2016/tools/OV7670_20…
  • https://www.haoyuelectronics.com/Attachment/OV7670%…

Шаг 3: теория

Теория
Теория

Микросхема камеры OV7670

По умолчанию выходной сигнал микросхемы камеры OV7670 состоит из видеосигнала YUV (4: 2: 2) и трех временных сигналов. Возможны другие форматы вывода путем программирования внутренних регистров через шину, совместимую с I2C.

Видеосигнал YUV (4: 2: 2) (фото 1) представляет собой непрерывную последовательность монохромных (черно-белых) пикселей, разделенных информацией о цвете U (разница в синем цвете) и V (разница в красном цвете).

Этот выходной формат известен как YUV (4: 2: 2), поскольку каждая группа из 4 байтов содержит 2 монохромных байта и 2 цветных байта.

Монохромный

Чтобы получить монохромное изображение, мы должны выбрать каждый второй байт данных.

Arduino имеет только 2 КБ оперативной памяти, но каждый кадр содержит 640 * 2 * 480 = 307, 200 байтов данных. Если мы не добавим в OV7670 фрейм-граббер, все данные должны посылаться на ПК построчно для обработки.

Есть две возможности:

Для каждого из 480 последовательных кадров мы можем захватить одну строку на Arduino на высокой скорости, прежде чем отправлять ее на ПК со скоростью 1 Мбит / с. Такой подход позволил бы OV7670 работать на полной скорости, но это заняло бы много времени (более минуты).

Подход, который я использовал, заключается в том, чтобы замедлить PCLK до 8uS и отправлять каждый сэмпл по мере его поступления. Этот подход значительно быстрее (6,4 секунды).

Шаг 4: примечания к дизайну

Примечания к дизайну
Примечания к дизайну
Примечания к дизайну
Примечания к дизайну
Примечания к дизайну
Примечания к дизайну

Совместимость

Микросхема камеры OV7670 представляет собой устройство с напряжением 3 В 3 В. В паспорте указано, что напряжение выше 3,5 вольт приведет к повреждению микросхемы.

Чтобы ваш 5-вольтовый Arduino не разрушил микросхему камеры OV7670:

  • Сигнал внешнего тактового сигнала (XCLK) от Arduino должен быть уменьшен до безопасного уровня с помощью делителя напряжения.
  • Внутренние подтягивающие резисторы Arduino I2C на 5 вольт должны быть отключены и заменены внешними подтягивающими резисторами для источника питания 3v3.
  • Запрограммируйте свой Arduino ПЕРЕД подключением любых перемычек, поскольку некоторые из контактов могут быть запрограммированы как выход из более раннего проекта !!! (Я усвоил это на собственном горьком опыте… к счастью, я купил два, так как они были очень дешевыми).

Внешние часы

Для микросхемы камеры OV7670 требуются внешние часы в диапазоне частот от 10 МГц до 24 МГц.

Самая высокая частота, которую мы можем сгенерировать от Arduino 16 МГц, составляет 8 МГц, но, похоже, это работает.

Последовательная ссылка

Для отправки 1 байта данных по последовательному каналу со скоростью 1 Мбит / с (миллион бит в секунду) требуется не менее 10 мкс (микросекунд). На этот раз составлен следующим образом:

  • 8 бит данных (8us)
  • 1 стартовый бит (1uS)
  • 1 стоповый бит (1 мкс)

Внутренние часы

Частота внутренней синхронизации пикселей (PCLK) в OV7670 устанавливается битами [5: 0] в регистре CLKRC (см. Фото 1). [1]

Если мы установим биты [5: 0] = B111111 = 63 и применим его к приведенной выше формуле, тогда:

  • F (внутренние часы) = F (входные часы) / (Бит [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Гц или
  • = 8 мкс

Поскольку мы производим выборку только каждого второго байта данных, интервал PCLK, равный 8 мкс, дает выборку 16 мкс, что является достаточным временем для передачи 1 байта данных (10 мкс), оставляя 6 мкс для обработки.

Частота кадров

Каждый видеокадр VGA состоит из 784 * 510 пикселей (элементов изображения), из которых отображается 640 * 480 пикселей. Поскольку выходной формат YUV (4: 2: 2) имеет в среднем 2 байта данных на пиксель, каждый кадр займет 784 * 2 * 510 * 8 мкс = 6,4 секунды.

Эта камера НЕ быстрая !!!

Горизонтальное позиционирование

Изображение может быть перемещено по горизонтали, если мы изменим значения HSTART и HSTOP, сохраняя при этом разницу в 640 пикселей.

При перемещении изображения влево значение HSTOP может быть меньше значения HSTART!

Не пугайтесь … все это связано с переполнением счетчика, как показано на фото 2.

Регистры

OV7670 имеет 201 восьмибитный регистр для управления такими параметрами, как усиление, баланс белого и экспозиция.

Один байт данных допускает только 256 значений в диапазоне от [0] до [255]. Если нам требуется больший контроль, мы должны каскадировать несколько регистров. Два байта дают нам 65536 возможностей… три байта дают нам 16, 777, 216.

16-битный регистр AEC (автоматический контроль экспозиции), показанный на фото 3, является таким примером и создается путем объединения частей следующих трех регистров.

  • AECHH [5: 0] = AEC [15:10]
  • AECH [7: 2] = AEC [9: 2]
  • COM1 [1: 0] = AEC [1: 0]

Предупреждаем … адреса регистров не сгруппированы вместе!

Побочные эффекты

Низкая частота кадров вызывает ряд нежелательных побочных эффектов:

Для правильной экспозиции OV7670 рассчитывает работать с частотой кадров 30 кадров в секунду (кадров в секунду). Поскольку каждый кадр занимает 6,4 секунды, электронный затвор открывается в 180 раз дольше, чем обычно, что означает, что все изображения будут переэкспонированы, если мы не изменим некоторые значения регистров.

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

Похоже, что длительная выдержка также влияет на данные УФ-излучения. Поскольку мне еще предстоит найти комбинации регистров, которые дают правильные цвета … считаю, что это работа.

Примечание

[1]

Формула, показанная в листе данных (фото 1), верна, но диапазон показывает только биты [4: 0]?

Шаг 5: синхронизация сигналов

Временные формы сигналов
Временные формы сигналов
Временные формы сигналов
Временные формы сигналов
Временные формы сигналов
Временные формы сигналов

Примечание в нижнем левом углу диаграммы «Кадровая синхронизация VGA» (фото 1) гласит:

Для YUV / RGB tp = 2 x TPCLK

Рисунки 1, 2 и 3 проверяют лист (ы) данных и подтверждают, что Omnivision обрабатывает каждые 2 байта данных как эквивалент 1 пикселя.

Осциллограммы осциллографа также подтверждают, что HREF остается НИЗКИМ во время интервалов гашения.

Рис.4 подтверждает, что выходной сигнал XCLK от Arduino составляет 8 МГц. Причина, по которой мы видим синусоиду, а не прямоугольную волну, заключается в том, что все нечетные гармоники невидимы для моего стробоскопического осциллографа с частотой 20 МГц.

Шаг 6: Фрейм-граббер

Фрейм-граббер
Фрейм-граббер

Датчик изображения в микросхеме камеры OV7670 содержит массив размером 656 * 486 пикселей, из которых для фотографии используется сетка размером 640 * 480 пикселей.

Значения регистров HSTART, HSTOP, HREF и VSTRT, VSTOP, VREF используются для позиционирования изображения над датчиком. Если изображение неправильно расположено над датчиком, вы увидите черную полосу по одному или нескольким краям, как описано в разделе «Примечания разработчика».

OV7670 сканирует каждую строку изображения по одному пикселю за раз, начиная с верхнего левого угла до нижнего правого пикселя. Arduino просто передает эти пиксели на ПК по последовательному каналу, как показано на фото 1.

Задача фреймграбберов - захватить каждый из этих 640 * 480 = 307200 пикселей и отобразить содержимое в окне «изображения».

Обработка 3 достигает этого с помощью следующих четырех строк кода !!

Строка кода 1:

byte byteBuffer = новый байт [maxBytes + 1]; // где maxBytes = 307200

Базовый код в этом операторе создает:

  • массив байтов 307201, называемый «byteBuffer [307201]»
  • Дополнительный байт предназначен для символа завершения (перевода строки).

Строка кода 2:

размер (640, 480);

Базовый код в этом операторе создает:

  • переменная с именем «ширина = 640;»
  • переменная с названием «высота = 480»;
  • массив из 307200 пикселей, называемый «пиксели [307200]»
  • окно «изображения» размером 640 * 480 пикселей, в котором отображается содержимое массива пикселей . Это окно «изображения» постоянно обновляется с частотой 60 кадров в секунду.

Строка кода 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Базовый код в этом заявлении:

  • локально буферизует входящие данные, пока не увидит символ «lf» (перевод строки).
  • после чего выгружает первые 307200 байтов локальных данных в массив byteBuffer .
  • Он также сохраняет количество полученных байтов (307201) в переменной с именем «byteCount».

Строка кода 4:

пиксели = цвет (byteBuffer );

При помещении в цикл for-next-loop базовый код этого оператора:

  • копирует содержимое массива «byteBuffer » в массив «пикселей »
  • содержимое которого появляется в окне изображения.

Ключевые штрихи:

Фреймграббер распознает следующие нажатия клавиш:

  • ‘C’ = сделать снимок
  • ‘S’ = сохранить изображение в файл.

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

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

  • «Arduino» с сайта
  • «Java 8» с https://java.com/en/download/ [1]
  • «Обработка 3» с

Установка скетча Arduino:

  • Снимите все перемычки OV7670 [2].
  • Подключите USB-кабель к Arduino.
  • Скопируйте содержимое «OV7670_camera_mono_V2.ino» (прилагается) в «эскиз» Arduino и сохраните.
  • Загрузите эскиз в свой Arduino.
  • Отключите Arduino
  • Теперь вы можете безопасно повторно подключить перемычки OV7670.
  • Снова подключите кабель USB.

Установка и запуск скетча обработки

  • Скопируйте содержимое «OV7670_camera_mono_V2.pde» (прилагается) в «эскиз» обработки и сохраните.
  • Нажмите кнопку «Выполнить» в верхнем левом углу… появится окно с черным изображением.
  • Щелкните по «черному» окну изображения.
  • Нажмите клавишу «c», чтобы сделать снимок. (примерно 6,4 секунды).
  • Нажмите кнопку «s», чтобы сохранить изображение в папке обработки.
  • Повторите шаги 4 и 5.
  • Нажмите кнопку «Стоп», чтобы выйти из программы.

Примечания

[1]

Обработка 3 требует Java 8

[2]

Это «однократный» шаг безопасности, чтобы избежать повреждения микросхемы камеры OV7670.

Пока эскиз «OV7670_camera_mono.ini» не был загружен на ваш Arduino, внутренние подтягивающие резисторы подключены к 5 вольт, плюс есть вероятность того, что некоторые из линий данных Arduino могут иметь выходы 5 вольт… все из которых фатальны для микросхема камеры OV7670 3в3.

После программирования Arduino нет необходимости повторять этот шаг, и значения регистров можно безопасно изменять.

Шаг 8: получение цветного изображения

Получение цветного изображения
Получение цветного изображения
Получение цветного изображения
Получение цветного изображения
Получение цветного изображения
Получение цветного изображения

Следующее программное обеспечение является чисто экспериментальным и размещено в надежде, что некоторые методы окажутся полезными. Цвета кажутся инвертированными… Мне еще предстоит найти правильные настройки регистра. Если вы найдете решение, опубликуйте свои результаты

Если мы хотим получить цветное изображение, необходимо захватить все байты данных и применить следующие формулы.

OV7670 использует следующие формулы для преобразования цветовой информации RGB (красный, зеленый, синий) в YUV (4: 2: 2): [1]

  • Y = 0,31 * R + 0,59 * G + 0,11 * B
  • U = B - Y
  • V = R - Y
  • Cb = 0,563 * (B-Y)
  • Cr = 0,713 * (R-Y)

Следующие формулы могут использоваться для преобразования YUV (4: 2: 2) обратно в цвет RGB: [2]

  • R = Y + 1,402 * (Cr - 128)
  • G = Y - 0,344136 * (Cb -128) - 0,714136 * (Cr -128)
  • В = Y + 1,772 * (CB-128)

Прилагаемое программное обеспечение является просто расширением монохромного программного обеспечения:

  • Запрос на захват «c» отправляется на Arduino.
  • Arduino отправляет на ПК четные (монохромные) байты.
  • ПК сохраняет эти байты в массив
  • Затем Arduino отправляет на ПК байты с нечетными номерами (цветности).
  • Эти байты сохраняются во втором массиве… теперь у нас есть все изображение.
  • Приведенные выше формулы теперь применяются к каждой группе из четырех байтов данных UYVY.
  • Полученные цветные пиксели затем помещаются в массив «пикселей ».
  • ПК сканирует массив «пикселей », и изображение появляется в окне «изображение».

Программа Processing 3 кратко отображает каждое сканирование и окончательные результаты:

  • На фото 1 показаны данные цветности U и V со скана 1.
  • На фото 2 показаны данные яркости Y1 и Y2 из сканирования 2.
  • На фото 3 цветное изображение… только одно не так… сумка должна быть зеленой !!

Я отправлю новый код, как только решу эту программу …

Использованная литература:

[1]

www.haoyuelectronics.com/Attachment/OV7670%… (стр. 33)

[2]

en.wikipedia.org/wiki/YCbCr (преобразование JPEG)

Щелкните здесь, чтобы просмотреть другие мои инструкции.

Рекомендуемые: