Съдържание:

Направете своя собствена камера: 8 стъпки
Направете своя собствена камера: 8 стъпки

Видео: Направете своя собствена камера: 8 стъпки

Видео: Направете своя собствена камера: 8 стъпки
Видео: Ново! Най-евтината охранителна камера за проследяване на хора Icsee Xmeye 2024, Юли
Anonim
Image
Image
Направете своя собствена камера
Направете своя собствена камера

Тази инструкция обяснява как да направите монохромна камера, използвайки сензор за изображение Omnivision OV7670, микроконтролер Arduino, няколко джъмперни проводника и софтуер Processing 3.

Представен е и експериментален софтуер за получаване на цветно изображение.

Натиснете клавиша “c”, за да заснемете изображение с 640*480 пиксела … натиснете клавиша “s”, за да запазите изображението във файл. Последователните изображения се номерират последователно, ако искате да създадете кратък филм с интервал.

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

Цената, с изключение на вашия Arduino и компютър, е по -малка от чаша кафе.

Изображения

Компонентните части, без свързващи проводници, са показани на снимката на отварянето.

Втората снимка е екранна снимка, показваща софтуера на камерата Arduino и захващащия кадър Processing 3. Вмъкването показва как е свързана камерата.

Видеото демонстрира камерата в действие. Когато се натисне клавишът за заснемане „c“, има кратка мига, последвана от изблик на активност, докато изображението се сканира. Изображението автоматично се появява в прозореца на дисплея, след като сканирането приключи. След това изображенията се виждат в папката Processing след всяко натискане на клавиша „s“. Видеоклипът завършва с бързо преминаване през всяко от трите запазени изображения.

Стъпка 1: Електрическа схема

Електрическа схема
Електрическа схема
Електрическа схема
Електрическа схема
Електрическа схема
Електрическа схема

Схемата за всички версии на тази камера е показана на снимка 1.

Снимки 2, 3 показват как са свързани джъмперите и проводниците и компонентите.

Без алуминиевата скоба изображенията лежат на една страна.

Внимание

Програмирайте вашия Arduino ПРЕДИ да прикрепите джъмперни проводници към чипа на камерата OV7670. Това ще попречи на 5 -волтовите изходни щифтове от предишна програма да унищожат 3v3 -волтовия чип на камерата OV7670.

Стъпка 2: Списък на частите

Списък с части
Списък с части

Следните части са получени от

  • 1 само OV7670 300KP VGA камера модул за arduino DIY KIT
  • 1 само скоба за камера, пълна с гайки и болтове
  • 1 само UNO R3 за arduino MEGA328P 100% оригинален ATMEGA16U2 с USB кабел

Следните части са получени локално

  • 18 anly Arduino джъмперни кабела за мъже и жени
  • 3 само кабели от женски и женски джъмпери Arduinin
  • 1 само мини дъска за хляб
  • 4 само 4K7 ома 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) видео сигнал и 3 синхронизиращи сигнала. Други изходни формати са възможни чрез програмиране на вътрешните регистри чрез I2C съвместима шина.

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

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

Едноцветен

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

Arduino има само 2K памет с произволен достъп, но всеки кадър съдържа 640*2*480 = 307, 200 байта данни. Освен ако не добавим кадър-грайфер към OV7670, всички данни трябва да се изпращат на компютъра ред по ред за обработка.

Има две възможности:

За всеки от 480 последователни кадъра можем да заснемем един ред към Arduino с висока скорост, преди да го изпратим на компютъра при 1Mbps. Подобен подход би видял OV7670 да работи на пълни обороти, но ще отнеме много време (доста повече от минута).

Подходът, който съм предприел, е да забавя PCLK до 8uS и да изпращам всяка проба, както идва. Този подход е значително по -бърз (6,4 секунди).

Стъпка 4: Бележки за дизайна

Бележки за дизайна
Бележки за дизайна
Бележки за дизайна
Бележки за дизайна
Бележки за дизайна
Бележки за дизайна

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

Чипът на камерата OV7670 е устройство 3v3 волта. Информационният лист показва, че напрежения над 3,5 волта ще повредят чипа.

За да предотвратите 5 -волтовия Arduino да унищожи чипа на камерата OV7670:

  • Сигналът на външния часовник (XCLK) от Arduino трябва да бъде намален до безопасно ниво с помощта на делител на напрежение.
  • Вътрешните издърпващи резистори на Arduino I2C до 5 волта трябва да бъдат деактивирани и заменени с външни издърпващи се резистори към захранването 3v3 волта.
  • Програмирайте своя Arduino ПРЕДИ да прикрепите джъмперни проводници, тъй като някои от щифтовете все още могат да бъдат програмирани като изход от по-ранен проект !!! (Научих това по трудния начин … за щастие купих две, тъй като бяха толкова евтини).

Външен часовник

Чипът на камерата OV7670 изисква външен часовник в честотния диапазон от 10Mhz до 24MHz.

Най -високата честота, която можем да генерираме от 16MHz Arduino, е 8MHz, но това изглежда работи.

Сериен линк

Необходими са поне 10 uS (микросекунди) за изпращане на 1 байт данни по 1Mbps (милион бита в секунда) последователна връзка. Това време е съставено по следния начин:

  • 8 бита данни (8us)
  • 1 начален бит (1uS)
  • 1 стоп-бит (1uS)

Вътрешен часовник

Вътрешната честота на пиксела (PCLK) в OV7670 се задава с битове [5: 0] в регистър CLKRC (виж снимка 1). [1]

Ако зададем битове [5: 0] = B111111 = 63 и го приложим към горната формула, тогава:

  • F (вътрешен часовник) = F (входен часовник)/(Бит [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz или
  • = 8uS

Тъй като ние вземаме проби от всеки втори байт данни, PCLK интервал от 8uS води до 16uS проба, която е достатъчно време за предаване на 1 байт данни (10uS), оставяйки 6uS за обработка.

Скорост на кадрите

Всеки VGA видео кадър съдържа 784*510 пиксела (елементи на картината), от които 640*480 пиксела се показват. Тъй като изходният формат YUV (4: 2: 2) има средно 2 байта данни на пиксел, всеки кадър ще отнеме 784*2*510*8 uS = 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 (автоматичен контрол на експозицията) на нула. Въпреки това е необходим филтър с неутрална плътност пред обектива, когато осветлението е силно.

Изглежда, че продължителната експозиция също влияе върху UV данните. Тъй като все още не съм намерил комбинации от регистри, които дават правилни цветове … считам това за незавършена работа.

Забележка

[1]

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

Стъпка 5: График на вълновите форми

Времеви форми на вълната
Времеви форми на вълната
Времеви форми на вълната
Времеви форми на вълната
Времеви форми на вълната
Времеви форми на вълната

Бележката в долния ляв ъгъл на диаграмата „VGA Frame Timing“(снимка 1) гласи:

За YUV/RGB, tp = 2 x TPCLK

Фигури 1, 2 и 3 проверяват информационния лист (и) и потвърждават, че Omnivision третира всеки 2 байта данни като еквивалент на 1 пиксел.

Формите на осцилоскопа също така потвърждават, че HREF остава НИСКИ по време на интервалите на заглушаване.

Фиг.4 потвърждава, че изходът XCLK от Arduino е 8MHz. Причината, поради която виждаме синусоида, а не квадратна вълна, е, че всички нечетни хармоници са невидими за моя осцилоскоп за вземане на проби от 20 MHz.

Стъпка 6: Frame Grabber

Frame Grabber
Frame Grabber

Сензорът за изображение в чип на камера 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);

Основният код в това изявление създава:

  • променлива, наречена „width = 640;“
  • променлива, наречена „височина = 480“;
  • масив от 307200 пиксела, наречен „пиксели [307200]”
  • прозорец с изображение „640*480 пиксела“, в който се показва съдържанието на масив от пиксели . Този прозорец „изображение“непрекъснато се обновява със скорост на кадрите 60 кадъра в секунда.

Код ред 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Основният код в това изявление:

  • буферира входящите данни локално, докато види символ „lf“(подаване на линия).
  • след което изхвърля първите 307200 байта локални данни в масива byteBuffer .
  • Той също така записва броя на получените байтове (307201) в променлива, наречена „byteCount“.

Код ред 4:

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

Когато е поставен в цикъл for-next, основният код в това изявление:

  • копира съдържанието на масива „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 3v3 волта.

След като 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)
  • B = Y + 1,772*(Cb -128)

Приложеният софтуер е просто разширение на монохромния софтуер:

  • Искане за улавяне „c“се изпраща към Arduino
  • Arduino изпраща четните (монохромни) байтове към компютъра
  • Компютърът записва тези байтове в масив
  • След това Arduino изпраща нечетните байтове (chroma) към компютъра.
  • Тези байтове се записват във втори масив … сега имаме цялото изображение.
  • Горните формули сега се прилагат към всяка група от четири 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)

Щракнете тук, за да видите другите ми инструкции.

Препоръчано: