Daftar Isi:

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

Video: Buat Kamera Anda Sendiri: 8 Langkah

Video: Buat Kamera Anda Sendiri: 8 Langkah
Video: Kyutt.. Pantomim Sulap Ini Bikin Deddy Corbuzier Ketawa #shorts 2024, November
Anonim
Image
Image
Buat Kamera Anda Sendiri
Buat Kamera Anda Sendiri

Instruksi ini menjelaskan cara membuat kamera monokrom menggunakan sensor gambar Omnivision OV7670, mikrokontroler Arduino, beberapa kabel jumper, dan perangkat lunak Processing 3.

Perangkat lunak eksperimental untuk mendapatkan gambar berwarna juga disajikan.

Tekan tombol “c” untuk mengambil gambar 640*480 piksel … tekan tombol “s” untuk menyimpan gambar ke file. Gambar yang berurutan diberi nomor urut jika Anda ingin membuat film selang waktu pendek.

Kamera tidak cepat (setiap pemindaian membutuhkan waktu 6,4 detik) dan hanya cocok untuk digunakan dalam pencahayaan tetap.

Biayanya, tidak termasuk Arduino dan PC Anda, kurang dari secangkir kopi.

Gambar-gambar

Bagian-bagian komponen, tanpa kabel jumper, ditunjukkan pada foto pembuka.

Foto kedua adalah tangkapan layar yang menunjukkan perangkat lunak kamera Arduino dan frame-grabber Processing 3. Inset menunjukkan bagaimana kamera terhubung.

Video menunjukkan kamera beraksi. Saat tombol ambil “c” ditekan, akan ada kilatan singkat yang diikuti oleh ledakan aktivitas saat gambar dipindai. Gambar secara otomatis muncul di jendela tampilan setelah pemindaian selesai. Gambar-gambar tersebut kemudian terlihat muncul di folder Processing setelah setiap penekanan tombol “s”. Video diakhiri dengan bersepeda cepat melalui masing-masing dari tiga gambar yang disimpan.

Langkah 1: Diagram Sirkuit

Diagram Sirkuit
Diagram Sirkuit
Diagram Sirkuit
Diagram Sirkuit
Diagram Sirkuit
Diagram Sirkuit

Diagram sirkuit, untuk semua versi kamera ini, ditunjukkan pada foto 1.

Foto 2, 3 menunjukkan bagaimana jumper-kabel dan komponen terhubung.

Tanpa braket aluminium, gambar-gambar itu berbaring miring.

Peringatan

Program Arduino Anda SEBELUM memasang kabel jumper ke chip kamera OV7670. Ini akan mencegah pin keluaran 5 volt dari program sebelumnya merusak chip kamera 3v3 volt OV7670.

Langkah 2: Daftar Bagian

Daftar Suku Cadang
Daftar Suku Cadang

Bagian berikut diperoleh dari

  • 1 saja Modul Kamera VGA OV7670 300KP untuk arduino DIY KIT
  • 1 saja braket kamera lengkap dengan mur dan baut
  • 1 hanya UNO R3 untuk arduino MEGA328P 100% asli ATMEGA16U2 dengan Kabel USB

Bagian-bagian berikut diperoleh secara lokal

  • 18 saja kabel jumper pria-wanita Arduino
  • 3 hanya kabel jumper wanita-wanita Arduino
  • 1 papan roti mini saja
  • 4 hanya 4K7 ohm 1/2 watt resistor
  • 1 hanya dudukan aluminium bekas.

Anda juga akan membutuhkan lembar data berikut:

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

Langkah 3: Teori

Teori
Teori

Chip kamera OV7670

Output default dari chip kamera OV7670 terdiri dari sinyal video YUV (4:2:2) dan 3 bentuk gelombang waktu. Format output lain dimungkinkan dengan memprogram register internal melalui bus yang kompatibel dengan I2C.

Sinyal video YUV (4:2:2) (foto 1) adalah urutan berkelanjutan piksel monokrom (hitam & putih) yang dipisahkan oleh informasi warna U (perbedaan warna biru) dan V (perbedaan warna merah).

Format keluaran ini dikenal sebagai YUV (4:2:2) karena setiap kelompok 4 byte berisi 2 byte monokrom dan 2 byte warna.

Satu warna

Untuk mendapatkan gambar monokrom kita harus mengambil sampel setiap byte data kedua.

Arduino hanya memiliki 2K memori akses acak tetapi setiap frame terdiri dari 640*2*480 = 307.200 byte data. Kecuali kami menambahkan frame-grabber ke OV7670, semua data harus dikirim ke PC baris demi baris untuk diproses.

Ada dua kemungkinan:

Untuk setiap 480 frame berturut-turut, kita dapat menangkap satu baris ke Arduino dengan kecepatan tinggi sebelum mengirimkannya ke PC dengan kecepatan 1Mbps. Pendekatan seperti itu akan membuat OV7670 bekerja dengan kecepatan penuh tetapi akan memakan waktu lama (lebih dari satu menit).

Pendekatan yang saya ambil adalah dengan memperlambat PCLK ke 8uS dan mengirimkan setiap sampel yang datang. Pendekatan ini secara signifikan lebih cepat (6,4 detik).

Langkah 4: Catatan Desain

Catatan Desain
Catatan Desain
Catatan Desain
Catatan Desain
Catatan Desain
Catatan Desain

Kesesuaian

Chip kamera OV7670 adalah perangkat 3v3 volt. Lembar data menunjukkan bahwa tegangan di atas 3,5 volt akan merusak chip.

Untuk mencegah Arduino 5 volt Anda dari menghancurkan chip kamera OV7670:

  • Sinyal clock eksternal (XCLK) dari Arduino harus diturunkan ke tingkat yang aman melalui pembagi tegangan.
  • Resistor pull-up Arduino I2C internal hingga 5 volt harus dinonaktifkan dan diganti dengan resistor pull-up eksternal ke suplai 3v3 volt.
  • Program Arduino Anda SEBELUM memasang kabel jumper karena beberapa pin mungkin masih diprogram sebagai output dari proyek sebelumnya !!! (Saya mempelajari ini dengan susah payah … untungnya saya membeli dua karena harganya sangat murah).

Jam eksternal

Chip kamera OV7670 memerlukan jam eksternal dalam rentang frekuensi 10Mhz hingga 24MHz.

Frekuensi tertinggi yang dapat kami hasilkan dari Arduino 16MHz adalah 8MHz tetapi ini tampaknya berhasil.

Tautan serial

Dibutuhkan setidaknya 10 uS (mikrodetik) untuk mengirim 1 byte data melalui tautan serial 1Mbps (juta bit per detik). Kali ini dibuat sebagai berikut:

  • 8 bit data (8us)
  • 1 bit awal (1uS)
  • 1 stop-bit (1uS)

jam internal

Frekuensi internal pixel clock (PCLK) dalam OV7670 diatur oleh bit[5:0] dalam register CLKRC (lihat foto 1). [1]

Jika kita menetapkan bits[5:0] = B111111 = 63 dan menerapkannya pada rumus di atas, maka:

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

Karena kami hanya mengambil sampel setiap byte data kedua, interval PCLK 8uS menghasilkan sampel 16uS yang merupakan waktu yang cukup untuk mengirimkan 1 byte data (10uS) meninggalkan 6uS untuk diproses.

Kecepatan bingkai

Setiap bingkai video VGA terdiri dari 784*510 piksel (elemen gambar) di mana 640*480 piksel ditampilkan. Karena format output YUV (4:2:2) memiliki rata-rata 2 byte data per piksel, setiap frame akan memakan waktu 784*2*510*8 uS = 6,4 detik.

Kamera ini TIDAK cepat!!!

Posisi horizontal

Gambar dapat dipindahkan secara horizontal jika kita mengubah nilai HSTART dan HSTOP sambil mempertahankan perbedaan 640 piksel.

Saat memindahkan gambar Anda ke kiri, ada kemungkinan nilai HSTOP Anda lebih kecil dari nilai HSTART!

Jangan khawatir… ini semua berkaitan dengan counter overflows seperti yang dijelaskan pada foto 2.

Daftar

OV7670 memiliki 201 register delapan bit untuk mengontrol hal-hal seperti gain, white balance, dan eksposur.

Satu byte data hanya memungkinkan 256 nilai dalam rentang [0] hingga [255]. Jika kita membutuhkan lebih banyak kontrol maka kita harus mengalirkan beberapa register. Dua byte memberi kita 65536 kemungkinan … tiga byte memberi kita 16, 777, 216.

Register AEC (Automatic Exposure Control) 16 bit yang ditunjukkan pada foto 3 adalah contohnya dan dibuat dengan menggabungkan bagian dari tiga register berikut.

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

Berhati-hatilah … alamat register tidak dikelompokkan bersama!

Efek samping

Kecepatan bingkai yang lambat menimbulkan sejumlah efek samping yang tidak diinginkan:

Untuk eksposur yang benar, OV7670 mengharapkan untuk bekerja pada frame rate 30 fps (frame per detik). Karena setiap frame membutuhkan waktu 6,4 detik, rana elektronik terbuka 180 kali lebih lama dari biasanya yang berarti semua gambar akan diekspos secara berlebihan kecuali jika kita mengubah beberapa nilai register.

Untuk mencegah over-exposure, saya telah mengatur semua bit register AEC (auto exposure control) ke nol. Meski begitu dibutuhkan filter neutral density di depan lensa saat pencahayaan terang.

Paparan yang lama juga tampaknya mempengaruhi data UV. Karena saya belum menemukan kombinasi register yang menghasilkan warna yang benar … anggap ini sebagai pekerjaan yang sedang berjalan.

Catatan

[1]

Rumus yang ditunjukkan pada lembar data (foto 1) benar tetapi rentangnya hanya menunjukkan bit[4:0] ?

Langkah 5: Bentuk Gelombang Waktu

Bentuk Gelombang Waktu
Bentuk Gelombang Waktu
Bentuk Gelombang Waktu
Bentuk Gelombang Waktu
Bentuk Gelombang Waktu
Bentuk Gelombang Waktu

Catatan di sudut kiri bawah diagram “VGA Frame Timing” (foto 1) berbunyi:

Untuk YUV/RGB, tp = 2 x TPCLK

Gambar 1, 2, & 3 memverifikasi lembar data dan mengonfirmasi bahwa Omnivision memperlakukan setiap 2 byte data sebagai setara dengan 1 piksel.

Bentuk gelombang osiloskop juga memverifikasi bahwa HREF tetap RENDAH selama interval pengosongan.

Gbr.4 menegaskan bahwa output XCLK dari Arduino adalah 8MHz. Alasan kami melihat gelombang sinus, bukan gelombang persegi, adalah karena semua harmonik aneh tidak terlihat oleh osiloskop sampling 20MHz saya.

Langkah 6: Bingkai Grabber

Bingkai Grabber
Bingkai Grabber

Sensor gambar dalam chip kamera OV7670 terdiri dari susunan 656*486 piksel di mana kisi-kisi 640*480 piksel digunakan untuk foto.

Nilai register HSTART, HSTOP, HREF, dan VSTRT, VSTOP, VREF digunakan untuk memposisikan gambar di atas sensor. Jika gambar tidak diposisikan dengan benar di atas sensor, Anda akan melihat pita hitam di satu atau lebih tepi seperti yang dijelaskan di bagian "Catatan Desain".

OV7670 memindai setiap baris gambar satu piksel pada satu waktu mulai dari sudut kiri atas hingga mencapai piksel kanan bawah. Arduino hanya meneruskan piksel ini ke PC melalui tautan serial seperti yang ditunjukkan pada foto 1.

Tugas frame-grabbers adalah untuk menangkap masing-masing dari 640*480=307200 piksel dan menampilkan konten dalam jendela “gambar”

Pemrosesan 3 mencapai ini menggunakan empat baris kode berikut !!

Baris kode 1:

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

Kode yang mendasari dalam pernyataan ini membuat:

  • array 307201 byte yang disebut "byteBuffer[307201]"
  • Byte ekstra adalah untuk karakter terminasi (linefeed).

Baris kode 2:

ukuran (640, 480);

Kode yang mendasari dalam pernyataan ini membuat:

  • variabel yang disebut “lebar=640;”
  • variabel yang disebut "tinggi = 480";
  • array 307200 piksel yang disebut "piksel [307200]"
  • jendela "gambar" 640*480 piksel di mana konten larik piksel ditampilkan. Jendela "gambar" ini terus diperbarui pada kecepatan bingkai 60 fps.

Baris kode 3:

byteCount = myPort.readBytesUntil(lf, byteBuffer);

Kode yang mendasari dalam pernyataan ini:

  • buffer data yang masuk secara lokal sampai melihat karakter "lf" (linefeed).
  • setelah itu ia membuang 307200 byte pertama dari data lokal ke dalam larik byteBuffer.
  • Ini juga menyimpan jumlah byte yang diterima (307201) ke dalam variabel yang disebut "byteCount".

Baris kode 4:

piksel = warna(byteBuffer);

Ketika ditempatkan di for-next-loop, kode yang mendasari pernyataan ini:

  • menyalin konten larik "byteBuffer" ke larik "piksel"
  • yang isinya muncul di jendela gambar.

Stroke Kunci:

Frame-grabber mengenali penekanan tombol berikut:

  • 'c' = ambil gambar
  • 's' = simpan gambar ke file.

Langkah 7: Perangkat Lunak

Unduh dan instal setiap paket perangkat lunak berikut jika belum diinstal:

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

Memasang sketsa Arduino:

  • Lepas semua kabel jumper OV7670 [2]
  • Hubungkan kabel USB ke Arduino Anda
  • Salin konten "OV7670_camera_mono_V2.ino" (terlampir) ke dalam "sketsa" Arduino dan simpan.
  • Unggah sketsa ke Arduino Anda.
  • Cabut Arduino
  • Anda sekarang dapat menyambungkan kembali kabel jumper OV7670 dengan aman
  • Sambungkan kembali kabel USB.

Menginstal dan menjalankan sketsa Pemrosesan

  • Salin konten "OV7670_camera_mono_V2.pde" (terlampir) ke dalam "sketsa" Pemrosesan dan simpan.
  • Klik tombol "jalankan" kiri atas … jendela gambar hitam akan muncul
  • Klik jendela gambar "hitam"
  • Tekan tombol “c” untuk mengambil gambar. (sekitar 6,4 detik).
  • Tekan tombol "s" untuk menyimpan gambar di folder pemrosesan Anda
  • Ulangi langkah 4 & 5
  • Klik tombol “stop” untuk keluar dari program.

Catatan

[1]

Pemrosesan 3 membutuhkan Java 8

[2]

Ini adalah langkah keamanan "hanya sekali" untuk menghindari kerusakan chip kamera OV7670 Anda.

Sampai sketsa "OV7670_camera_mono.ini" telah diunggah ke Arduino Anda, resistor pull-up internal terhubung ke 5 volt, ditambah ada kemungkinan beberapa jalur data Arduino mungkin keluaran 5 volt … yang semuanya fatal bagi chip kamera 3v3 volt OV7670.

Setelah Arduino diprogram, tidak perlu mengulangi langkah ini dan nilai register dapat diubah dengan aman.

Langkah 8: Mendapatkan Gambar Berwarna

Mendapatkan Gambar Berwarna
Mendapatkan Gambar Berwarna
Mendapatkan Gambar Berwarna
Mendapatkan Gambar Berwarna
Mendapatkan Gambar Berwarna
Mendapatkan Gambar Berwarna

Perangkat lunak berikut ini murni eksperimental dan diposting dengan harapan bahwa beberapa teknik akan terbukti bermanfaat. Warnanya tampak terbalik … Saya belum menemukan pengaturan register yang benar. Jika Anda menemukan solusi silahkan posting hasil Anda

Jika kita ingin mendapatkan gambar berwarna, semua byte data harus ditangkap dan rumus berikut diterapkan.

OV7670 menggunakan rumus berikut untuk mengubah informasi 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 dapat digunakan untuk mengonversi 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)

Perangkat lunak terlampir hanyalah perpanjangan dari perangkat lunak monokrom:

  • Permintaan penangkapan "c" dikirim ke Arduino
  • Arduino mengirimkan byte bernomor genap (monokrom) ke PC
  • PC menyimpan byte ini ke dalam array
  • Arduino selanjutnya mengirimkan byte bernomor ganjil (chroma) ke PC.
  • Byte ini disimpan ke dalam array kedua … kita sekarang memiliki seluruh gambar.
  • Rumus di atas sekarang diterapkan ke setiap kelompok empat byte data UYVY.
  • Piksel warna yang dihasilkan kemudian ditempatkan di larik “piksel”
  • PC memindai larik “piksel” dan sebuah gambar muncul di jendela “gambar”.

Perangkat lunak Processing 3 secara singkat menampilkan setiap pemindaian dan hasil akhir:

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

Saya akan memposting kode baru setelah saya menyelesaikan program ini …

Referensi:

[1]

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

[2]

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

Klik di sini untuk melihat instruksi saya yang lain.

Direkomendasikan: