Mündəricat:

Öz Kameranızı yaradın: 8 addım
Öz Kameranızı yaradın: 8 addım

Video: Öz Kameranızı yaradın: 8 addım

Video: Öz Kameranızı yaradın: 8 addım
Video: İMAM BAYILDI #8 NEJLA HANIM ŞOK GEÇİRİYOR 2024, Iyul
Anonim
Image
Image
Öz Kameranızı yaradın
Öz Kameranızı yaradın

Bu təlimat, Omnivision OV7670 görüntü sensoru, Arduino mikro nəzarətçisi, bir neçə tullanan tel və Processing 3 proqramından istifadə edərək monoxrom kameranın necə hazırlanacağını izah edir.

Rəngli görüntü əldə etmək üçün eksperimental proqramlar da təqdim olunur.

640*480 piksellik bir şəkil çəkmək üçün "c" düyməsini basın … şəkli faylda saxlamaq üçün "s" düyməsini basın. Qısa bir fasilə filmi yaratmaq istəyirsinizsə, ardıcıl şəkillər ardıcıl olaraq nömrələnir.

Kamera sürətli deyil (hər tarama 6,4 saniyə çəkir) və yalnız sabit işıqlandırmada istifadə üçün uyğundur.

Arduino və kompüteriniz istisna olmaqla, bir fincan qəhvədən daha azdır.

Şəkillər

Bağlayıcı telləri olmayan komponentlər açılış fotoşəkildə göstərilmişdir.

İkinci şəkil Arduino kamera proqramını və Processing 3 çərçivə tutucusunu göstərən bir ekran görüntüsüdür. Əlavə kameranın necə bağlı olduğunu göstərir.

Video kameranın hərəkətdə olduğunu göstərir. "C" çəkmə düyməsinə basıldıqda qısa bir flaş var, sonra görüntü taranarkən bir aktivlik partlayır. Tarama tamamlandıqdan sonra görüntü avtomatik olaraq ekran pəncərəsində görünür. Şəkillərin "s" düyməsini hər basdıqdan sonra İşləmə qovluğunda göründüyü görünür. Videonun sona çatması, saxlanılan üç görüntünün hər birini sürətlə keçməkdir.

Addım 1: Dövrə Şeması

Dövrə diaqramı
Dövrə diaqramı
Dövrə diaqramı
Dövrə diaqramı
Dövrə diaqramı
Dövrə diaqramı

Bu kameranın bütün versiyaları üçün dövrə diaqramı şəkil 1 -də göstərilmişdir.

2, 3-cü fotoşəkillər tellərin və komponentlərin necə bağlandığını göstərir.

Alüminium mötərizə olmadan şəkillər yan tərəfdə uzanır.

Xəbərdarlıq

Arduino -nuzu, OV7670 kamera çipinə hər hansı bir tullanan tel bağlamadan əvvəl proqramlaşdırın. Bu, əvvəlki proqramdakı 5 voltluq çıxış pinlərinin 3v3 voltluq OV7670 kamera çipini məhv etməsinin qarşısını alacaq.

Addım 2: Parça siyahısı

Parça siyahısı
Parça siyahısı

Aşağıdakı hissələr https://www.aliexpress.com/ saytından əldə edilmişdir.

  • Arduino DIY KIT üçün yalnız 1 OV7670 300KP VGA Kamera Modulu
  • Yalnız 1 qoz -fındıq və bolt ilə təchiz edilmiş kamera braketi
  • USB kabel ilə arduino MEGA328P 100% orijinal ATMEGA16U2 üçün yalnız 1 UNO R3

Aşağıdakı hissələr yerli olaraq alındı

  • 18 anly Arduino kişi-qadın tullanan kabel
  • 3 yalnız Arduinin qadın-dişi tullanan kabeli
  • 1 ədəd yalnız mini çörək taxtası
  • 4 yalnız 4K7 ohm 1/2 watt rezistor
  • 1 ədəd yalnız alüminium dayaq.

Aşağıdakı məlumat cədvəlinə də ehtiyacınız olacaq:

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

Addım 3: nəzəriyyə

Nəzəriyyə
Nəzəriyyə

OV7670 kamera çipi

OV7670 kamera çipinin standart çıxışı YUV (4: 2: 2) video siqnalı və 3 zamanlama dalğa formasından ibarətdir. Digər çıxış formatları, I2C uyğun bir avtobus vasitəsilə daxili qeydləri proqramlaşdırmaqla mümkündür.

YUV (4: 2: 2) video siqnalı (şəkil 1) U (mavi rəng fərqi) və V (qırmızı rəng fərqi) rəng məlumatları ilə ayrılmış monoxrom (qara və ağ) piksellərin davamlı bir ardıcıllığıdır.

Bu çıxış formatı YUV (4: 2: 2) olaraq bilinir, çünki hər 4 bayt qrupu 2 monoxrom bayt və 2 rəng baytı ehtiva edir.

Monoxrom

Monoxrom bir görüntü əldə etmək üçün hər ikinci məlumat baytından nümunə götürməliyik.

Bir Arduino yalnız 2K təsadüfi giriş yaddaşına malikdir, lakin hər çərçivə 640*2*480 = 307, 200 məlumat baytından ibarətdir. OV7670-ə bir çərçivə tutan əlavə etməsək, bütün məlumatlar işlənmək üçün PC-yə göndərilməlidir.

İki ehtimal var:

Ardıcıl 480 kadrın hər biri üçün 1Mbps sürətlə PC -yə göndərməzdən əvvəl Arduino -ya yüksək sürətlə bir xətt çəkə bilərik. Belə bir yanaşma OV7670 -in tam sürətlə işlədiyini görərdi, ancaq uzun müddət çəkərdi (bir dəqiqədən çox).

Etdiyim yanaşma, PCLK -ni 8uS -ə qədər yavaşlatmaq və hər nümunəni gəldiyi kimi göndərməkdir. Bu yanaşma əhəmiyyətli dərəcədə daha sürətlidir (6.4 saniyə).

Addım 4: Dizayn Qeydləri

Dizayn Qeydləri
Dizayn Qeydləri
Dizayn Qeydləri
Dizayn Qeydləri
Dizayn Qeydləri
Dizayn Qeydləri

Uyğunluq

OV7670 kamera çipi 3v3 voltluq bir cihazdır. Məlumat vərəqi 3.5 voltdan yuxarı olan gərginliyin çipə zərər verəcəyini göstərir.

5 voltlu Arduino -nun OV7670 kamera çipini məhv etməsinin qarşısını almaq üçün:

  • Arduinodan gələn xarici saat (XCLK) siqnalı, gərginlik bölücü vasitəsi ilə təhlükəsiz səviyyəyə endirilməlidir.
  • Daxili Arduino I2C 5 voltluq çəkmə müqavimətləri deaktiv edilməli və 3v3 voltlu təchizata xarici çəkmə rezistorları ilə əvəz edilməlidir.
  • Arduino-nuzu, hər hansı bir tullanan tel bağlamadan ƏVVƏL proqramlaşdırın, çünki bəzi sancaqlar hələ də əvvəlki layihədən çıxış kimi proqramlaşdırıla bilər !!! (Mən bunu çətin şəkildə öyrəndim … xoşbəxtlikdən çox ucuz olduğu üçün ikisini aldım).

Xarici saat

OV7670 kamera çipi 10Mhz -24MHz tezlik aralığında xarici bir saat tələb edir.

16MHz Arduino -dan yarada biləcəyimiz ən yüksək tezlik 8MHz -dir, amma bu işə yarayır.

Serial link

1Mbps (saniyədə milyon bit) seriyalı keçiddə 1 məlumat baytı göndərmək üçün ən az 10 uS (mikrosaniyə) lazımdır. Bu zaman aşağıdakı kimi tərtib edilir:

  • 8 məlumat biti (8us)
  • 1 başlanğıc biti (1uS)
  • 1 dayanma biti (1uS)

Daxili saat

OV7670 daxilində daxili piksel saatı (PCLK) tezliyi CLKRC reyestrində bit [5: 0] ilə təyin olunur (şəkil 1 -ə baxın). [1]

Bitləri [5: 0] = B111111 = 63 olaraq təyin etsək və yuxarıdakı düstura tətbiq etsək:

  • F (daxili saat) = F (giriş saatı)/(Bit [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz və ya
  • = 8 uS

Yalnız hər ikinci məlumat baytından nümunə götürdüyümüz üçün 8uS -lik bir PCLK aralığında 16uS nümunəsi əldə edilir ki, bu da 1 məlumat baytını (10uS) emal etmək üçün 6uS buraxmaq üçün kifayət qədər vaxtdır.

Çərçivə dərəcəsi

Hər bir VGA video çərçivəsi 784*510 pikseldən (şəkil elementləri) ibarətdir, bunlardan 640*480 piksel göstərilir. YUV (4: 2: 2) çıxış formatında piksel başına ortalama 2 məlumat baytı olduğu üçün hər çərçivə 784*2*510*8 uS = 6,4 saniyə çəkəcək.

Bu kamera sürətli deyil !!!

Yatay yerləşdirmə

640 piksel fərqi saxlayaraq HSTART və HSTOP dəyərlərini dəyişdirsək, görüntü üfüqi şəkildə hərəkət etdirilə bilər.

Görüntünüzü sola köçürərkən, HSTOP dəyərinizin HSTART dəyərindən az olması mümkündür!

Narahat olmayın … hamısı fotoşəkil 2 -də izah edildiyi kimi sayğac daşması ilə əlaqədardır.

Qeydlər

OV7670, qazanc, ağ balansı və məruz qalma kimi şeyləri idarə etmək üçün 201 səkkiz bit qeydə malikdir.

Bir məlumat baytı yalnız [0] ilə [255] aralığında 256 dəyərə icazə verir. Daha çox nəzarətə ehtiyacımız varsa, bir neçə reyestrdən istifadə etməliyik. İki bayt bizə 65536 imkan verir … üç bayt bizə 16, 777, 216 verir.

Şəkil 3 -də göstərilən 16 bit AEC (Avtomatik Pozlama İdarəetmə) reyestri belə bir nümunədir və aşağıdakı üç qeydin hissələrini birləşdirərək yaradılmışdır.

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

Xəbərdar olun … qeydiyyat ünvanları birlikdə qruplaşdırılmır!

Yan təsirləri

Yavaş bir çərçivə sürəti bir sıra istənməyən yan təsirləri təqdim edir:

Doğru pozlama üçün OV7670, saniyədə 30 kadr kadr sürətində işləməyi gözləyir. Hər bir çərçivə 6.4 saniyə çəkdiyindən elektron çekim normaldan 180 dəfə artıqdır, bu da bəzi qeyd dəyərlərini dəyişdirməyincə bütün şəkillərin həddindən artıq ifşa olunacağı deməkdir.

Aşırı pozulmanın qarşısını almaq üçün bütün AEC (avtomatik məruz qalma nəzarəti) qeyd bitlərini sıfıra qoydum. İşıqlandırma parlaq olduqda obyektivin qarşısında neytral sıxlıq filtrinə ehtiyac var.

Uzun bir məruz qalma da UV məlumatlarını təsir edir. Düzgün rənglər istehsal edən qeyd kombinasiyalarını hələ tapmadığım üçün … bunun davam edən iş olduğunu düşünün.

Qeyd

[1]

Məlumat vərəqində göstərilən şəkil (şəkil 1) doğrudur, ancaq aralıq yalnız bitləri göstərir [4: 0]?

Addım 5: Dalğa Formatlarının Zamanlanması

Zamanlama Dalğa Formaları
Zamanlama Dalğa Formaları
Zamanlama Dalğa Formaları
Zamanlama Dalğa Formaları
Zamanlama Dalğa Formaları
Zamanlama Dalğa Formaları

"VGA Çərçivə Zamanlaması" diaqramının sol alt küncündəki qeyddə (şəkil 1) deyilir:

YUV/RGB üçün tp = 2 x TPCLK

Şəkillər 1, 2 və 3 məlumat vərəqlərini yoxlayır və təsdiq edir ki, Omnivision hər 2 məlumat baytını 1 pikselə bərabər hesab edir.

Osiloskop dalğa formaları, HREF -in boşluq aralığında LOW olaraq qaldığını da təsdiqləyir.

Şəkil 4 Arduinodan XCLK çıxışının 8MHz olduğunu təsdiqləyir. Dördbucaqlı bir dalğa deyil, bir sinewave görməyimizin səbəbi, bütün tək harmoniklərin 20MHz nümunə götürmə osiloskopumda görünməz olmasıdır.

Addım 6: Frame Grabber

Çərçivə Grabber
Çərçivə Grabber

OV7670 kamera çipindəki görüntü sensoru, fotoşəkil üçün 640*480 piksellik bir şəbəkə istifadə edilən 656*486 piksellik bir sıra ibarətdir.

HSTART, HSTOP, HREF və VSTRT, VSTOP, VREF qeyd dəyərləri görüntünün sensorun üzərinə yerləşdirilməsi üçün istifadə olunur. Şəkil sensorun üzərinə düzgün yerləşdirilməyibsə, "Dizayn Qeydləri" bölməsində izah edildiyi kimi bir və ya daha çox kənarda qara lent görürsünüz.

OV7670, şəklin hər bir sətrini sol üst küncdən başlayaraq sağ alt pikseldə olana qədər bir dəfə tarar. Arduino, bu pikselləri şəkil 1 -də göstərildiyi kimi serial bağlantısı vasitəsilə PC -yə ötürür.

Çərçivə tutanların vəzifəsi, bu 640*480 = 307200 pikselin hər birini çəkmək və məzmununu "görüntü" pəncərəsində göstərməkdir.

Processing 3, aşağıdakı dörd satır kodunu istifadə edərək buna nail olur !!

Kod xətti 1:

bayt byteBuffer = yeni bayt [maxBytes+1]; // burada maxBytes = 307200

Bu ifadədəki əsas kod yaradır:

  • "byteBuffer [307201]" adlı 307201 bayt dizisi
  • Əlavə bayt bir xitam (linefeed) xarakteri üçündür.

Kod xətti 2:

ölçü (640, 480);

Bu ifadədəki əsas kod yaradır:

  • "width = 640;" adlanan dəyişən
  • "hündürlük = 480" adlanan dəyişən;
  • "piksellər [307200]" adlanan 307200 piksellik bir sıra
  • piksel massivinin məzmununun göstərildiyi 640*480 piksellik "görüntü" pəncərəsi. Bu "görüntü" pəncərəsi 60 kadr kadr sürətində davamlı olaraq yenilənir.

Kod xətti 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Bu ifadədə əsas kod:

  • "lf" (linefeed) simvolunu görənə qədər daxil olan məlumatları yerli olaraq tamponlayır.
  • bundan sonra ilk 307200 bayt yerli məlumatı byteBuffer sırasına atır.
  • Ayrıca alınan bayt sayını (307201) "byteCount" adlı bir dəyişənə saxlayır.

Kod xətti 4:

piksel = rəng (byteBuffer );

Növbəti döngüyə yerləşdirildikdə, bu ifadədəki əsas kod:

  • "byteBuffer " serialının məzmununu "piksel " silsiləsinə kopyalayır
  • məzmunu şəkil pəncərəsində görünür.

Əsas vuruşlar:

Çərçivə tutan şəxs aşağıdakı düymələri tanıyır:

  • 'C' = şəkil çəkin
  • 'S' = şəkli faylda saxlayın.

Addım 7: Proqram təminatı

Hələ qurulmamışdırsa, aşağıdakı proqram paketlərinin hər birini yükləyin və quraşdırın:

  • Https://www.arduino.cc/en/main/software saytından "Arduino"
  • Https://java.com/en/download/ [1] saytından "Java 8"
  • Https://processing.org/download/ saytından "İşlənmə 3"

Arduino eskizinin quraşdırılması:

  • Bütün OV7670 keçid tellərini çıxarın [2]
  • USB kabelini Arduino -ya qoşun
  • "OV7670_camera_mono_V2.ino" (əlavə olunur) məzmununu Arduino "eskizinə" kopyalayın və qeyd edin.
  • Eskizi Arduino -ya yükləyin.
  • Arduino'yu ayırın
  • İndi OV7670 keçid tellərini etibarlı şəkildə yenidən bağlaya bilərsiniz
  • USB kabelini yenidən qoşun.

İşləmə eskizinin quraşdırılması və işə salınması

  • "OV7670_camera_mono_V2.pde" nin məzmununu İşlənmiş "eskiz" ə kopyalayın və qeyd edin.
  • Sol üstdəki "Çalış" düyməsini basın … qara bir şəkil pəncərəsi görünəcək
  • "Qara" şəkil pəncərəsini vurun
  • Şəkil çəkmək üçün "c" düyməsini basın. (təxminən 6.4 saniyə).
  • Təsviri işləmə qovluğunda saxlamaq üçün "s" düyməsini basın
  • 4 və 5 -ci addımları təkrarlayın
  • Proqramdan çıxmaq üçün "dayandır" düyməsini basın.

Qeydlər

[1]

3 -cü emal üçün Java 8 lazımdır

[2]

Bu, OV7670 kamera çipinizə zərər verməmək üçün "yalnız bir dəfə" təhlükəsizlik addımdır.

"OV7670_camera_mono.ini" eskizi Arduino-ya yüklənənə qədər daxili çəkmə rezistorları 5 volta bağlanır, üstəlik Arduino məlumat xətlərinin bəzilərinin 5 volt çıxışı ola bilər … hamısı ölümcül ola bilər 3v3 voltluq OV7670 kamera çipi.

Arduino proqramlaşdırıldıqdan sonra bu addımı təkrarlamağa ehtiyac yoxdur və qeyd dəyərləri etibarlı şəkildə dəyişdirilə bilər.

Addım 8: Rəngli Şəkil Alın

Rəngli Şəkil Alınması
Rəngli Şəkil Alınması
Rəngli Şəkil Alınması
Rəngli Şəkil Alınması
Rəngli Şəkil Alınması
Rəngli Şəkil Alınması

Aşağıdakı proqram yalnız eksperimentaldır və bəzi texnikaların faydalı olacağı ümidi ilə yerləşdirilmişdir. Rənglər ters çevrilmiş kimi görünür … Düzgün qeydiyyat parametrlərini hələ tapmamışam. Bir həll tapsanız, nəticələrinizi yazın

Rəngli bir şəkil əldə etmək istəyiriksə, bütün məlumat baytları tutulmalı və aşağıdakı düsturlar tətbiq edilməlidir.

OV7670, RGB (qırmızı, yaşıl, mavi) rəng məlumatlarını YUV -ə çevirmək üçün aşağıdakı düsturlardan istifadə edir (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 -ni (4: 2: 2) yenidən RGB rənginə çevirmək üçün aşağıdakı düsturlar istifadə edilə bilər: [2]

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

Əlavə edilmiş proqram, sadəcə monoxrom proqramın bir uzantısıdır:

  • Arduinoya "c" ələ keçirmə sorğusu göndərilir
  • Arduino, cüt nömrəli (monoxrom) baytı PC -yə göndərir
  • PC bu baytları bir sıra saxlayır
  • Arduino daha sonra tək nömrəli (xrom) baytı PC -yə göndərir.
  • Bu baytlar ikinci bir massivdə saxlanılır … indi bütün görüntüyə sahibik.
  • Yuxarıdakı düsturlar artıq dörd UYVY məlumat baytından ibarət hər bir qrupa tətbiq olunur.
  • Yaranan rəng pikselləri daha sonra “piksel ” sırasına yerləşdirilir
  • Kompüter “piksel ” silsiləsini tarar və “görüntü” pəncərəsində bir şəkil görünür.

Processing 3 proqramı qısaca olaraq hər bir tarama və son nəticələri göstərir:

  • Şəkil 1, tarama 1 -dən U & V xroma məlumatlarını göstərir
  • Şəkil 2, tarama 2 -dən Y1 və Y2 parlaqlıq məlumatlarını göstərir
  • Şəkil 3 rəngli görüntünü göstərir … yalnız bir şey səhvdir … çanta yaşıl olmalıdır!

Bu proqramı həll etdikdən sonra yeni kod göndərəcəyəm …

İstinadlar:

[1]

www.haoyuelectronics.com/Attachment/OV7670%… (səhifə 33)

[2]

en.wikipedia.org/wiki/YCbCr (JPEG çevrilməsi)

Digər təlimatlarımı görmək üçün bura vurun.

Tövsiyə: