Mundarija:
- 1 -qadam: O'chirish diagrammasi
- 2 -qadam: qismlar ro'yxati
- 3 -qadam: nazariya
- 4 -qadam: Dizayn bo'yicha eslatmalar
- 5 -qadam: Vaqt to'lqin shakllari
- 6 -qadam: Frame Grabber
- 7 -qadam: dasturiy ta'minot
- 8 -qadam: Rangli tasvirni olish
Video: O'z kamerangizni yarating: 8 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:25
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
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
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
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
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
"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
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
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:
Arduino yordamida GPS chegara chegaralarini yarating: 8 qadam
Arduino -dan foydalanib, GPS -ning chegara chegaralarini yarating: Ushbu qo'llanmada biz Arduino -dan foydalanib, GPS -ning chegara chegaralarini qanday yasashni bilib olamiz, bu sizda robot bo'lsa va siz uning belgilangan maydondan tashqariga chiqishini xohlamasangiz foydali bo'ladi. , displeyda "Tashqarida" ko'rsatiladi
Oson qadam bilan o'z ishga tushirish buyrug'ini yarating: 4 qadam
Oson qadam bilan o'z ishga tushirish buyrug'ini yarating: men bu erda ko'rsataman, qanday qilib Windows operatsion tizimida o'z ishga tushirish buyrug'ini yaratishingiz mumkin. Aslida, derazalardagi bu xususiyat juda zo'r, bu sizning dastur oynangizni darhol ochish uchun foydalidir. Endi siz har qanday ilovani ochish uchun buyruqni yaratishingiz mumkin
Shishali tiqin yordamida o'z kamerangizni monopod qiling: 3 qadam
Shishali tiqin yordamida o'z kamerangizni monopod qiling: Bu darslikni bajarish juda oson va juda arzon. Muvaffaqiyatga erishish uchun faqat 6 mm uzunlikdagi shtativ vint (1/4 ") va shisha tiqin kifoya qiladi. MUHIM. Buning uchun vintda eksaktiv ip bo'lishi kerak, aks holda siz kameralar ipini yo'q qilasiz.
Sayyorani va cho'ntagingizni saqlang. $$ Arzon P&S raqamli kamerangizni zaryadlanuvchi qurilmaga aylantiring: 4 qadam (rasmlar bilan)
Sayyorani va cho'ntagingizni saqlang. $$ Arzon P&S raqamli kamerangizni zaryadlanuvchi qurilmaga aylantiring: Bir necha yil oldin men Dolphin Jazz 2.0 megapikselli raqamli kamerani sotib oldim, u yaxshi xususiyatlarga va narxga ega edi. Bundan tashqari, AAA Bateries uchun ishtahasi bor edi. Hech kim qiyinchiliklardan qochib qutula olmaydi, men uni zaryadsizlanishini to'xtatish uchun qayta zaryadlanuvchi batareyadan foydalanaman deb o'yladim
Kamerangizni "harbiy tungi ko'rish" rejimiga o'tkazish, Nightvision effektini qo'shish yoki har qanday kamerada NightVision rejimini yaratish !!!: 3 qadam
Kamerangizni "Harbiy Nightvision" ga o'tkazish, Nightvision effektini qo'shish yoki NightVision rejimini yaratish har qanday kamerada !!!: *** Bu DIGITAL & DAYS FOTO KONKURSida qatnashdi, iltimos menga ovoz bering ** *Agar sizga yordam kerak bo'lsa, elektron pochta orqali yuboring: [email protected] Men ingliz, frantsuz, yapon, ispan tillarida gaplashaman va agar boshqa tillarni bilsam