Isi kandungan:

Buat Kamera Sendiri: 8 Langkah
Buat Kamera Sendiri: 8 Langkah

Video: Buat Kamera Sendiri: 8 Langkah

Video: Buat Kamera Sendiri: 8 Langkah
Video: Snapdragon turun tangan bikin HP mereka sendiri dan hasilnya LUAR BIASA! 2024, November
Anonim
Image
Image
Buat Kamera Anda Sendiri
Buat Kamera Anda Sendiri

Instruksional ini menerangkan bagaimana membuat kamera monokrom menggunakan sensor gambar Omnivision OV7670, mikrokontroler Arduino, beberapa kabel jumper, dan perisian Processing 3.

Perisian eksperimental untuk mendapatkan gambar berwarna juga disajikan.

Tekan kekunci "c" untuk menangkap gambar 640 * 480 piksel … tekan kekunci "s" untuk menyimpan gambar ke file. Gambar berturut-turut diberi nombor secara berurutan sekiranya anda ingin membuat filem selang waktu pendek.

Kamera tidak pantas (setiap imbasan mengambil masa 6.4 saat) dan hanya sesuai digunakan dalam pencahayaan tetap.

Kos, tidak termasuk Arduino dan PC anda, adalah kurang dari secawan kopi.

Gambar

Bahagian komponen, tanpa pendawaian pelompat, ditunjukkan dalam foto pembukaan.

Foto kedua adalah tangkapan skrin yang menunjukkan perisian kamera Arduino dan pemroses bingkai Processing 3. Inset menunjukkan bagaimana kamera disambungkan.

Video menunjukkan kamera beraksi. Apabila kekunci tangkapan "c" ditekan, terdapat sekejap kilat diikuti dengan ledakan aktiviti ketika gambar diimbas. Gambar secara automatik muncul di tetingkap paparan setelah imbasan selesai. Gambar kemudian dilihat muncul di folder Pemprosesan setelah setiap kali menekan butang “s”. Video disimpulkan dengan mengayuh dengan pantas melalui ketiga-tiga gambar yang disimpan.

Langkah 1: Diagram Litar

Rajah Litar
Rajah Litar
Rajah Litar
Rajah Litar
Rajah Litar
Rajah Litar

Gambarajah litar, untuk semua versi kamera ini, ditunjukkan dalam foto 1.

Foto 2, 3 menunjukkan bagaimana wayar pelompat dan komponen dihubungkan.

Tanpa pendakap aluminium gambar terletak di sebelahnya.

Amaran

Program Arduino anda SEBELUM memasang kabel jumper ke cip kamera OV7670. Ini akan menghalang pin output 5 volt dari program sebelumnya daripada memusnahkan cip kamera OV7670 3v3 volt.

Langkah 2: Senarai Bahagian

Senarai Bahagian
Senarai Bahagian

Bahagian berikut diperoleh dari

  • 1 sahaja Modul Kamera VGA OV7670 300KP untuk arduino DIY KIT
  • 1 pendakap kamera sahaja lengkap dengan mur dan selak
  • 1 sahaja UNO R3 untuk arduino MEGA328P 100% ATMEGA16U2 asli dengan Kabel USB

Bahagian berikut diperoleh secara tempatan

  • 18 kabel pelompat lelaki-wanita Arlyino anly
  • 3 kabel pelompat wanita-wanita Arduinin sahaja
  • 1 papan roti mini sahaja
  • 4 perintang 4K7 ohm 1/2 watt sahaja
  • 1 pendirian aluminium sekerap sahaja.

Anda juga memerlukan lembaran data berikut:

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

Langkah 3: Teori

Teori
Teori

Cip kamera OV7670

Output lalai dari cip kamera OV7670 terdiri daripada isyarat video YUV (4: 2: 2) dan 3 bentuk gelombang masa. Format output lain boleh dilakukan dengan memprogramkan daftar dalaman melalui bas yang serasi dengan I2C.

Isyarat video YUV (4: 2: 2) (foto 1) adalah urutan piksel monokrom (hitam & putih) berterusan yang dipisahkan oleh maklumat warna U (perbezaan warna biru) dan V (perbezaan warna merah).

Format output ini dikenali sebagai YUV (4: 2: 2) kerana setiap kumpulan 4 bait mengandungi 2 bait monokrom dan dan 2 bait warna.

Monokrom

Untuk mendapatkan imej monokrom, kita mesti mengambil sampel setiap bait data kedua.

Arduino hanya mempunyai 2K memori akses rawak tetapi setiap bingkai terdiri daripada 640 * 2 * 480 = 307, 200 bait data. Kecuali kita menambahkan frame-grabber ke OV7670 semua data mesti dihantar ke PC baris demi baris untuk diproses.

Terdapat dua kemungkinan:

Untuk setiap 480 bingkai berturut-turut, kita dapat menangkap satu jalur ke Arduino pada kelajuan tinggi sebelum mengirimkannya ke PC pada 1Mbps. Pendekatan sedemikian akan menjadikan OV7670 berfungsi pada kelajuan penuh tetapi akan memakan masa yang lama (lebih dari satu minit).

Pendekatan yang saya ambil adalah untuk memperlahankan PCLK hingga 8uS dan mengirim setiap sampel ketika datang. Pendekatan ini jauh lebih pantas (6.4 saat).

Langkah 4: Nota Reka Bentuk

Nota Reka Bentuk
Nota Reka Bentuk
Nota Reka Bentuk
Nota Reka Bentuk
Nota Reka Bentuk
Nota Reka Bentuk

Keserasian

Cip kamera OV7670 adalah peranti 3v3 volt. Lembaran data menunjukkan bahawa voltan di atas 3.5 volt akan merosakkan cip.

Untuk mengelakkan Arduino 5 volt anda memusnahkan cip kamera OV7670:

  • Isyarat jam luaran (XCLK) dari Arduino mesti dikurangkan ke tahap selamat dengan menggunakan pembahagi voltan.
  • Perintang penarik Arduino I2C dalaman hingga 5 volt mesti dilumpuhkan dan diganti dengan perintang penarik luaran ke bekalan 3v3 volt.
  • Program Arduino anda SEBELUM memasang kabel jumper kerana beberapa pin masih boleh diprogramkan sebagai output dari projek sebelumnya !!! (Saya belajar ini dengan cara yang sukar … untungnya saya membeli dua kerana harganya sangat murah).

Jam luaran

Cip kamera OV7670 memerlukan jam luaran dalam julat frekuensi 10Mhz hingga 24MHz.

Frekuensi tertinggi yang dapat kita hasilkan dari Arduino 16MHz adalah 8MHz tetapi ini nampaknya berfungsi.

Pautan bersiri

Memerlukan sekurang-kurangnya 10 uS (mikrodetik) untuk menghantar 1 bait data merentasi pautan bersiri 1Mbps (juta bit sesaat). Kali ini dibuat seperti berikut:

  • 8 bit data (8us)
  • 1 bit permulaan (1uS)
  • 1 bit berhenti (1uS)

Jam dalaman

Frekuensi jam piksel dalaman (PCLK) dalam OV7670 ditetapkan oleh bit [5: 0] dalam daftar CLKRC (lihat foto 1). [1]

Sekiranya kita menetapkan bit [5: 0] = B111111 = 63 dan menerapkannya pada formula di atas maka:

  • F (jam dalaman) = F (jam input) / (Bit [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz atau
  • = 8uS

Oleh kerana kami hanya mengambil sampel setiap bait data kedua, selang PCLK 8uS menghasilkan sampel 16uS yang cukup masa untuk menghantar 1 bait data (10uS) meninggalkan 6uS untuk diproses.

Kadar bingkai

Setiap bingkai video VGA terdiri daripada 784 * 510 piksel (elemen gambar) di mana 640 * 480 piksel dipaparkan. Oleh kerana format output YUV (4: 2: 2) memiliki rata-rata 2 bait data per piksel, setiap bingkai akan memakan waktu 784 * 2 * 510 * 8 uS = 6.4 saat.

Kamera ini TIDAK pantas !!!

Kedudukan mendatar

Gambar boleh dipindahkan secara mendatar jika kita mengubah nilai HSTART dan HSTOP sambil mengekalkan perbezaan 640 piksel.

Semasa memindahkan gambar anda ke kiri, kemungkinan nilai HSTOP anda lebih rendah daripada nilai HSTART!

Jangan risau … ini semua berkaitan dengan limpahan kaunter seperti yang dijelaskan dalam foto 2.

Daftar

OV7670 mempunyai 201 register lapan bit untuk mengawal perkara seperti keuntungan, keseimbangan putih, dan pendedahan.

Satu bait data hanya membenarkan 256 nilai dalam julat [0] hingga [255]. Sekiranya kita memerlukan lebih banyak kawalan, kita mesti merangkumi beberapa daftar. Dua bait memberi kita 65536 kemungkinan … tiga bait memberi kita 16, 777, 216.

Daftar 16 bit AEC (Automatic Exposure Control) yang ditunjukkan dalam foto 3 adalah contoh seperti itu dan dibuat dengan menggabungkan bahagian dari tiga daftar berikut.

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

Berhati-hati … alamat daftar tidak dikumpulkan bersama!

Kesan sampingan

Laju bingkai perlahan memperkenalkan sejumlah kesan sampingan yang tidak diingini:

Untuk pendedahan yang betul, OV7670 menjangka dapat berfungsi pada kadar bingkai 30 fps (bingkai sesaat). Oleh kerana setiap bingkai mengambil masa 6.4 saat, rana elektronik dibuka 180 kali lebih lama dari biasanya yang bermaksud semua gambar akan terlalu terdedah melainkan kita mengubah beberapa nilai daftar.

Untuk mengelakkan pendedahan berlebihan, saya telah menetapkan semua bit pendaftaran AEC (kawalan pendedahan automatik) ke sifar. Walaupun begitu, penapis ketumpatan neutral diperlukan di hadapan lensa ketika pencahayaannya terang.

Pendedahan yang lama juga mempengaruhi data UV. Oleh kerana saya belum menemui kombinasi daftar yang menghasilkan warna yang betul … anggap ini masih berjalan.

Catatan

[1]

Rumus yang ditunjukkan dalam lembaran data (foto 1) betul tetapi jarak hanya menunjukkan bit [4: 0]?

Langkah 5: Bentuk Gelombang Masa

Bentuk Gelombang Masa
Bentuk Gelombang Masa
Bentuk Gelombang Masa
Bentuk Gelombang Masa
Bentuk Gelombang Masa
Bentuk Gelombang Masa

Catatan di sudut kiri bawah rajah "VGA Frame Timing" (foto 1) berbunyi:

Untuk YUV / RGB, tp = 2 x TPCLK

Gambar 1, 2, & 3 mengesahkan lembaran data dan mengesahkan bahawa Omnivision memperlakukan setiap 2 bait data sebagai setara dengan 1 piksel.

Bentuk gelombang osiloskop juga mengesahkan bahawa HREF tetap RENDAH semasa selang pengosongan.

Rajah 4 mengesahkan bahawa output XCLK dari Arduino adalah 8MHz. Alasan kita melihat gelombang sinus, bukan gelombang persegi, adalah kerana semua harmonik ganjil tidak dapat dilihat dengan osiloskop pensampelan 20MHz saya.

Langkah 6: Frame Grabber

Grabber Bingkai
Grabber Bingkai

Sensor gambar dalam cip kamera OV7670 terdiri dari array 656 * 486 piksel di mana grid 640 * 480 piksel digunakan untuk foto.

Nilai daftar HSTART, HSTOP, HREF, dan VSTRT, VSTOP, VREF digunakan untuk meletakkan gambar di atas sensor. Sekiranya gambar tidak diposisikan dengan betul di atas sensor, anda akan melihat jalur hitam di atas satu atau lebih tepi seperti yang dijelaskan di bahagian "Nota Reka Bentuk".

OV7670 mengimbas setiap baris gambar satu piksel pada satu masa bermula dari sudut kiri atas hingga mencapai piksel kanan bawah. Arduino hanya menyampaikan piksel ini ke PC melalui pautan bersiri seperti yang ditunjukkan dalam foto 1.

Tugas frame-grabbers adalah menangkap masing-masing 640 * 480 = 307200 piksel ini dan menampilkan isinya di tetingkap "gambar"

Pemprosesan 3 mencapainya dengan menggunakan empat baris kod berikut !!

Baris kod 1:

bait byteBuffer = bait baru [maxBytes + 1]; // di mana maxBytes = 307200

Kod asas dalam pernyataan ini membuat:

  • array 307201 bait yang disebut "byteBuffer [307201]"
  • Byte tambahan adalah untuk watak penamatan (linefeed).

Baris kod 2:

saiz (640, 480);

Kod asas dalam pernyataan ini membuat:

  • pemboleh ubah yang disebut "lebar = 640;"
  • pemboleh ubah yang disebut "tinggi = 480";
  • array 307200 piksel yang disebut "piksel [307200]"
  • tetingkap “gambar” 640 * 480 piksel di mana kandungan piksel dipaparkan. Tetingkap "gambar" ini terus diperbaharui dengan kecepatan bingkai 60 fps.

Baris kod 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Kod asas dalam pernyataan ini:

  • buffer data masuk secara tempatan sehingga melihat watak "lf" (linefeed).
  • selepas itu membuang 307200 bait data tempatan pertama ke dalam array byteBuffer .
  • Ini juga menyimpan jumlah bait yang diterima (307201) ke dalam pemboleh ubah yang disebut "byteCount".

Baris kod 4:

piksel = warna (byteBuffer );

Apabila diletakkan dalam gelung untuk-seterusnya, kod yang mendasari dalam pernyataan ini:

  • menyalin kandungan array "byteBuffer " ke array "piksel"
  • kandungannya muncul di tetingkap gambar.

Pukulan Utama:

Penangkap bingkai mengenali ketukan kekunci berikut:

  • ‘C’ = menangkap gambar
  • 'S' = simpan gambar ke fail.

Langkah 7: Perisian

Muat turun dan pasang setiap pakej perisian berikut jika belum dipasang:

  • "Arduino" dari
  • "Java 8" dari https://java.com/en/download/ [1]
  • "Memproses 3" dari

Memasang lakaran Arduino:

  • Tanggalkan semua wayar pelompat OV7670 [2]
  • Sambungkan kabel USB ke Arduino anda
  • Salin kandungan "OV7670_camera_mono_V2.ino" (dilampirkan) ke dalam "sketsa" Arduino dan simpan.
  • Muat naik lakaran ke Arduino anda.
  • Cabut plag Arduino
  • Anda kini boleh menyambungkan semula kabel pelompat OV7670 dengan selamat
  • Sambungkan semula kabel USB.

Memasang dan menjalankan lakaran Pemprosesan

  • Salin kandungan "OV7670_camera_mono_V2.pde" (dilampirkan) ke dalam "sketsa" Pemprosesan dan simpan.
  • Klik butang "jalankan" kiri atas … tetingkap gambar hitam akan muncul
  • Klik tetingkap gambar "hitam"
  • Tekan kekunci "c" untuk menangkap gambar. (lebih kurang 6.4 saat).
  • Tekan kekunci "s" untuk menyimpan gambar dalam folder pemprosesan anda
  • Ulangi langkah 4 & 5
  • Klik butang "berhenti" untuk keluar dari program.

Catatan

[1]

Pemprosesan 3 memerlukan Java 8

[2]

Ini adalah langkah keselamatan "sekali sahaja" untuk mengelakkan kerosakan pada cip kamera OV7670 anda.

Sehingga lakaran "OV7670_camera_mono.ini" dimuatkan ke Arduino anda, perintang penarik dalaman disambungkan ke 5 volt, dan ada kemungkinan beberapa baris data Arduino mungkin output 5 volt … yang semuanya membawa maut cip kamera 3v3 volt OV7670.

Setelah Arduino diprogramkan, tidak perlu mengulangi langkah ini dan nilai-nilai pendaftaran dapat diubah dengan selamat.

Langkah 8: Memperolehi Gambar Berwarna

Memperolehi Gambar Berwarna
Memperolehi Gambar Berwarna
Memperolehi Gambar Berwarna
Memperolehi Gambar Berwarna
Memperolehi Gambar Berwarna
Memperolehi Gambar Berwarna

Perisian berikut adalah eksperimen semata-mata dan disiarkan dengan harapan beberapa teknik terbukti berguna. Warna nampaknya terbalik … Saya belum menemui tetapan daftar yang betul. Sekiranya anda menemui jalan penyelesaian, hantarkan hasil anda

Sekiranya kita ingin memperoleh gambar berwarna, semua bait data mesti ditangkap dan formula berikut diterapkan.

OV7670 menggunakan formula berikut untuk menukar maklumat warna RGB (merah, hijau, biru) menjadi 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)

Rumus berikut boleh digunakan untuk menukar YUV (4: 2: 2) kembali ke warna RGB: [2]

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

Perisian yang dilampirkan hanyalah lanjutan dari perisian monokrom:

  • Permintaan penangkapan "c" dikirim ke Arduino
  • Arduino menghantar bait bernombor genap (monokrom) ke PC
  • PC menyimpan bait ini ke dalam array
  • Arduino seterusnya menghantar byte bernombor ganjil (kroma) ke PC.
  • Byte ini disimpan ke dalam array kedua … kita kini mempunyai keseluruhan gambar.
  • Rumus di atas kini digunakan untuk setiap kumpulan empat bait data UYVY.
  • Piksel warna yang dihasilkan kemudian ditempatkan dalam array "piksel"
  • PC mengimbas array "piksel " dan gambar muncul di tetingkap "gambar".

Perisian Processing 3 secara ringkas memaparkan setiap imbasan dan hasil akhir:

  • Foto 1 menunjukkan data kroma U & V dari imbasan 1
  • Foto 2 menunjukkan data pencahayaan Y1 & Y2 dari imbasan 2
  • Foto 3 menunjukkan gambar warna … hanya satu perkara yang salah … beg harus berwarna hijau !!

Saya akan menghantar kod baru setelah saya menyelesaikan program ini …

Rujukan:

[1]

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

[2]

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

Klik di sini untuk melihat arahan saya yang lain.

Disyorkan: