İçindekiler:
- Adım 1: Devre Şeması
- Adım 2: Parça Listesi
- 3. Adım: Teori
- Adım 4: Tasarım Notları
- Adım 5: Zamanlama Dalga Formları
- Adım 6: Çerçeve Yakalayıcı
- 7. Adım: Yazılım
- 8. Adım: Renkli Bir Görüntü Elde Etme
Video: Kendi Kameranı Yap: 8 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:19
Bu talimat, bir Omnivision OV7670 görüntü sensörü, bir Arduino mikro denetleyici, birkaç atlama kablosu ve Processing 3 yazılımı kullanarak tek renkli bir kameranın nasıl yapıldığını açıklar.
Renkli bir görüntü elde etmek için deneysel yazılım da sunulmaktadır.
640*480 piksel görüntü yakalamak için “c” tuşuna basın … görüntüyü dosyaya kaydetmek için “s” tuşuna basın. Kısa bir hızlandırılmış film oluşturmak isterseniz, art arda gelen görüntüler sırayla numaralandırılır.
Kamera hızlı değildir (her tarama 6,4 saniye sürer) ve yalnızca sabit aydınlatmada kullanıma uygundur.
Arduino ve PC'niz hariç maliyet, bir fincan kahveden daha azdır.
Görüntüler
Bağlantı kablosu olmayan bileşen parçaları açılış fotoğrafında gösterilmektedir.
İkinci fotoğraf, Arduino kamera yazılımını ve Processing 3 çerçeve yakalayıcıyı gösteren bir ekran görüntüsüdür. Ek, kameranın nasıl bağlandığını gösterir.
Video kamerayı çalışırken gösteriyor. “c” yakalama tuşuna basıldığında, görüntü taranırken kısa bir flaş ve ardından bir etkinlik patlaması olur. Tarama tamamlandığında görüntü otomatik olarak ekran penceresinde görünür. Görüntülerin “s” tuşuna her basıldığında İşleme klasöründe göründüğü görülür. Video, kaydedilen üç görüntünün her biri arasında hızla geçiş yaparak sona erer.
Adım 1: Devre Şeması
Bu kameranın tüm sürümleri için devre şeması fotoğraf 1'de gösterilmiştir.
Fotoğraf 2, 3, atlama tellerinin ve bileşenlerin nasıl bağlandığını gösterir.
Alüminyum braket olmadan görüntüler yan yatıyor.
Uyarı
Arduino'nuzu OV7670 kamera çipine herhangi bir atlama kablosu bağlamadan ÖNCE programlayın. Bu, önceki bir programın 5 voltluk çıkış pinlerinin 3v3 voltluk OV7670 kamera çipini yok etmesini önleyecektir.
Adım 2: Parça Listesi
Aşağıdaki parçalar https://www.aliexpress.com/ adresinden alınmıştır.
- 1 sadece OV7670 300KP VGA Kamera Modülü arduino DIY KIT için
- Somunlar ve cıvatalarla birlikte 1 adet yalnızca kamera braketi
- 1 arduino MEGA328P için sadece UNO R3, USB Kablolu 100% orijinal ATMEGA16U2
Aşağıdaki parçalar yerel olarak elde edildi
- 18 adet Arduino erkek-dişi jumper kablosu
- 3 adet sadece Arduinin dişi-dişi jumper kablo
- 1 sadece mini ekmek tahtası
- 4 sadece 4K7 ohm 1/2 watt direnç
- 1 sadece hurda alüminyum stand.
Ayrıca aşağıdaki veri sayfalarına da ihtiyacınız olacak:
- https://web.mit.edu/6.111/www/f2016/tools/OV7670_20…
- https://www.haoyuelectronics.com/Attachment/OV7670%…
3. Adım: Teori
OV7670 kamera çipi
OV7670 kamera çipinden gelen varsayılan çıktı, bir YUV (4:2:2) video sinyali ve 3 zamanlama dalga formundan oluşur. Diğer çıkış biçimleri, dahili kayıtların I2C uyumlu bir veri yolu aracılığıyla programlanmasıyla mümkündür.
YUV (4:2:2) video sinyali (fotoğraf 1), U (mavi renk farkı) ve V (kırmızı renk farkı) renk bilgisi ile ayrılan sürekli bir monokrom (siyah & beyaz) piksel dizisidir.
Her 4 baytlık grup 2 monokrom bayt ve 2 renkli bayt içerdiğinden bu çıktı biçimi YUV (4:2:2) olarak bilinir.
tek renkli
Tek renkli bir görüntü elde etmek için her saniye veri baytını örneklemeliyiz.
Bir Arduino'nun yalnızca 2K rastgele erişim belleği vardır, ancak her çerçeve 640*2*480 = 307,200 veri baytından oluşur. OV7670'e bir çerçeve yakalayıcı eklemediğimiz sürece, tüm veriler işlenmek üzere PC'ye satır satır gönderilmelidir.
İki olasılık var:
Ardışık 480 karenin her biri için, PC'ye 1Mbps'de göndermeden önce Arduino'ya bir satırı yüksek hızda yakalayabiliriz. Böyle bir yaklaşım, OV7670'in tam hızda çalıştığını görecek, ancak uzun zaman alacaktır (bir dakikadan fazla).
Aldığım yaklaşım, PCLK'yi 8uS'ye kadar yavaşlatmak ve her numuneyi geldiği gibi göndermek. Bu yaklaşım önemli ölçüde daha hızlıdır (6,4 saniye).
Adım 4: Tasarım Notları
uyumluluk
OV7670 kamera çipi, 3v3 voltluk bir cihazdır. Veri sayfası, 3,5 voltun üzerindeki voltajların çipe zarar vereceğini gösterir.
5 volt Arduino'nuzun OV7670 kamera çipini yok etmesini önlemek için:
- Arduino'dan gelen harici saat (XCLK) sinyali voltaj bölücü vasıtasıyla güvenli bir seviyeye düşürülmelidir.
- 5 volta kadar dahili Arduino I2C çekme dirençleri devre dışı bırakılmalı ve 3v3 volt beslemeye harici çekme dirençleri ile değiştirilmelidir.
- Arduino'nuzu herhangi bir atlama teli takmadan ÖNCE programlayın, çünkü bazı pinler hala önceki bir projeden çıktı olarak programlanmış olabilir !!! (Bunu zor yoldan öğrendim… Neyse ki çok ucuz olduğu için iki tane aldım).
Harici saat
OV7670 kamera çipi, 10Mhz ila 24MHz frekans aralığında harici bir saat gerektirir.
16MHz Arduino'dan üretebileceğimiz en yüksek frekans 8MHz ama bu işe yarıyor gibi görünüyor.
seri bağlantı
1 Mb/sn (saniyede milyon bit) seri bağlantı üzerinden 1 veri baytı göndermek için en az 10 uS (mikrosaniye) gerekir. Bu sefer şu şekilde oluşturulmuştur:
- 8 veri biti (8us)
- 1 başlangıç biti (1uS)
- 1 durdurma biti (1uS)
Dahili saat
OV7670 içindeki dahili piksel saati (PCLK) frekansı, CLKRC kaydındaki bitler[5:0] ile ayarlanır (bkz. fotoğraf 1). [1]
Bitleri[5:0] = B111111 = 63 olarak ayarlarsak ve bunu yukarıdaki formüle uygularsak:
- F(dahili saat) = F (giriş saati)/(Bit[5:0}+1)
- = 8000000/(63+1)
- = 125000 Hz veya
- = 8uS
Yalnızca her saniye veri baytını örneklediğimiz için, 8uS'lik bir PCLK aralığı, işleme için 6uS bırakarak 1 veri baytını (10uS) iletmek için yeterli bir süre olan 16uS'lik bir örnekle sonuçlanır.
Kare hızı
Her VGA video çerçevesi, 640*480 pikselin görüntülendiği 784*510 pikselden (resim öğeleri) oluşur. YUV (4:2:2) çıktı formatı piksel başına ortalama 2 veri baytına sahip olduğundan, her kare 784*2*510*8 uS = 6,4 saniye sürecektir.
Bu kamera hızlı DEĞİL!!!
Yatay konumlandırma
640 piksellik farkı koruyarak HSTART ve HSTOP değerlerini değiştirirsek görüntü yatay olarak hareket edebilir.
Resminizi sola hareket ettirirken, HSTOP değerinizin HSTART değerinden daha az olması mümkündür!
Paniğe kapılmayın… hepsi fotoğraf 2'de açıklandığı gibi karşı taşmalarla ilgilidir.
Kayıtlar
OV7670, kazanç, beyaz dengesi ve pozlama gibi şeyleri kontrol etmek için 201 adet sekiz bitlik kayıt içerir.
Bir veri baytı yalnızca [0] ila [255] aralığında 256 değere izin verir. Daha fazla kontrole ihtiyacımız varsa, o zaman birkaç kaydı basamaklandırmamız gerekir. İki bayt bize 65536 olasılık verir… üç bayt bize 16, 777, 216 verir.
Fotoğraf 3'te gösterilen 16 bit AEC (Otomatik Pozlama Kontrolü) kaydı böyle bir örnektir ve aşağıdaki üç kaydın bölümlerinin birleştirilmesiyle oluşturulur.
- AECHH[5:0] = AEC[15:10]
- AECH[7:2] = AEC[9:2]
- COM1[1:0] = AEC[1:0]
Dikkat edin… kayıt adresleri bir arada gruplandırılmamıştır!
Yan etkiler
Yavaş bir kare hızı, bir dizi istenmeyen yan etki yaratır:
Doğru pozlama için OV7670, 30 fps (saniyede kare) kare hızında çalışmayı bekler. Her kare 6,4 saniye sürdüğü için elektronik obtüratör normalden 180 kat daha uzun süre açık kalır, bu da bazı kayıt değerlerini değiştirmediğimiz sürece tüm görüntülerin aşırı pozlanacağı anlamına gelir.
Aşırı pozlamayı önlemek için tüm AEC (otomatik pozlama kontrolü) kayıt bitlerini sıfıra ayarladım. Yine de, aydınlatma parlak olduğunda merceğin önünde nötr yoğunluk filtresi gerekir.
Uzun süre maruz kalmanın da UV verilerini etkilediği görülüyor. Henüz doğru renkleri üreten kayıt kombinasyonlarını bulamadığım için … bunun devam eden bir çalışma olduğunu düşünün.
Not
[1]
Veri sayfasında (fotoğraf 1) gösterilen formül doğrudur ancak aralık sadece bitleri gösterir[4:0] ?
Adım 5: Zamanlama Dalga Formları
“VGA Çerçeve Zamanlaması” diyagramının (fotoğraf 1) sol alt köşesindeki notta şöyle yazıyor:
YUV/RGB için, tp = 2 x TPCLK
Şekil 1, 2 ve 3, veri sayfalarını doğrular ve Omnivision'ın her 2 veri baytını 1 piksele eşdeğer olarak değerlendirdiğini doğrular.
Osiloskop dalga formları ayrıca, körleme aralıkları sırasında HREF'nin DÜŞÜK kaldığını doğrular.
Şekil 4, Arduino'dan XCLK çıkışının 8MHz olduğunu onaylar. Kare dalga yerine sinüs dalgası görmemizin nedeni, tüm tek harmoniklerin 20MHz örnekleme osiloskopum tarafından görülmemesidir.
Adım 6: Çerçeve Yakalayıcı
Bir OV7670 kamera çipi içindeki görüntü sensörü, fotoğraf için 640*480 piksellik bir ızgara kullanılan 656*486 piksellik bir dizi içerir.
Görüntüyü sensör üzerinde konumlandırmak için HSTART, HSTOP, HREF ve VSTRT, VSTOP, VREF register değerleri kullanılır. Görüntü sensörün üzerine doğru şekilde yerleştirilmemişse, “Tasarım Notları” bölümünde açıklandığı gibi bir veya daha fazla kenar üzerinde siyah bir bant göreceksiniz.
OV7670, sol üst köşeden başlayarak sağ alt piksele ulaşana kadar resmin her satırını birer birer piksel tarar. Arduino, bu pikselleri fotoğraf 1'de gösterildiği gibi seri bağlantı yoluyla PC'ye iletir.
Çerçeve yakalayıcıların görevi, bu 640*480=307200 pikselin her birini yakalamak ve içeriği bir "görüntü" penceresinde görüntülemektir.
İşlem 3 bunu aşağıdaki dört kod satırını kullanarak başarır !!
Kod satırı 1:
byte byteBuffer = yeni bayt[maxBytes+1]; // burada maxBytes=307200
Bu ifadedeki temel kod şunları oluşturur:
- "byteBuffer[307201]" adlı bir 307201 bayt dizisi
- Fazladan bayt, bir sonlandırma (satır besleme) karakteri içindir.
Kod satırı 2:
boyut(640, 480);
Bu ifadedeki temel kod şunları oluşturur:
- “width=640” adlı bir değişken;
- “yükseklik=480” adında bir değişken;
- "piksel[307200]" olarak adlandırılan bir 307200 piksel dizisi
- piksel dizisinin içeriğinin görüntülendiği 640*480 piksellik bir “görüntü” penceresi. Bu "görüntü" penceresi, 60 fps kare hızında sürekli olarak yenilenir.
Kod satırı 3:
byteCount = myPort.readBytesUntil(lf, byteBuffer);
Bu açıklamada temel alınan kod:
- gelen verileri yerel olarak bir “lf” (satır besleme) karakteri görene kadar arabelleğe alır.
- bundan sonra ilk 307200 bayt yerel veriyi byteBuffer dizisine atar.
- Ayrıca alınan bayt sayısını (307201) "byteCount" adlı bir değişkene kaydeder.
Kod satırı 4:
piksel = color(byteBuffer);
Bir sonraki döngüye yerleştirildiğinde, bu ifadedeki temel kod:
- "byteBuffer" dizisinin içeriğini "pixels" dizisine kopyalar
- içeriği görüntü penceresinde görünen.
Tuş vuruşları:
Çerçeve yakalayıcı aşağıdaki tuş vuruşlarını tanır:
- 'c' = görüntüyü yakala
- 's' = görüntüyü dosyaya kaydedin.
7. Adım: Yazılım
Henüz kurulu değilse, aşağıdaki yazılım paketlerinin her birini indirin ve kurun:
- https://www.arduino.cc/en/main/software adresinden "Arduino"
- https://java.com/en/download/ [1] adresinden "Java 8"
- https://processing.org/download/ adresinden "İşleniyor 3"
Arduino taslağının kurulumu:
- Tüm OV7670 atlama tellerini [2] çıkarın
- Arduino'nuza bir USB kablosu bağlayın
- “OV7670_camera_mono_V2.ino” (ekli) içeriğini bir Arduino “taslağına” kopyalayın ve kaydedin.
- Krokiyi Arduino'nuza yükleyin.
- Arduino'yu fişten çekin
- Artık OV7670 atlama tellerini güvenle yeniden bağlayabilirsiniz
- USB kablosunu yeniden bağlayın.
İşleme çizimini yükleme ve çalıştırma
- “OV7670_camera_mono_V2.pde” (ekli) içeriğini bir İşleme “taslak”ına kopyalayın ve kaydedin.
- Sol üstteki “çalıştır” düğmesine tıklayın… siyah bir görüntü penceresi görünecektir
- “Siyah” görüntü penceresine tıklayın
- Bir görüntü yakalamak için “c” tuşuna basın. (yaklaşık 6,4 saniye).
- Görüntüyü işleme klasörünüze kaydetmek için “s” tuşuna basın
- 4. ve 5. adımları tekrarlayın
- Programdan çıkmak için “dur” düğmesine tıklayın.
Notlar
[1]
İşlem 3, Java 8 gerektirir
[2]
Bu, OV7670 kamera çipinize zarar vermemek için "tek seferlik" bir güvenlik adımıdır.
Arduino'nuza “OV7670_camera_mono.ini” taslağı yüklenene kadar dahili pull-up dirençleri 5 volta bağlanır, ayrıca bazı Arduino veri hatlarının 5 volt çıkış olma olasılığı vardır… 3v3 voltluk OV7670 kamera çipi.
Arduino programlandıktan sonra bu adımı tekrarlamaya gerek yoktur ve kayıt değerleri güvenli bir şekilde değiştirilebilir.
8. Adım: Renkli Bir Görüntü Elde Etme
Aşağıdaki yazılım tamamen deneyseldir ve bazı tekniklerin faydalı olacağı umuduyla yayınlanmıştır. Renkler ters gibi görünüyor… Henüz doğru register ayarlarını bulamadım. Bir çözüm bulursanız, lütfen sonuçlarınızı gönderin
Renkli bir görüntü elde edeceksek, tüm veri baytları yakalanmalı ve aşağıdaki formüller uygulanmalıdır.
OV7670, RGB (kırmızı, yeşil, mavi) renk bilgilerini YUV'ye (4:2:2) dönüştürmek için aşağıdaki formülleri kullanır: [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'yi (4:2:2) tekrar RGB rengine dönüştürmek için aşağıdaki formüller kullanılabilir: [2]
- R = Y + 1.402* (Cr – 128)
- G = Y – 0.344136*(Cb -128) – 0.714136*(Cr -128)
- B = Y + 1.772*(Cb -128)
Ekli yazılım, monokrom yazılımın basit bir uzantısıdır:
- Arduino'ya bir "c" yakalama isteği gönderilir
- Arduino, çift numaralı (tek renkli) baytları PC'ye gönderir
- PC bu baytları bir diziye kaydeder
- Arduino daha sonra tek numaralı (kroma) baytları PC'ye gönderir.
- Bu baytlar ikinci bir diziye kaydedilir… şimdi tüm görüntüye sahibiz.
- Yukarıdaki formüller şimdi dört UYVY veri baytının her grubuna uygulanır.
- Ortaya çıkan renk pikselleri daha sonra “piksel” dizisine yerleştirilir.
- Bilgisayar “piksel” dizisini tarar ve “görüntü” penceresinde bir görüntü belirir.
Processing 3 yazılımı, her taramayı ve nihai sonuçları kısaca görüntüler:
- Fotoğraf 1, tarama 1'den U & V renk verilerini gösterir
- Fotoğraf 2, tarama 2'den Y1 ve Y2 parlaklık verilerini gösterir
- Fotoğraf 3 renkli resmi gösteriyor … tek bir şey yanlış … çanta yeşil olmalı !!
Bu programı çözdükten sonra yeni kod göndereceğim…
Referanslar:
[1]
www.haoyuelectronics.com/Attachment/OV7670%… (sayfa 33)
[2]
en.wikipedia.org/wiki/YCbCr (JPEG dönüştürme)
Diğer talimatlarımı görüntülemek için buraya tıklayın.
Önerilen:
Kendi Kendi Kendini Süren Arabanızı Yapın - (Bu Talimat Çalışma Halindedir): 7 Adım
Kendi Kendi Kendini Süren Arabanızı Yapın - (Bu Talimat İşleniyor): Merhaba, Uzaktan USB Gamepad ile Drive Robot Üzerindeki diğer Eğitilebilirliğime bir göz atarsanız, bu proje benzer, ancak daha küçük bir ölçekte. Ayrıca Robotik, Evde Yetiştirilen Ses Tanıma veya Kendi Kendine
WiFi ile Kendi Kendine Kendin Yap Sulama Tenceresi İnşa Et - Bitkileri Otomatik Olarak Sular ve Su Azaldığında Uyarı Gönderir: 19 Adım
WiFi ile Kendin Yap Kendinden Sulama Tenceresi İnşa Edin - Bitkileri Otomatik Olarak Sular ve Su Azaldığında Uyarılar Gönderir: Bu eğitim size, eski bir bahçe ekici, bir çöp kutusu, bir miktar yapıştırıcı ve bir Kendinden Yapıştırıcı kullanarak, WiFi bağlantılı, kendi kendine sulanan, özelleştirilmiş bir ekici nasıl oluşturacağınızı gösterir. Adosia'dan Sulama Kabı Alt Montaj Kiti
Otto DIY - Bir Saatte Kendi Robotunu Yap!: 9 Adım (Resimlerle)
Otto DIY - Bir Saatte Kendi Robotunu Yap!: Otto, herkesin yapabileceği, yürüdüğü, dans ettiği, ses çıkaran ve engellerden kaçan etkileşimli bir robottur. Otto tamamen açık kaynak kodlu, Arduino uyumlu, 3D yazdırılabilir ve sosyal herkes için kapsayıcı bir ortam yaratmak için etki misyonu
Kendi ""Banksy'nin Kendi Kendini Yok Eden Sanat Eseri Çerçevesini" Oluşturun: 4 Adım
Kendi "Banksy'nin Kendi Kendini Yok Eden Sanat Eseri Çerçevesini" İnşa Et: Balon Kız 1.4 milyon dolara ulaştıktan sonra kendi kendini parçaladığında, içimizdeki yapımcılar bunun nasıl yapıldığını analiz etmeye başladılar. Aklımızda ilk 2 fikir vardı: Birincisi şuydu: bıçaklar çerçevenin tabanına sabitlendi ve iki tekerlek
Kendi Ev Otomasyon Sisteminizi Kendin Yap: 7 Adım (Resimlerle)
DIY Hacking Kendi Ev Otomasyon Sisteminiz: Bir ev otomasyon sistemi, ışıklar, fanlar, eğlence sistemleri vb. cihazları açıp kapatabilmelidir. Kablosuz, ancak internetten bağımsız, ama en önemlisi, DIY ve açık bir sistem. -kaynak çünkü anlamak istiyorum