Мазмұны:
- 1 -қадам: схема
- 2 -қадам: бөлшектер тізімі
- 3 -қадам: Теория
- 4 -қадам: Дизайн жазбалары
- 5 -қадам: Толқындардың уақыттық формалары
- 6 -қадам: Frame Grabber
- 7 -қадам: Бағдарламалық қамтамасыз ету
- 8 -қадам: Түсті кескінді алу
Бейне: Өз камераңызды жасаңыз: 8 қадам
2024 Автор: John Day | [email protected]. Соңғы өзгертілген: 2024-01-30 10:25
Бұл нұсқаулықта Omnivision OV7670 сурет сенсоры, Arduino микроконтроллері, бірнеше секіргіш сымдар және Processing 3 бағдарламалық жасақтамасының көмегімен монохромды камераны қалай жасау керектігі түсіндірілген.
Түсті бейнені алуға арналған эксперименттік бағдарламалық қамтамасыз ету де ұсынылған.
640*480 пиксельді суретке түсіру үшін «c» пернесін басыңыз … суретті файлға сақтау үшін «s» пернесін басыңыз. Қысқа мерзімді фильм түсіргіңіз келсе, кезекті суреттер нөмірленеді.
Камера жылдам емес (әр сканерлеу 6,4 секундты алады) және тек тұрақты жарықтандыруда қолдануға жарамды.
Сіздің Arduino мен компьютеріңізді қоспағанда, бір шыныаяқ кофеден аз.
Суреттер
Өткізгіш сымдары жоқ компоненттер бөлшектері бастапқы суретте көрсетілген.
Екінші фото-бұл Arduino камералық бағдарламалық жасақтамасы мен Processing 3 жақтағышын көрсететін скриншот. Кірістіру камераның қалай қосылғанын көрсетеді.
Бейнеде камераның әрекеті көрсетілген. «C» түсіру пернесі басылған кезде суреттің сканерленуі кезінде қысқа жарқыл пайда болады, содан кейін белсенділік байқалады. Сканерлеу аяқталғаннан кейін сурет автоматты түрде дисплей терезесінде пайда болады. Содан кейін суреттер «s» пернесін әр басқаннан кейін өңдеу қалтасында пайда болады. Бейне сақталған үш суреттің әрқайсысында жылдам велосипедпен аяқталады.
1 -қадам: схема
Бұл камераның барлық нұсқаларына арналған схема 1 -суретте көрсетілген.
2, 3 фотосуреттерде сымдар мен компоненттердің қалай қосылғанын көрсетеді.
Алюминий жақшасыз суреттер бүйірінде жатыр.
Ескерту
Arduino -ны OV7670 камера чипіне кез келген қосқыш сымдарды қоспас бұрын бағдарламалаңыз. Бұл алдыңғы бағдарламаның 5 вольтты шығыс түйреуіштерінің 3в3 вольтты OV7670 камера чипін бұзуына жол бермейді.
2 -қадам: бөлшектер тізімі
Келесі бөліктер https://www.aliexpress.com/ сайтынан алынды.
- Arduino DIY KIT үшін тек 1 OV7670 300KP VGA камера модулі
- Гайкалар мен болттармен жабдықталған 1 камералық кронштейн
- USB кабелі бар arduino MEGA328P 100% түпнұсқалық ATMEGA16U2 үшін тек 1 UNO R3
Келесі бөліктер жергілікті түрде алынды
- 18 anly Arduino еркек-әйел секіргіш кабельдері
- 3 тек Arduinin әйел-әйел секіргіш кабельдері
- 1 ғана шағын нан
- 4 4K7 ohm 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 кадрдың әрқайсысы үшін біз 1 Мбит / с жылдамдықпен ДК -ге жібермес бұрын Arduino -ға жоғары жылдамдықпен бір жолды түсіре аламыз. Мұндай көзқарас OV7670 толық жылдамдықта жұмыс істейтінін көреді, бірақ көп уақытты алады (бір минуттан артық).
Мен қабылдаған әдіс - бұл PCLK -ді 8uS -ке дейін баяулату және әр үлгіні қажет болғанда жіберу. Бұл тәсіл айтарлықтай жылдам (6,4 секунд).
4 -қадам: Дизайн жазбалары
Үйлесімділік
OV7670 камералық микросхемасы - бұл 3в3 вольтты құрылғы. Деректер парағы 3,5 вольттан жоғары кернеудің чипті зақымдайтынын көрсетеді.
5 вольтты Arduino OV7670 камера чипін бұзбау үшін:
- Ардуинодан шығатын сыртқы сағат (XCLK) сигналы кернеуді бөлгіш көмегімен қауіпсіз деңгейге дейін төмендетілуі тиіс.
- Ішкі Arduino I2C 5 вольтты тартқыш резисторларын ажырату керек және оларды 3в3 вольтты сыртқы тартқыш резисторлармен ауыстыру керек.
- Arduino-ны кез келген қосқыш сымдарды қосар алдында бағдарламалаңыз, себебі кейбір түйреуіштер бұрынғы жобаның шығысы ретінде бағдарламалануы мүмкін !!! (Мен мұны қиын жолмен үйрендім … Бақытымызға орай, мен екеуін арзанға сатып алдым).
Сыртқы сағат
OV7670 камера чипі 10 МГц -тен 24 МГц жиілік диапазонында сыртқы сағатты қажет етеді.
Біз 16 МГц Arduino -дан шығара алатын ең жоғары жиілік - 8 МГц, бірақ бұл жұмыс істейтін сияқты.
Сериялық сілтеме
1 Мбит / с (секундына миллион бит) сериялық сілтеме бойынша 1 байтты жіберу үшін кемінде 10 US (микросекунд) қажет. Бұл уақыт келесі түрде жасалады:
- 8 бит биті (8us)
- 1 бастапқы бит (1uS)
- 1 тоқтайтын бит (1uS)
Ішкі сағат
OV7670 ішіндегі ішкі пиксельдік сағат (PCLK) жиілігі CLKRC регистрінде [5: 0] биттермен орнатылады (1 суретті қараңыз). [1]
Егер біз биттерді [5: 0] = B111111 = 63 орнатып, оны жоғарыдағы формулаға қолдансақ, онда:
- F (ішкі сағат) = F (кіріс сағаты)/(Бит [5: 0} +1)
- = 8000000/(63+1)
- = 125000 Гц немесе
- = 8uS
Біз тек әрбір екінші байт үлгісін таңдайтындықтан, 8uS PCLK интервалы 16uS үлгісіне әкеледі, бұл 1 байт (10uS) өңдеу үшін 6uS қалдыруға жеткілікті уақыт.
Кадр жиілігі
Әрбір VGA бейне кадры 784*510 пиксельден тұрады (сурет элементтері), оның ішінде 640*480 пиксель көрсетіледі. YUV (4: 2: 2) шығыс пішімінде бір пиксель үшін орташа 2 байт дерек болғандықтан, әр кадрға 784*2*510*8 uS = 6,4 секунд қажет болады.
Бұл камера жылдам емес !!!
Көлденең орналасу
Егер біз 640 пиксельдік айырмашылықты сақтай отырып, HSTART және HSTOP мәндерін өзгертсек, кескінді көлденең жылжытуға болады.
Кескінді солға жылжытқанда, HSTOP мәні HSTART мәнінен төмен болуы мүмкін!
Алаңдамаңыз … мұның бәрі 2 -суретте көрсетілгендей есептегіштердің толып кетуіне байланысты.
Регистрлер
OV7670-те кірістілік, ақ түс балансы және экспозиция сияқты заттарды басқаруға арналған 201 сегіз биттік регистр бар.
Бір деректер байты тек [0] мен [255] аралығында 256 мәнге рұқсат береді. Егер бізге көбірек бақылау қажет болса, онда біз бірнеше регистрлерді каскадтауымыз керек. Екі байт бізге 65536 мүмкіндік береді … үш байт бізге 16, 777, 216 береді.
3 -суретте көрсетілген 16 биттік AEC (Экспозицияны автоматты түрде бақылау) тізімі осындай мысал болып табылады және келесі үш регистрдің бөліктерін біріктіру арқылы жасалады.
- 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 Frame Timing» диаграммасының төменгі сол жақ бұрышындағы жазбада (сурет 1):
YUV/RGB үшін tp = 2 x TPCLK
1, 2 және 3 -суреттер мәліметтер парағын тексереді және Omnivision әрбір 2 байтты 1 пиксельге тең деп қарастыратынын растайды.
Осциллографтың толқындық формалары, сондай -ақ, HREF -тің бос уақыт аралығында LOW болып қалатынын тексереді.
4 -сурет Arduino -дан XCLK шығысы 8 МГц екенін растайды. Біз шаршы толқыннан гөрі, толқынды көрудің себебі, барлық тақ гармоникалар менің 20 МГц іріктеу осциллографына көрінбейді.
6 -қадам: Frame Grabber
OV7670 камера чипіндегі кескін сенсоры 656*486 пиксельді массивтен тұрады, оның ішінде фотосурет үшін 640*480 пиксельдік тор қолданылады.
HSTART, HSTOP, HREF және VSTRT, VSTOP, VREF регистрінің мәндері суретті сенсордың үстіне орналастыру үшін қолданылады. Егер сурет сенсордың үстіне дұрыс орналастырылмаса, сіз «Дизайн жазбалары» бөлімінде түсіндірілгендей бір немесе бірнеше жиектерінде қара жолақты көресіз.
OV7670 суреттің әр жолын бір пиксельден сол жақ жоғарғы бұрыштан бастап оң жақ төменгі пиксельге жеткенше сканерлейді. Arduino бұл пикселдерді компьютерге 1 -суретте көрсетілгендей сериялық сілтеме арқылы береді.
Кадрларды ұстаушылардың міндеті-бұл 640*480 = 307200 пиксельдердің әрқайсысын түсіру және мазмұнын «сурет» терезесінде көрсету.
3 -ші процесс келесі төрт код жолын қолдана отырып қол жеткізеді !!
1 -код жолы:
байт 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» (linefeed) таңбасын көрмейінше, кіріс деректерін жергілікті түрде буферлейді.
- содан кейін ол жергілікті мәліметтердің алғашқы 307200 байтын byteBuffer массивіне тастайды.
- Ол сондай -ақ алынған байт санын (307201) «byteCount» деп аталатын айнымалыға сақтайды.
4 -код жолы:
пиксельдер = түсі (byteBuffer );
Келесі циклге орналастырылғанда, осы мәлімдемеде негізгі код:
- “byteBuffer ” массивінің мазмұнын “пиксел ” массивіне көшіреді
- мазмұны сурет терезесінде пайда болады.
Негізгі соққылар:
Frame-grabber келесі пернелер тіркесімін таниды:
- 'C' = суретті түсіру
- 'S' = суретті файлға сақтау.
7 -қадам: Бағдарламалық қамтамасыз ету
Егер орнатылмаған болса, келесі бағдарламалық пакеттердің әрқайсысын жүктеңіз және орнатыңыз:
- Https://www.arduino.cc/kz/main/software сайтынан «Arduino»
- Https://java.com/kz/download/ [1] сайтындағы «Java 8»
- Https://processing.org/download/ сайтынан «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 камера чипіне зақым келтірмеу үшін «бір рет» қауіпсіздік қадамы.
Arduino-ға «OV7670_camera_mono.ini» эскизі жүктелмейінше, ішкі тартқыш резисторлар 5 вольтке қосылады, сонымен қатар Arduino деректер желілерінің кейбірінде 5 вольтты шығыс болуы мүмкін … олардың барлығы өлімге әкеледі 3V3 вольтты OV7670 камералық чип.
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 тақ санды (хромалық) байтты компьютерге жібереді.
- Бұл байттар екінші массивке сақталады … қазір бізде бүкіл кескін бар.
- Жоғарыда келтірілген формулалар енді UYVY деректерінің төрт байтының әр тобына қолданылады.
- Алынған түс пикселдері «пиксель » массивіне орналастырылады
- ДК «пиксель » жиынын сканерлейді және «кескін» терезесінде сурет пайда болады.
Processing 3 бағдарламасы әр сканерлеуді және соңғы нәтижелерді қысқаша көрсетеді:
- 1 -суретте 1 -сканерлеу кезіндегі U & V хромасының деректері көрсетілген
- 2 -суретте 2 -сканерлеудегі Y1 және Y2 жарықтығы туралы деректер көрсетілген
- 3 -суретте түрлі -түсті суреттер көрсетілген … бір ғана нәрсе дұрыс емес … қап жасыл болуы керек !!
Мен бұл бағдарламаны шешкеннен кейін жаңа кодты жіберемін …
Әдебиеттер:
[1]
www.haoyuelectronics.com/Attachment/OV7670%… (33 -бет)
[2]
kk.wikipedia.org/wiki/YCbCr (JPEG түрлендіру)
Менің басқа нұсқауларды көру үшін мына жерді басыңыз.
Ұсынылған:
Оңай қадам бойынша жеке іске қосу пәрменін жасаңыз: 4 қадам
Өзіңіздің жеке пәрменіңізді қарапайым қадаммен жасаңыз: мұнда мен Windows OS жүйесінде өзіңіздің жеке пәрменді қалай құруға болатынын көрсетемін. Іс жүзінде терезелердегі бұл мүмкіндік өте жақсы, бұл сіздің қосымшалар терезесін бірден ашуға пайдалы. Енді сіз кез келген қосымшаны ашу үшін өз пәрменіңізді жасай аласыз
Бөтелке тығынмен жеке камераңызды моноподқа айналдырыңыз: 3 қадам
Бөтелке тығынмен өз камераңызды моноподқа айналдырыңыз: Бұл оқулықты орындау өте оңай, сонымен қатар өте арзан. Табысқа жету үшін сізге ұзындығы 6 мм штативті бұранда (1/4 «) және бөтелке тығын қажет. МАҢЫЗДЫ. Ол үшін сізге бұрандада жіп болуы керек, әйтпесе сіз камераның жіптерін бұзасыз
Ойнату карталарымен MP3 ойнатқыш корпусын жасаңыз және жасаңыз: 9 қадам
Ойнату карталарымен MP3 ойнатқыш корпусын жасаңыз және жасаңыз: Менің MP3 ойнатқышым танымал емес болып шыққандықтан, бірнеше компания бұл жағдайды жасады және менің таңдауымды ұнатпады, мен өзім жасауға шешім қабылдадым. Нашар идеялардан, жақсы идеялардан, сәтсіз және жартылай аяқталған істерден кейін мен ақырында біреуін жасадым
Планетаны және қалтаңызды сақтаңыз. $$ Сіздің арзан P&S сандық камераңызды қайта зарядтауға ауыстырыңыз: 4 қадам (суреттермен)
Планетаны және қалтаңызды сақтаңыз. $$ Сіздің арзан P&S сандық камераңызды қайта зарядтауға ауыстырыңыз: Бірнеше жыл бұрын мен Dolphin Jazz 2.0 мегапиксельді сандық камераны сатып алдым. Бұл сонымен қатар AAA Bateries -ке тәбеті болды. Қиындықтан қашып кететін ешкім жоқ, мен оны қайта зарядталатын батареяны ысырап етуді тоқтату үшін өзгертемін деп ойладым
Кішкентай робот жасаңыз: ұстағышпен әлемдегі ең кішкентай дөңгелекті робот жасаңыз.: 9 қадам (суреттермен)
Өте кішкентай робот жасаңыз: ұстағышпен әлемдегі ең кішкентай доңғалақты роботты жасаңыз: ұсақ заттарды алып, жылжыта алатын 1/20 текше дюймдік робот жасаңыз. Оны Picaxe микроконтроллері басқарады. Қазіргі уақытта бұл менің ойымша, бұл әлемдегі ең кішкентай доңғалақты робот болуы мүмкін. Бұл сөзсіз