Mundarija:

O'z kamerangizni yarating: 8 qadam
O'z kamerangizni yarating: 8 qadam

Video: O'z kamerangizni yarating: 8 qadam

Video: O'z kamerangizni yarating: 8 qadam
Video: Зарабатывайте $ 80,00 + БЕСПЛАТНО И ЛЕГКО со своим телефон... 2024, Noyabr
Anonim
Image
Image
O'z kamerangizni yarating
O'z kamerangizni yarating

Bu yo'riqnomada Omnivision OV7670 tasvir sensori, Arduino mikrokontroller, bir nechta o'tish simlari va Processing 3 dasturi yordamida monoxromli kamerani qanday yasash kerakligi tushuntiriladi.

Rangli tasvirni olish uchun eksperimental dasturiy ta'minot ham taqdim etilgan.

640*480 pikselli tasvirni olish uchun "c" tugmachasini bosing, tasvirni faylga saqlash uchun "s" tugmasini bosing. Agar siz qisqa muddatli film yaratmoqchi bo'lsangiz, ketma-ket tasvirlar ketma-ket raqamlanadi.

Kamera tez emas (har bir ko'rish 6,4 soniyani oladi) va faqat sobit yoritishda foydalanish uchun mos keladi.

Arduino va shaxsiy kompyuteringizdan tashqari, bir chashka qahva kamroq bo'ladi.

Rasmlar

O'tish simlari bo'lmagan komponentlar ochilish fotosuratida ko'rsatilgan.

Ikkinchi fotosurat-bu Arduino kamerasi uchun dasturiy ta'minot va Processing 3 ramka ushlagichi tasvirlangan skrinshot. Qo'shiq kameraning qanday ulanganligini ko'rsatadi.

Videoda kameraning harakatlanishi ko'rsatilgan. "C" ta'qib qilish tugmachasi bosilganda, qisqa flaş paydo bo'ladi, keyin tasvirni skanerlash paytida faollik boshlanadi. Rasm skanerlash tugagandan so'ng avtomatik ravishda displey oynasida paydo bo'ladi. Keyin tasvirlar "s" tugmachasini har bosish bilan ishlov berish papkasida paydo bo'ladi. Videotasvir uchta saqlangan tasvirning har biri bo'ylab tez velosipedda o'tish bilan yakunlanadi.

1 -qadam: O'chirish diagrammasi

O'chirish diagrammasi
O'chirish diagrammasi
O'chirish diagrammasi
O'chirish diagrammasi
O'chirish diagrammasi
O'chirish diagrammasi

Ushbu kameraning barcha versiyalari uchun sxemasi 1 -rasmda ko'rsatilgan.

2, 3-rasmlarda o'tish simlari va komponentlari qanday ulanganligi ko'rsatilgan.

Alyuminiy qavssiz tasvirlar yon tomonda yotadi.

Ogohlantirish

Arduino -ni OV7670 kamera chipiga ulanishdan oldin dasturlashtiring. Bu oldingi dasturdagi 5 voltli chiqish pinlarining 3v3 voltli OV7670 kamera chipini yo'q qilishining oldini oladi.

2 -qadam: qismlar ro'yxati

Qismlar ro'yxati
Qismlar ro'yxati

Quyidagi qismlar https://www.aliexpress.com/ saytidan olingan.

  • Arduino DIY KIT uchun faqat bitta OV7670 300KP VGA kamera moduli
  • 1 ta yong'oq va murvat bilan jihozlangan faqat kamera ushlagichi
  • USB kabel bilan 100% original ATMEGA16U2 arduino MEGA328P uchun faqat bitta UNO R3

Quyidagi qismlar mahalliy darajada olingan

  • 18 ta Arduino erkak va ayol o'tish kabeli
  • 3 faqat Arduinin ayol-ayol o'tish kabeli
  • 1 ta mini non paneli
  • 4 ta faqat 4K7 ohm 1/2 vattli rezistorlar
  • Faqat 1 ta alyuminiy stend.

Shuningdek, sizga quyidagi ma'lumotlar jadvallari kerak bo'ladi:

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

3 -qadam: nazariya

Nazariya
Nazariya

OV7670 kamera chipi

OV7670 kamera chipining standart chiqishi YUV (4: 2: 2) video signalini va 3 ta to'lqin shaklini o'z ichiga oladi. Boshqa chiqish formatlari I2C mos keladigan avtobus orqali ichki registrlarni dasturlash orqali mumkin.

YUV (4: 2: 2) video signal (1 -rasm) - U (ko'k rang farqi) va V (qizil rang farqi) rang ma'lumotlari bilan ajratilgan monoxrom (qora va oq) piksellarning uzluksiz ketma -ketligi.

Bu chiqish formati YUV (4: 2: 2) deb nomlanadi, chunki har bir 4 baytli guruh 2 ta monoxromli bayt va 2 ta rangli baytni o'z ichiga oladi.

Bir rangli

Monoxrom tasvirni olish uchun biz har ikkinchi ma'lumot baytidan namuna olishimiz kerak.

Arduino -da faqat 2K tasodifiy kirish xotirasi bor, lekin har bir kadr 640*2*480 = 307, 200 baytdan iborat. Agar biz OV7670-ga ramka ushlagichini qo'shmasak, barcha ma'lumotlar qayta ishlash uchun kompyuterga ketma-ket yuborilishi kerak.

Ikkita imkoniyat bor:

Har bir ketma -ket 480 kadr uchun biz Arduino -ga bitta chiziqni kompyuterga 1 Mbit / s tezlikda yuborishdan oldin yuqori tezlikda olishimiz mumkin. Bunday yondashuv OV7670 to'liq tezlikda ishlashini ko'radi, lekin ko'p vaqt talab etiladi (bir daqiqadan ko'proq).

Men qabul qilgan yondashuv - bu PCLKni 8uS ga tushirish va har bir namunani kelganda yuborish. Bu yondashuv ancha tezroq (6,4 soniya).

4 -qadam: Dizayn bo'yicha eslatmalar

Dizayn bo'yicha eslatmalar
Dizayn bo'yicha eslatmalar
Dizayn bo'yicha eslatmalar
Dizayn bo'yicha eslatmalar
Dizayn bo'yicha eslatmalar
Dizayn bo'yicha eslatmalar

Muvofiqlik

OV7670 kamera chipi - 3v3 voltli qurilma. Ma'lumotlar varag'i 3,5 voltdan yuqori kuchlanish chipga zarar etkazishini ko'rsatadi.

5 voltli Arduino OV7670 kamera chipini yo'q qilishining oldini olish uchun:

  • Arduino tashqi signalini (XCLK) kuchlanish bo'luvchi yordamida xavfsiz darajaga tushirish kerak.
  • Ichki Arduino I2C 5 voltli tortishish rezistorlari o'chirilishi va 3v3 voltli tashqi tortish rezistorlari bilan almashtirilishi kerak.
  • Arduino-ni har qanday o'tish simlarini ulashdan oldin dasturlashtiring, chunki ba'zi pinlar oldingi loyihadan chiqish sifatida dasturlashtirilgan bo'lishi mumkin !!! (Men buni qiyin tarzda o'rgandim … xayriyatki, men ikkitasini juda arzon sotib oldim).

Tashqi soat

OV7670 kamera chipi 10 MGts dan 24 MGts gacha bo'lgan chastota diapazonida tashqi soatni talab qiladi.

Biz 16 MGts chastotali Arduino -dan ishlab chiqaradigan eng yuqori chastota - 8 MGts, lekin bu ishlayotganga o'xshaydi.

Seriya havolasi

1 Mbit / s (sekundiga million bit) ketma -ket havola orqali 1 ma'lumot baytini yuborish uchun kamida 10 AQSh (mikrosaniyalar) kerak. Bu vaqt quyidagicha tuziladi:

  • 8 bitli bit (8us)
  • 1 boshlang'ich bit (1uS)
  • 1 bitli bit (1uS)

Ichki soat

OV7670 ichidagi ichki pikselli soat (PCLK) chastotasi CLKRC registridagi [5: 0] bitlar bilan o'rnatiladi (1 -rasmga qarang). [1]

Agar biz bitlarni [5: 0] = B111111 = 63 ni o'rnatsak va uni yuqoridagi formulaga qo'ysak:

  • F (ichki soat) = F (kirish soati)/(Bit [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Gts yoki
  • = 8uS

Biz faqat har ikkinchi ma'lumot baytidan namuna olayotganimiz uchun, 8uS bo'lgan PCLK oralig'i 16uS namunaga olib keladi, bu esa 1 ta baytni (10uS) qayta ishlash uchun 6uS qoldirish uchun etarli vaqt.

Kadr tezligi

Har bir VGA video ramkasi 784*510 pikseldan (rasm elementlari) iborat bo'lib, ulardan 640*480 piksel ko'rsatiladi. YUV (4: 2: 2) chiqish formati har piksel uchun o'rtacha 2 bayt ma'lumotga ega bo'lgani uchun, har bir kadrga 784*2*510*8 uS = 6,4 soniya kerak bo'ladi.

Bu kamera tez emas !!!

Gorizontal joylashishni aniqlash

Agar biz HSTART va HSTOP qiymatlarini 640 pikselli farqni saqlagan holda o'zgartirsak, tasvir gorizontal ravishda siljishi mumkin.

Rasmni chapga siljitganda, HSTOP qiymati HSTART qiymatidan past bo'lishi mumkin!

Xavotir olmang … hammasi 2 -rasmda aytilganidek, hisoblagichlarning to'lib toshishi bilan bog'liq.

Registrlar

OV7670-da daromad, oq rang balansi va ta'sir qilish kabi narsalarni boshqarish uchun 201 ta sakkiz bitli registrlar mavjud.

Bitta ma'lumot bayti faqat [0] dan [255] oralig'ida 256 qiymatga ruxsat beradi. Agar biz ko'proq nazoratni talab qilsak, biz bir nechta registrlarni kaskad qilishimiz kerak. Ikki bayt bizga 65536 imkoniyat beradi … uch bayt bizga 16, 777, 216 beradi.

3 -rasmda ko'rsatilgan 16 -bitli AEC (Exposure Automatic Control) reestri bunga misol bo'la oladi va quyidagi uchta registrlarning qismlarini birlashtirib yaratiladi.

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

Ogohlantiring … ro'yxatga olish manzillari birlashtirilmagan!

Yon effektlar

Sekin kadr tezligi bir qator kiruvchi yon ta'sirlarni keltirib chiqaradi:

To'g'ri ta'sir qilish uchun OV7670 30 kadr / s tezlikda (sekundiga kadr) ishlashini kutadi. Har bir kadrga 6,4 soniya vaqt ketishi sababli, elektron deklanşör odatdagidan 180 barobar ko'proq ochiladi, bu esa, agar biz registr qiymatlarini o'zgartirmasak, barcha tasvirlar haddan tashqari oshib ketishini bildiradi.

Haddan tashqari ta'sir qilishning oldini olish uchun men AEC (avtofokus nazorati) registrining barcha bitlarini nolga qo'ydim. Shunday bo'lsa ham, yorug'lik porloq bo'lsa, linzalar oldida neytral zichlikdagi filtr kerak.

Uzoq vaqt davomida ta'sir qilish UV ma'lumotlariga ham ta'sir qiladi. To'g'ri ranglarni ishlab chiqaradigan ro'yxatga olish kombinatsiyalarini hali topa olmaganim uchun … bu bajarilayotgan ish deb hisoblang.

Eslatma

[1]

Ma'lumotlar varag'ida ko'rsatilgan formula (1 -rasm) to'g'ri, lekin diapazon faqat bitlarni ko'rsatadi [4: 0]?

5 -qadam: Vaqt to'lqin shakllari

Vaqt to'lqin shakllari
Vaqt to'lqin shakllari
Vaqt to'lqin shakllari
Vaqt to'lqin shakllari
Vaqt to'lqin shakllari
Vaqt to'lqin shakllari

"VGA kadr vaqtini belgilash" diagrammasining pastki chap burchagidagi yozuv (1 -rasm):

YUV/RGB uchun tp = 2 x TPCLK

1, 2 va 3 -rasmlar ma'lumotlar varaqlarini tekshiradi va Omnivision har 2 ma'lumot baytini 1 pikselga teng deb hisoblashini tasdiqlaydi.

Osiloskop to'lqin shakllari, shuningdek, bo'sh vaqt oralig'ida HREF LOW pastligidan dalolat beradi.

4 -rasm Arduino -dan XCLK chiqishi 8 MGts ekanligini tasdiqlaydi. Kvadrat to'lqin emas, balki to'lqin to'lqinini ko'rishimizning sababi shundaki, barcha g'alati harmonikalar 20 MGts chastotali osiloskopimda ko'rinmas.

6 -qadam: Frame Grabber

Frame Grabber
Frame Grabber

OV7670 kamera chipidagi tasvir sensori 656*486 pikselli massivni o'z ichiga oladi, ulardan 640*480 pikselli rasm uchun ishlatiladi.

HSTART, HSTOP, HREF va VSTRT, VSTOP, VREF registr qiymatlari tasvirni sensor ustida joylashtirish uchun ishlatiladi. Agar tasvir sensor ustida to'g'ri joylashmagan bo'lsa, siz "Dizayn eslatmalari" bo'limida aytib o'tilganidek, bir yoki bir nechta qirralarning ustida qora tasmani ko'rasiz.

OV7670 rasmning har bir satrini chapdan yuqori burchakdan boshlab, o'ng pastki pikselgacha bir vaqtning o'zida bitta pikselni skanerlaydi. Arduino 1 -rasmda ko'rsatilgandek ketma -ket havola orqali ushbu piksellarni kompyuterga uzatadi.

Ramka ushlagichlarining vazifasi-bu 640*480 = 307200 pikselning har birini olish va tarkibni "rasm" oynasida ko'rsatish.

3 -ishlov berish quyidagi to'rt qatorli kod yordamida bunga erishadi !!

Kod qatori 1:

bayt byteBuffer = yangi bayt [maxBytes+1]; // bu erda maxBytes = 307200

Ushbu bayonotdagi asosiy kod quyidagilarni yaratadi:

  • "byteBuffer [307201]" deb nomlangan 307201 baytli qator.
  • Qo'shimcha bayt tugatish (linefeed) belgisi uchun.

Kod 2 -qator:

hajmi (640, 480);

Ushbu bayonotdagi asosiy kod quyidagilarni yaratadi:

  • "kenglik = 640;" deb nomlangan o'zgaruvchi
  • "balandlik = 480" deb nomlangan o'zgaruvchi;
  • "piksellar [307200]" deb nomlangan 307200 pikselli qator.
  • 640*480 pikselli "tasvir" oynasi, unda piksellar qatorining tarkibi ko'rsatiladi. Bu "tasvir" oynasi 60 kadr / s tezlikda doimiy ravishda yangilanadi.

Kod satri 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Ushbu bayonotda asosiy kod:

  • "lf" (linefeed) belgisini ko'rmaguncha, kiruvchi ma'lumotlarni mahalliy buferlaydi.
  • shundan so'ng u mahalliy ma'lumotlarning birinchi 307200 baytini byteBuffer qatoriga tashlaydi.
  • Shuningdek, u qabul qilingan baytlar sonini (307201) "byteCount" deb nomlangan o'zgaruvchiga saqlaydi.

Kod qatori 4:

piksel = rang (byteBuffer );

Keyingi loopga joylashtirilganda, ushbu bayonotning asosiy kodi:

  • "byteBuffer " massivining mazmunini "piksel " qatoriga ko'chiradi
  • mazmuni tasvir oynasida paydo bo'ladi.

Asosiy zarbalar:

Frame-grabber quyidagi tugmachalarni taniydi:

  • 'C' = rasmni oling
  • 'S' = rasmni faylga saqlang.

7 -qadam: dasturiy ta'minot

Agar o'rnatilmagan bo'lsa, quyidagi dasturiy paketlarning har birini yuklab oling va o'rnating:

  • Https://www.arduino.cc/en/main/software saytidan "Arduino"
  • Https://java.com/en/download/ [1] saytidan "Java 8".
  • Https://processing.org/download/ saytidan "3 -ishlov".

Arduino eskizini o'rnatish:

  • Barcha OV7670 o'tish simlarini olib tashlang [2]
  • USB kabelini Arduino -ga ulang
  • "OV7670_camera_mono_V2.ino" (biriktirilgan) tarkibini Arduino "eskiziga" nusxa ko'chiring va saqlang.
  • Eskizni Arduino -ga yuklang.
  • Arduino -ni tarmoqdan uzing
  • Endi siz OV7670 o'tish simlarini xavfsiz tarzda qayta ulashingiz mumkin
  • USB kabelini qayta ulang.

Qayta ishlash eskizini o'rnatish va ishga tushirish

  • "OV7670_camera_mono_V2.pde" (biriktirilgan) tarkibini ishlov berish "eskiziga" nusxa ko'chiring va saqlang.
  • Chapdagi "ishga tushirish" tugmachasini bosing … qora tasvirli oyna paydo bo'ladi
  • "Qora" tasvir oynasini bosing
  • Rasm olish uchun "c" tugmachasini bosing. (taxminan 6,4 soniya).
  • Tasvirni ishlov berish papkasida saqlash uchun "s" tugmachasini bosing
  • 4 va 5 -bosqichlarni takrorlang
  • Dasturdan chiqish uchun "To'xtatish" tugmasini bosing.

Eslatmalar

[1]

3 -ishlov berish uchun Java 8 kerak

[2]

Bu OV7670 kamera chipiga zarar bermaslik uchun "faqat bir marta" xavfsizlik chorasi.

Arduino-ga "OV7670_camera_mono.ini" eskizi yuklanmaguncha, ichki tortish rezistorlari 5 voltga ulangan, shuningdek, Arduino ma'lumot uzatish liniyalarining 5 voltli chiqishlari bo'lishi mumkin, bularning hammasi halokatli. 3V3 voltli OV7670 kamera chipi.

Arduino dasturlashtirilgandan so'ng, bu qadamni takrorlashning hojati yo'q va registr qiymatlari xavfsiz tarzda o'zgartirilishi mumkin.

8 -qadam: Rangli tasvirni olish

Rangli tasvirni olish
Rangli tasvirni olish
Rangli tasvirni olish
Rangli tasvirni olish
Rangli tasvirni olish
Rangli tasvirni olish

Quyidagi dasturlar faqat eksperimental bo'lib, ba'zi texnikalar foydali bo'ladi degan umidda joylashtirilgan. Ranglar teskari ko'rinadi … Men hali to'g'ri registr sozlamalarini topa olmadim. Agar siz yechim topsangiz, natijalaringizni yozing

Agar biz rangli tasvirni olmoqchi bo'lsak, barcha ma'lumotlar baytlari olinishi va quyidagi formulalar qo'llanilishi kerak.

OV7670 RGB (qizil, yashil, ko'k) rang ma'lumotlarini YUVga aylantirish uchun quyidagi formulalardan foydalanadi (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) ni RGB rangiga qaytarish uchun quyidagi formulalardan foydalanish mumkin: [2]

  • R = Y + 1.402* (Cr - 128)
  • G = Y -0.344136*(Cb -128) -0.714136*(Cr -128)
  • B = Y + 1.772*(Cb -128)

Qo'shilgan dasturiy ta'minot monoxrom dasturiy ta'minotning kengaytmasi:

  • "C" qo'lga olish so'rovi Arduino -ga yuboriladi
  • Arduino kompyuterga juft raqamli (bitta rangli) baytlarni yuboradi
  • Kompyuter bu baytlarni massivda saqlaydi
  • Keyin Arduino kompyuterga toq raqamli (xrom) baytlarni yuboradi.
  • Bu baytlar ikkinchi qatorda saqlanadi … endi bizda butun tasvir bor.
  • Yuqoridagi formulalar endi to'rtta UYVY ma'lumot baytining har bir guruhiga qo'llaniladi.
  • Olingan rang piksellari keyinchalik "piksel " qatoriga joylashtiriladi
  • Kompyuter "piksellar " qatorini skanerlaydi va "tasvir" oynasida tasvir paydo bo'ladi.

Processing 3 dasturi har bir ko'rish va yakuniy natijalarni qisqacha ko'rsatadi:

  • 1 -rasmda 1 -chi skanerdan olingan U va V chroma ma'lumotlari ko'rsatilgan
  • 2 -rasmda 2 -skanerdan Y1 va Y2 nashrida ma'lumotlari ko'rsatilgan
  • 3 -rasm rangli tasvirni ko'rsatadi … faqat bitta narsa noto'g'ri … sumka yashil bo'lishi kerak !!

Men ushbu dasturni echib bo'lgach, yangi kodni joylashtiraman …

Manbalar:

[1]

www.haoyuelectronics.com/Attachment/OV7670%… (33 -bet)

[2]

en.wikipedia.org/wiki/YCbCr (JPEG konvertatsiyasi)

Boshqa ko'rsatmalarni ko'rish uchun shu erni bosing.

Tavsiya: