Мазмуну:
- 1 -кадам: Райондук диаграмма
- 2 -кадам: Бөлүктөрдүн тизмеси
- 3 -кадам: Теория
- 4 -кадам: Дизайн эскертүүлөрү
- 5 -кадам: Толкун формаларынын убактысы
- 6 -кадам: Frame Grabber
- 7 -кадам: Программалык камсыздоо
- 8 -кадам: Түс сүрөтүн алуу
Video: Өз камераңызды жасаңыз: 8 кадам
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:40
Бул көрсөтмө Omnivision OV7670 сүрөт сенсорун, Arduino микроконтроллерин, бир нече секирүүчү зымдарды жана Processing 3 программасын колдонуу менен кантип монохромдуу камера жасоону түшүндүрөт.
Түстүү сүрөттү алуу үчүн эксперименталдык программалык камсыздоо да көрсөтүлгөн.
640*480 пикселдик сүрөттү тартуу үчүн “c” баскычын басыңыз… сүрөттү файлга сактоо үчүн “s” баскычын басыңыз. Кыска мөөнөттүү тасма жараткыңыз келсе, удаалаш сүрөттөр ырааттуу түрдө номерленет.
Камера тез иштебейт (ар бир сканерлөө 6,4 секундду талап кылат) жана туруктуу жарыкта колдонуу үчүн гана ылайыктуу.
Ардуино менен компьютериңизди кошпогондо, баасы бир чыны кофеге жетпейт.
Сүрөттөр
Өткөргүч зымдары жок компоненттердин бөлүктөрү ачылуучу сүрөттө көрсөтүлгөн.
Экинчи сүрөт-бул Arduino камера программасын жана Processing 3 кадр туткасын көрсөткөн скриншот. Киргизүү камеранын кантип туташканын көрсөтөт.
Видеодо камеранын аракети көрсөтүлөт. "C" басып алуу баскычы басылганда, сканерленип жатканда кыска жарк этип, андан кийин активдүүлүк жарылат. Сүрөт скандоо бүткөндөн кийин дисплей терезесинде автоматтык түрдө пайда болот. Андан кийин сүрөттөр "s" баскычын ар бир басуудан кийин Processing папкасында пайда болот. Видео үч сакталган сүрөттүн ар биринде тез велосипед менен аяктайт.
1 -кадам: Райондук диаграмма
Бул камеранын бардык версияларынын схемасы 1 -сүрөттө көрсөтүлгөн.
2, 3-сүрөттөрдө секирүүчү зымдар менен тетиктер кантип туташканы көрсөтүлгөн.
Алюминий кронштейнсиз сүрөттөр алардын капталында жатат.
Эскертүү
Ардуинону OV7670 камера чипине туташтыруудан мурун программалаңыз. Бул 3v3 вольттогу OV7670 камера чипин жок кылуудан мурунку программанын 5 вольттун чыгышына тоскоол болот.
2 -кадам: Бөлүктөрдүн тизмеси
Төмөнкү бөлүктөр https://www.aliexpress.com/ сайтынан алынды
- 1 гана OV7670 300KP VGA Камера модулу arduino DIY KIT үчүн
- Гайкалар жана болттор менен толукталган 1 гана камера кронштейн
- USB кабели бар arduino MEGA328P 100% түп ATMEGA16U2 үчүн 1 гана UNO R3
Төмөнкү бөлүктөр жергиликтүү түрдө алынган
- 18 anly Arduino эркек-аял секирүүчү кабели
- 3 гана Arduinin аял-аял секирүүчү кабели
- 1 гана кичинекей нан
- 4 гана 4K7 ohm 1/2 watt каршылыгы
- 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 түстүү байт бар.
Бир түстүү
Монохромдуу сүрөттү алуу үчүн биз ар бир экинчи маалыматтын байтына үлгү алышыбыз керек.
An Arduino 2K гана туш келди эс тутумуна ээ, бирок ар бир кадр 640*2*480 = 307, 200 байтты камтыйт. Биз OV7670ге фрейм-грабберди кошпосок, бардык маалыматтар иштөө үчүн PC линиясына жөнөтүлүшү керек.
Эки мүмкүнчүлүк бар:
480 ырааттуу кадрдын ар бири үчүн, биз 1Mbps ылдамдыкта ЖКга жөнөтүүдөн мурун, Arduinoго бир ылдамдыкты жогорку ылдамдыкта түшүрө алабыз. Мындай мамиле OV7670тин толук ылдамдыкта иштеп жатканын көрөт, бирок көп убакытты талап кылат (бир мүнөттөн ашык).
Мен кабыл алган ыкма - PCLKны 8uSке чейин жайлап, ар бир үлгү келгенче жөнөтүү. Бул ыкма кыйла ылдамыраак (6,4 секунд).
4 -кадам: Дизайн эскертүүлөрү
Шайкештик
OV7670 камера чипи 3v3 вольттуу түзмөк. Маалымат баракчасы 3,5 вольттон жогору чыңалуу чипке зыян келтирерин көрсөтөт.
Сиздин 5 вольттуу Arduino OV7670 камера чипин жок кылбашы үчүн:
- Ардуинодон келген тышкы саат (XCLK) сигналы чыңалуу бөлүштүргүч аркылуу коопсуз деңгээлге түшүрүлүшү керек.
- Ички Arduino I2C 5 вольтко чейин тартылуучу резисторлору өчүрүлүп, 3v3 вольттогу тышкы тартма каршылыктарга алмаштырылышы керек.
- Ардуинону ар кандай секирүүчү зымдарды туташтыруудан мурун программалаңыз, анткени кээ бир казыктар мурдагы долбоордун чыгарылышы катары программаланышы мүмкүн !!! (Мен муну кыйын жол менен үйрөндүм … бактыга жараша экөөнү абдан арзан сатып алдым).
Тышкы саат
OV7670 камера чипи 10 МГцтен 24 МГцке чейинки диапазондогу тышкы саатты талап кылат.
Ардуинонун 16 МГцтен түзө турган эң жогорку жыштыгы 8 МГц, бирок бул иштейт окшойт.
Сериялык шилтеме
1 Мбит / сек (секундасына миллион бит) сериялык шилтеме аркылуу 1 маалымат байтын жөнөтүү үчүн кеминде 10 АКШ (микросекунд) талап кылынат. Бул убакыт төмөнкүчө түзүлөт:
- 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 (Automatic Exposure Control) реестри мындай мисал жана кийинки үч реестрдин бөлүктөрүн бириктирүү менен түзүлгөн.
- 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тин боштук аралыгында ТӨМӨН бойдон калаарын текшерет.
Fig.4 Arduino тартып XCLK чыгаруу 8MHz экенин тастыктайт. Квадрат толкунуна караганда, синус толкунун көргөнүбүздүн себеби, бул жердеги бардык гармоникалар менин 20 МГц үлгүдөгү осциллографыма көрүнбөйт.
6 -кадам: Frame Grabber
OV7670 камера чипиндеги сүрөт сенсору 656*486 пикселдик массивден турат, анын 640*480 пикселдүү тору сүрөт үчүн колдонулат.
HSTART, HSTOP, HREF жана VSTRT, VSTOP, VREF регистринин мааниси сүрөттү сенсордун үстүнө жайгаштыруу үчүн колдонулат. Эгерде сүрөт сенсордун үстүнө туура жайгаштырылбаса, "Дизайн эскертүүлөрү" бөлүмүндө түшүндүрүлгөндөй, бир же бир нече четинен кара боону көрөсүз.
OV7670 сүрөттүн ар бир сапын бирден пикселден сол бурчтан баштап, төмөнкү оң пикселге чейин сканерлейт. Arduino жөн гана 1 -сүрөттө көрсөтүлгөндөй сериялык шилтеме аркылуу бул пикселдерди ЖКга өткөрүп берет.
Frame-grabbersтин милдети-бул 640*480 = 307200 пикселдин ар бирин тартуу жана мазмунун "сүрөт" терезесинде көрсөтүү.
Processing 3 муну төмөнкү төрт сап кодду колдонуу менен ишке ашырат !!
Код линиясы 1:
байт byteBuffer = жаңы байт [maxBytes+1]; // бул жерде maxBytes = 307200
Бул билдирүүдөгү негизги кодду жаратат:
- 307201 байт массиви "byteBuffer [307201]" деп аталат
- Кошумча байт токтотуу (linefeed) белгиси үчүн.
Код 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/en/main/software "Arduino"
- "Java 8" https://java.com/en/download/ [1]
- 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 камера чипине зыян келтирбөө үчүн "бир гана жолу" коопсуздук кадамы.
"OV7670_camera_mono.ini" эскизи сиздин Arduinoго жүктөлмөйүнчө, ички тартуучу резисторлор 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 сканерлөөдөн U & V хрома маалыматтарын көрсөтөт
- Сүрөт 2 Y1 & Y2 сканерлөөдөн 2 жарыктыгын көрсөтөт
- 3 -сүрөт түстүү сүрөттү көрсөтөт … бир гана нерсе туура эмес … баштык жашыл болушу керек !!
Мен бул программаны чечкенден кийин жаңы кодду коём …
Шилтемелер:
[1]
www.haoyuelectronics.com/Attachment/OV7670%… (33 -бет)
[2]
en.wikipedia.org/wiki/YCbCr (JPEG конверсиясы)
Менин башка көрсөтмөлөрүмдү көрүү үчүн бул жерди басыңыз.
Сунушталууда:
Өзүңүздүн үстүңкү камераңызды LED жарыгы менен жасаңыз!: 5 кадам (сүрөттөр менен)
Өзүңүздүн үстүңкү камераңызды LED жарыгы менен жасаңыз!: Бул долбоордо мен сизге жөнөкөй камералык камераны кантип түзүүнү көрсөтөм. Түзмөк камераны сиз түшүргүңүз келген нерсенин үстүндө гана кармап тура албайт, бирок ошондой эле кадрларды жана LED жарыгын байкоочу монитор бар
Бөтөлкө тыгыны менен өзүңүздүн камераңызды монопод кылыңыз: 3 кадам
Бөтөлкө тыгыны менен өзүңүздүн жеке камераңызды монопод кылыңыз: Бул окуу куралын жасоо ушунчалык оңой жана абдан арзан. Ийгиликке жетиш үчүн сизге 6 мм узундуктагы штатив винти (1/4 ") жана бөтөлкө тыгын керек. МААНИЛҮҮ. Бул үчүн бурамада экстакт жип болушу керек, болбосо камераңыздын жиптерин жок кыласыз
Камераңызды вебкамера катары кантип колдонуу керек: 4 кадам
Видеокамераңызды веб -камера катары кантип колдонуу керек: Эгерде сиз мага окшош болсоңуз, сиздин үйүңүздөн көчүп кеткен, миңдеген километр алыстыкта жашаган досторуңуз көп, же сиз университетте окуган досторуңуз бар. ар кандай жерлер. Жеке мен телефондорду жана башка нерселерди жек көрөм
Планетаны жана Чөнтөгүңүздү сактаңыз. $$ Сиздин арзан P&S санарип камераңызды кайра заряддалуучуга айландырыңыз: 4 кадам (сүрөттөр менен)
Планетаны жана Чөнтөгүңүздү сактаңыз. $$ Сиздин арзан P&S санарип камераңызды кайра заряддалуучуга айландырыңыз: Бир нече жыл мурун мен Dolphin Jazz 2.0 Megapixel Digital Camera.It жакшы өзгөчөлүктөргө жана баага ээ болгон. Ошондой эле AAA Bateries үчүн табити бар болчу. Эч ким кыйынчылыктан алыстап кетпейт, мен аны текке кетирбөө үчүн кайра заряддалуучу батареяны колдонуу үчүн өзгөртөм деп ойлогом
Строб дубалы же бир жолу колдонулуучу камераңызды кантип кайра иштетүү керек: 6 кадам
Строб дубалы же бир жолу колдонулуучу камераңызды кантип кайра иштетүү керек: бул көрсөтмө сизге бир жолу колдонулуучу камераларды оңой кайра колдонууну жана жаркыраган дубалга айлантууну көрсөтөт. сен да ташта. Бул өкүнүчтүү, анткени бул бөлүк дагы эле тартипте