Mục lục:

Tạo máy ảnh của riêng bạn: 8 bước
Tạo máy ảnh của riêng bạn: 8 bước

Video: Tạo máy ảnh của riêng bạn: 8 bước

Video: Tạo máy ảnh của riêng bạn: 8 bước
Video: Cách setup, cài đặt, thiết lập các thông số máy ảnh cơ bản, khi mới mua máy 2024, Tháng bảy
Anonim
Image
Image
Tạo máy ảnh của riêng bạn
Tạo máy ảnh của riêng bạn

Tài liệu hướng dẫn này giải thích cách tạo camera đơn sắc bằng cảm biến hình ảnh Omnivision OV7670, vi điều khiển Arduino, một vài dây nhảy và phần mềm Xử lý 3.

Phần mềm thử nghiệm để thu được hình ảnh màu cũng được trình bày.

Nhấn phím “c” để chụp ảnh 640 * 480 pixel… nhấn phím “s” để lưu ảnh vào tệp. Các hình ảnh kế tiếp được đánh số thứ tự nếu bạn muốn tạo một đoạn phim tua nhanh thời gian ngắn.

Máy ảnh không nhanh (mỗi lần quét mất 6,4 giây) và chỉ thích hợp để sử dụng trong điều kiện ánh sáng cố định.

Chi phí, không bao gồm Arduino và PC của bạn, chưa bằng một tách cà phê.

Hình ảnh

Các bộ phận thành phần, không có dây nối, được hiển thị trong ảnh mở đầu.

Bức ảnh thứ hai là ảnh chụp màn hình hiển thị phần mềm máy ảnh Arduino và bộ lấy khung hình Xử lý 3. Nội dung hiển thị cách máy ảnh được kết nối.

Video minh họa máy ảnh đang hoạt động. Khi nhấn phím chụp ảnh “c”, sẽ có một đèn flash ngắn sau đó là một loạt hoạt động khi hình ảnh được quét. Hình ảnh tự động xuất hiện trong cửa sổ hiển thị sau khi quá trình quét hoàn tất. Sau đó, hình ảnh sẽ xuất hiện trong thư mục Xử lý sau mỗi lần nhấn phím “s”. Đoạn video kết thúc bằng cách đi nhanh qua từng hình ảnh trong số ba hình ảnh đã lưu.

Bước 1: Sơ đồ mạch

Sơ đồ mạch
Sơ đồ mạch
Sơ đồ mạch
Sơ đồ mạch
Sơ đồ mạch
Sơ đồ mạch

Sơ đồ mạch, cho tất cả các phiên bản của máy ảnh này, được hiển thị trong ảnh 1.

Ảnh 2, 3 cho thấy cách kết nối dây nhảy và các thành phần.

Không có khung nhôm, hình ảnh sẽ nằm nghiêng.

Cảnh báo

Lập trình Arduino của bạn TRƯỚC KHI gắn bất kỳ dây jumper nào vào chip camera OV7670. Điều này sẽ ngăn các chân đầu ra 5 volt từ chương trình trước đó phá hủy chip camera 3v3 volt OV7670.

Bước 2: Danh sách bộ phận

Danh sách các bộ phận
Danh sách các bộ phận

Các phần sau được lấy từ

  • 1 mô-đun máy ảnh VGA OV7670 300KP duy nhất cho arduino DIY KIT
  • 1 khung máy ảnh duy nhất hoàn chỉnh với đai ốc và bu lông
  • 1 UNO R3 duy nhất cho arduino MEGA328P ATMEGA16U2 gốc 100% với cáp USB

Các bộ phận sau đây được lấy tại địa phương

  • 18 cáp jumper nam-nữ anly Arduino
  • 3 cáp jumper dành cho nữ và nữ duy nhất của Arduinin
  • 1 bảng bánh mì mini duy nhất
  • 4 điện trở chỉ 4K7 ohm 1/2 watt
  • 1 chỉ nhôm phế liệu đứng.

Bạn cũng sẽ cần các bảng dữ liệu sau:

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

Bước 3: Lý thuyết

Học thuyết
Học thuyết

Chip camera OV7670

Đầu ra mặc định từ chip camera OV7670 bao gồm tín hiệu video YUV (4: 2: 2) và 3 dạng sóng định thời. Các định dạng đầu ra khác có thể thực hiện được bằng cách lập trình các thanh ghi bên trong thông qua một bus tương thích I2C.

Tín hiệu video YUV (4: 2: 2) (ảnh 1) là một chuỗi liên tục các pixel đơn sắc (đen trắng) được phân tách bằng thông tin màu U (chênh lệch màu xanh lam) và V (chênh lệch màu đỏ).

Định dạng đầu ra này được gọi là YUV (4: 2: 2) vì mỗi nhóm 4 byte chứa 2 byte đơn sắc và 2 byte màu.

Đơn sắc

Để có được một hình ảnh đơn sắc, chúng ta phải lấy mẫu mỗi byte dữ liệu thứ hai.

Arduino chỉ có 2K bộ nhớ truy cập ngẫu nhiên nhưng mỗi khung hình bao gồm 640 * 2 * 480 = 307, 200 byte dữ liệu. Trừ khi chúng tôi thêm bộ lấy khung vào OV7670, tất cả dữ liệu phải được gửi từng dòng một đến PC để xử lý.

Có hai khả năng:

Đối với mỗi 480 khung liên tiếp, chúng ta có thể bắt một dòng tới Arduino ở tốc độ cao trước khi gửi đến PC với tốc độ 1Mbps. Cách tiếp cận như vậy sẽ thấy OV7670 hoạt động ở tốc độ tối đa nhưng sẽ mất nhiều thời gian (hơn một phút).

Cách tiếp cận mà tôi đã thực hiện là làm chậm PCLK xuống 8uS và gửi từng mẫu khi nó đến. Cách tiếp cận này nhanh hơn đáng kể (6,4 giây).

Bước 4: Ghi chú thiết kế

Ghi chú thiết kế
Ghi chú thiết kế
Ghi chú thiết kế
Ghi chú thiết kế
Ghi chú thiết kế
Ghi chú thiết kế

Khả năng tương thích

Chip camera OV7670 là một thiết bị 3v3 volt. Bảng dữ liệu chỉ ra rằng điện áp trên 3,5 volt sẽ làm hỏng chip.

Để ngăn Arduino 5 volt của bạn phá hủy chip camera OV7670:

  • Tín hiệu xung nhịp bên ngoài (XCLK) từ Arduino phải được giảm xuống mức an toàn bằng bộ chia điện áp.
  • Phải tắt điện trở kéo lên của Arduino I2C bên trong đến 5 volt và thay thế bằng điện trở kéo lên bên ngoài với nguồn điện 3v3.
  • Lập trình Arduino của bạn TRƯỚC KHI gắn bất kỳ dây nhảy nào vì một số chân có thể vẫn được lập trình như một đầu ra từ một dự án trước đó !!! (Tôi đã học được điều này một cách khó khăn… may mắn thay tôi đã mua được hai chiếc vì chúng rất rẻ).

Đồng hồ bên ngoài

Chip camera OV7670 yêu cầu xung nhịp bên ngoài trong dải tần từ 10Mhz đến 24MHz.

Tần số cao nhất mà chúng tôi có thể tạo ra từ Arduino 16MHz là 8MHz nhưng điều này dường như hoạt động.

Liên kết nối tiếp

Phải mất ít nhất 10 uS (micro giây) để gửi 1 byte dữ liệu qua liên kết nối tiếp 1Mbps (triệu bit mỗi giây). Thời gian này được tạo thành như sau:

  • 8 bit dữ liệu (8us)
  • 1 bit bắt đầu (1uS)
  • 1 bit dừng (1uS)

Đồng hồ nội bộ

Tần số đồng hồ pixel bên trong (PCLK) trong OV7670 được đặt bởi các bit [5: 0] trong thanh ghi CLKRC (xem ảnh 1). [1]

Nếu chúng ta đặt bit [5: 0] = B111111 = 63 và áp dụng nó vào công thức trên thì:

  • F (đồng hồ bên trong) = F (đồng hồ đầu vào) / (Bit [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 Hz hoặc
  • = 8uS

Vì chúng tôi chỉ lấy mẫu mỗi byte dữ liệu thứ hai, khoảng thời gian PCLK 8uS dẫn đến mẫu 16uS, đủ thời gian để truyền 1 byte dữ liệu (10uS) còn lại 6uS để xử lý.

Tỷ lệ khung hình

Mỗi khung hình video VGA bao gồm 784 * 510 pixel (yếu tố hình ảnh) trong đó 640 * 480 pixel được hiển thị. Vì định dạng đầu ra YUV (4: 2: 2) có trung bình 2 byte dữ liệu trên mỗi pixel, mỗi khung hình sẽ mất 784 * 2 * 510 * 8 uS = 6,4 giây.

Máy ảnh này KHÔNG nhanh !!!

Định vị ngang

Hình ảnh có thể bị di chuyển theo chiều ngang nếu chúng tôi thay đổi các giá trị HSTART và HSTOP trong khi vẫn duy trì sự khác biệt 640 pixel.

Khi di chuyển hình ảnh của bạn sang trái, giá trị HSTOP của bạn có thể nhỏ hơn giá trị HSTART!

Đừng lo lắng … tất cả đều liên quan đến lỗi tràn bộ đếm như được giải thích trong ảnh 2.

Đăng ký

OV7670 có 201 thanh ghi tám-bit để kiểm soát những thứ như tăng, cân bằng trắng và phơi sáng.

Một byte dữ liệu chỉ cho phép 256 giá trị trong phạm vi từ [0] đến [255]. Nếu chúng ta yêu cầu nhiều quyền kiểm soát hơn thì chúng ta phải xếp tầng một số thanh ghi. Hai byte cho chúng ta 65536 khả năng… ba byte cho chúng ta 16, 777, 216.

Thanh ghi AEC (Điều khiển Phơi sáng Tự động) 16 bit hiển thị trong ảnh 3 là một ví dụ như vậy và được tạo ra bằng cách kết hợp các phần của ba thanh ghi sau.

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

Hãy cảnh báo… các địa chỉ đăng ký không được nhóm lại với nhau!

Phản ứng phụ

Tốc độ khung hình chậm dẫn đến một số tác dụng phụ không mong muốn:

Để có độ phơi sáng chính xác, OV7670 dự kiến sẽ hoạt động ở tốc độ khung hình 30 khung hình / giây (khung hình / giây). Vì mỗi khung hình mất 6,4 giây, màn trập điện tử mở lâu hơn 180 lần so với bình thường, có nghĩa là tất cả các hình ảnh sẽ bị phơi sáng quá mức trừ khi chúng tôi thay đổi một số giá trị đăng ký.

Để tránh phơi sáng quá mức, tôi đã đặt tất cả các bit thanh ghi AEC (điều khiển phơi sáng tự động) thành 0. Mặc dù vậy, vẫn cần một bộ lọc mật độ trung tính ở phía trước ống kính khi ánh sáng rực rỡ.

Tiếp xúc lâu cũng ảnh hưởng đến dữ liệu UV. Vì tôi vẫn chưa tìm thấy các kết hợp thanh ghi tạo ra màu sắc chính xác… hãy coi đây là công việc đang được tiến hành.

Ghi chú

[1]

Công thức hiển thị trong bảng dữ liệu (ảnh 1) là đúng nhưng phạm vi chỉ hiển thị bit [4: 0]?

Bước 5: Định thời dạng sóng

Thời gian dạng sóng
Thời gian dạng sóng
Thời gian dạng sóng
Thời gian dạng sóng
Thời gian dạng sóng
Thời gian dạng sóng

Ghi chú ở góc dưới cùng bên trái của sơ đồ “Định thời khung hình VGA” (ảnh 1) cho biết:

Đối với YUV / RGB, tp = 2 x TPCLK

Hình 1, 2 và 3 xác minh (các) bảng dữ liệu và xác nhận rằng Omnivision coi mỗi 2 byte dữ liệu là tương đương với 1 pixel.

Các dạng sóng của máy hiện sóng cũng xác minh rằng HREF vẫn THẤP trong khoảng thời gian trống.

Hình 4 xác nhận rằng đầu ra XCLK từ Arduino là 8MHz. Lý do chúng ta nhìn thấy một sóng sinewave, chứ không phải là một sóng vuông, là tất cả các sóng hài kỳ lạ đều không nhìn thấy được đối với máy hiện sóng lấy mẫu 20MHz của tôi.

Bước 6: Khung Grabber

Khung cài đặt đơn giản
Khung cài đặt đơn giản

Cảm biến hình ảnh trong chip máy ảnh OV7670 bao gồm một mảng 656 * 486 pixel trong đó lưới 640 * 480 pixel được sử dụng cho ảnh.

Các giá trị thanh ghi HSTART, HSTOP, HREF và VSTRT, VSTOP, VREF được sử dụng để định vị hình ảnh trên cảm biến. Nếu hình ảnh không được định vị chính xác trên cảm biến, bạn sẽ thấy một dải màu đen trên một hoặc nhiều cạnh như được giải thích trong phần "Ghi chú thiết kế".

OV7670 quét từng dòng của hình ảnh một pixel tại một thời điểm bắt đầu từ góc trên cùng bên trái cho đến khi nó chạm đến pixel dưới cùng bên phải. Arduino chỉ cần chuyển các pixel này đến PC thông qua liên kết nối tiếp như trong ảnh 1.

Nhiệm vụ của người lấy khung là chụp từng 640 * 480 = 307200 pixel này và hiển thị nội dung trong cửa sổ "hình ảnh"

Xử lý 3 đạt được điều này bằng cách sử dụng bốn dòng mã sau !!

Dòng mã 1:

byte byteBuffer = byte mới [maxBytes + 1]; // trong đó maxBytes = 307200

Mã cơ bản trong câu lệnh này tạo ra:

  • mảng byte 307201 được gọi là “byteBuffer [307201]”
  • Byte bổ sung dành cho một ký tự kết thúc (dòng cấp dữ liệu).

Dòng mã 2:

kích thước (640, 480);

Mã cơ bản trong câu lệnh này tạo ra:

  • một biến được gọi là "width = 640;"
  • một biến được gọi là "height = 480";
  • mảng 307200 pixel được gọi là “pixel [307200]”
  • cửa sổ “hình ảnh” 640 * 480 pixel trong đó nội dung của mảng pixel được hiển thị. Cửa sổ “hình ảnh” này liên tục được làm mới ở tốc độ khung hình 60 khung hình / giây.

Dòng mã 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

Mã cơ bản trong câu lệnh này:

  • đệm dữ liệu đến cục bộ cho đến khi nó nhìn thấy ký tự “lf” (dòng cấp dữ liệu).
  • sau đó nó đổ 307200 byte dữ liệu cục bộ đầu tiên vào mảng byteBuffer .
  • Nó cũng lưu số byte nhận được (307201) vào một biến gọi là "byteCount".

Dòng mã 4:

pixel = color (byteBuffer );

Khi được đặt trong vòng lặp for-tiếp theo, mã cơ bản trong câu lệnh này:

  • sao chép nội dung của mảng “byteBuffer ” sang mảng “pixel ”
  • nội dung xuất hiện trong cửa sổ hình ảnh.

Các phím bấm:

Bộ lấy khung hình nhận dạng các tổ hợp phím sau:

  • ‘C’ = chụp ảnh
  • ‘S’ = lưu hình ảnh vào tệp.

Bước 7: Phần mềm

Tải xuống và cài đặt từng gói phần mềm sau nếu chưa được cài đặt:

  • “Arduino” từ
  • “Java 8” từ https://java.com/en/download/ [1]
  • "Xử lý 3" từ

Cài đặt bản phác thảo Arduino:

  • Tháo tất cả các dây nối OV7670 [2]
  • Kết nối cáp USB với Arduino của bạn
  • Sao chép nội dung của “OV7670_camera_mono_V2.ino“(đính kèm) vào một “bản phác thảo” Arduino và lưu.
  • Tải bản phác thảo lên Arduino của bạn.
  • Rút phích cắm Arduino
  • Bây giờ bạn có thể kết nối lại các dây jumper OV7670 một cách an toàn
  • Kết nối lại cáp USB.

Cài đặt và chạy phác thảo Xử lý

  • Sao chép nội dung của “OV7670_camera_mono_V2.pde” (đính kèm) vào một “phác thảo” đang xử lý và lưu.
  • Nhấp vào nút “chạy” trên cùng bên trái… một cửa sổ hình ảnh màu đen sẽ xuất hiện
  • Nhấp vào cửa sổ hình ảnh “đen”
  • Nhấn phím “c” để chụp ảnh. (khoảng 6,4 giây).
  • Nhấn phím “s” để lưu hình ảnh vào thư mục xử lý của bạn
  • Lặp lại các bước 4 & 5
  • Nhấp vào nút "dừng" để thoát khỏi chương trình.

Ghi chú

[1]

Xử lý 3 yêu cầu Java 8

[2]

Đây là bước an toàn “một lần duy nhất” để tránh làm hỏng chip camera OV7670 của bạn.

Cho đến khi bản phác thảo “OV7670_camera_mono.ini” được tải lên Arduino của bạn, các điện trở kéo lên bên trong được kết nối với 5 volt, ngoài ra có khả năng một số đường dữ liệu Arduino có thể là đầu ra 5 volt… tất cả đều gây tử vong cho chip camera 3v3 volt OV7670.

Khi Arduino đã được lập trình, không cần lặp lại bước này và các giá trị thanh ghi có thể được thay đổi một cách an toàn.

Bước 8: Lấy hình ảnh màu

Lấy hình ảnh màu
Lấy hình ảnh màu
Lấy hình ảnh màu
Lấy hình ảnh màu
Lấy hình ảnh màu
Lấy hình ảnh màu

Phần mềm sau đây hoàn toàn là thử nghiệm và được đăng với hy vọng rằng một số kỹ thuật sẽ hữu ích. Màu sắc có vẻ bị đảo ngược… Tôi vẫn chưa tìm thấy cài đặt đăng ký chính xác. Nếu bạn tìm thấy một giải pháp, vui lòng đăng kết quả của bạn

Nếu chúng ta muốn có được một hình ảnh màu, tất cả các byte dữ liệu phải được ghi lại và áp dụng các công thức sau.

OV7670 sử dụng các công thức sau để chuyển đổi thông tin màu RGB (đỏ, lục, lam) thành 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)

Các công thức sau có thể được sử dụng để chuyển đổi YUV (4: 2: 2) trở lại màu RGB: [2]

  • R = Y + 1,402 * (Cr - 128)
  • G = Y - 0,344136 * (Cb -128) - 0,714136 * (Cr -128)
  • B = Y + 1.772 * (Cb -128)

Phần mềm đính kèm chỉ đơn giản là một phần mở rộng của phần mềm đơn sắc:

  • Yêu cầu chụp “c” được gửi đến Arduino
  • Arduino gửi các byte được đánh số chẵn (đơn sắc) đến PC
  • PC lưu các byte này vào một mảng
  • Tiếp theo, Arduino gửi các byte được đánh số lẻ (sắc độ) tới PC.
  • Những byte này được lưu vào một mảng thứ hai… bây giờ chúng ta có toàn bộ hình ảnh.
  • Các công thức trên hiện được áp dụng cho mỗi nhóm bốn byte dữ liệu UYVY.
  • Các pixel màu thu được sau đó được đặt trong mảng “pixel ”
  • PC quét mảng “pixel ” và một hình ảnh xuất hiện trong cửa sổ “hình ảnh”.

Phần mềm Xử lý 3 hiển thị ngắn gọn từng lần quét và kết quả cuối cùng:

  • Ảnh 1 hiển thị dữ liệu sắc độ U & V từ lần quét 1
  • Ảnh 2 hiển thị dữ liệu độ sáng Y1 & Y2 từ lần quét 2
  • Ảnh 3 hiển thị hình ảnh màu… chỉ có một điều sai lầm là… chiếc túi phải có màu xanh lá cây !!

Tôi sẽ đăng mã mới sau khi giải quyết xong chương trình này…

Người giới thiệu:

[1]

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

[2]

en.wikipedia.org/wiki/YCbCr (chuyển đổi JPEG)

Nhấn vào đây để xem các tài liệu hướng dẫn khác của tôi.

Đề xuất: