- ส่วนประกอบที่จำเป็น
- ข้อควรจำเกี่ยวกับโมดูลกล้อง OV7670
- แผนภูมิวงจรรวม
- การเขียนโปรแกรม Arduino UNO
- วิธีใช้ Serial Port Reader สำหรับอ่านภาพ
- ด้านล่างนี้คือภาพตัวอย่างที่นำมาจาก OV7670
- ข้อควรระวังเมื่อใช้ OV7670
กล้องถ่ายรูปครองอุตสาหกรรมอิเล็กทรอนิกส์มาโดยตลอดเนื่องจากมีแอพพลิเคชั่นมากมายเช่นระบบตรวจสอบผู้เยี่ยมชมระบบเฝ้าระวังระบบการเข้างานเป็นต้นกล้องที่เราใช้ในปัจจุบันมีความฉลาดและมีคุณสมบัติมากมายที่ไม่มีในกล้องรุ่นก่อน ๆ ในขณะที่กล้องดิจิทัลในปัจจุบันไม่เพียง แต่จับภาพ แต่ยังบันทึกคำอธิบายระดับสูงของฉากและวิเคราะห์สิ่งที่พวกเขาเห็น มีการใช้อย่างแพร่หลายใน Robotics, Artificial Intelligence, Machine Learning เป็นต้นเฟรมที่จับได้จะถูกประมวลผลโดยใช้ Artificial Intelligence และ Machine Learning จากนั้นใช้ในแอพพลิเคชั่นต่างๆเช่นการตรวจจับป้ายทะเบียนการตรวจจับวัตถุการตรวจจับการเคลื่อนไหวการจดจำใบหน้าเป็นต้น
ในการกวดวิชานี้เราจะติดต่อใช้กันอย่างแพร่หลายกล้อง OV7670 โมดูล Arduino UNO โมดูลกล้อง OV7670 สามารถเชื่อมต่อกับArduino Megaด้วยการกำหนดค่าพินรหัสและขั้นตอนเดียวกัน โมดูลกล้องเชื่อมต่อได้ยากเนื่องจากมีพินจำนวนมากและสายไฟที่ยุ่งเหยิงในการดำเนินการ นอกจากนี้สายไฟยังมีความสำคัญมากเมื่อใช้โมดูลกล้องเนื่องจากการเลือกลวดและความยาวของสายไฟอาจส่งผลต่อคุณภาพของภาพอย่างมากและอาจทำให้เกิดสัญญาณรบกวนได้
เราได้ทำโปรเจ็กต์มากมายเกี่ยวกับกล้องถ่ายรูปที่มีไมโครคอนโทรลเลอร์และอุปกรณ์ IoT ประเภทต่างๆเช่น:
- ระบบตรวจสอบผู้เยี่ยมชมพร้อม Raspberry Pi และ Pi Camera
- ระบบรักษาความปลอดภัยภายในบ้าน Raspberry Pi ที่ใช้ IOT พร้อม Email Alert
- กล้องเฝ้าระวัง Raspberry Pi พร้อม Motion Capture
กล้อง OV7670ทำงานใน 3.3V จึงกลายเป็นสิ่งสำคัญมากที่จะหลีกเลี่ยงการ Arduino ซึ่งจะช่วยให้การส่งออก 5V ที่เอาท์พุทหมุด GPIO ของพวกเขา OV7670 เป็นกล้อง FIFO แต่ในบทช่วยสอนนี้รูปภาพหรือเฟรมจะถูกจับโดยไม่มี FIFO บทช่วยสอนนี้จะมีขั้นตอนง่ายๆและการเขียนโปรแกรมที่ง่ายขึ้นเพื่อเชื่อมต่อ OV7670 กับ Arduino UNO
ส่วนประกอบที่จำเป็น
- Arduino UNO
- OV7670 โมดูลกล้อง
- ตัวต้านทาน (10k, 4.7k)
- จัมเปอร์
ซอฟต์แวร์ที่ต้องการ:
- Arduino IDE
- Serial Port Reader (เพื่อวิเคราะห์ภาพเอาต์พุต)
ข้อควรจำเกี่ยวกับโมดูลกล้อง OV7670
OV7670 Camera Module เป็นโมดูลกล้อง FIFO ที่มีจำหน่ายจากผู้ผลิตหลายรายที่มีการกำหนดค่าพินที่แตกต่างกัน TheOV7670 ให้ภาพขนาด 8 บิตแบบเต็มเฟรมในรูปแบบที่หลากหลาย อาร์เรย์ภาพสามารถทำงานได้สูงสุด 30 เฟรมต่อวินาที (fps) ใน VGA OV7670 ประกอบด้วย
- อาร์เรย์เซนเซอร์ภาพ (ประมาณ 656 x 488 พิกเซล)
- ตัวสร้างเวลา
- ตัวประมวลผลสัญญาณอนาล็อก
- ตัวแปลง A / D
- ตัวสร้างรูปแบบการทดสอบ
- ตัวประมวลผลสัญญาณดิจิทัล (DSP)
- Image Scaler
- พอร์ตวิดีโอดิจิทัล
- เอาต์พุตควบคุมแฟลช LED และ Strobe
เซ็นเซอร์ภาพ OV7670 ควบคุมโดยใช้ Serial Camera Control Bus (SCCB) ซึ่งเป็นอินเทอร์เฟซ I2C (SIOC, SIOD) ที่มีความถี่สัญญาณนาฬิกาสูงสุด 400KHz
กล้องมาพร้อมกับสัญญาณการจับมือเช่น:
- VSYNC:เอาต์พุตซิงค์แนวตั้ง - ต่ำระหว่างเฟรม
- HREF: การอ้างอิงแนวนอน - สูงระหว่างพิกเซลที่ใช้งานอยู่ของแถว
- PCLK:เอาต์พุตนาฬิกาพิกเซล - นาฬิกาทำงานฟรี ข้อมูลถูกต้องตามขอบที่เพิ่มขึ้น
นอกจากนี้ยังมีสัญญาณอื่น ๆ อีกมากมายเช่น
- D0-D7:เอาต์พุตดิจิตอล YUV / RGB Video Component 8 บิต
- PWDN:การเลือกโหมดปิดเครื่อง - โหมดปกติและโหมดปิดเครื่อง
- XCLK:อินพุตนาฬิการะบบ
- รีเซ็ต:รีเซ็ตสัญญาณ
OV7670 โอเวอร์คล็อกจากออสซิลเลเตอร์ 24MHz สิ่งนี้ให้เอาต์พุต Pixel Clock (PCLK) 24MHz FIFO ให้หน่วยความจำบัฟเฟอร์เฟรมวิดีโอ 3Mbps ตัวสร้างรูปแบบการทดสอบมีรูปแบบแถบสี 8 แถบแถบสีจางเป็นสีเทา ตอนนี้เรามาเริ่มเขียนโปรแกรม Arduino UNO สำหรับการทดสอบ Camera OV7670 และการจับเฟรมโดยใช้เครื่องอ่านพอร์ตอนุกรม
แผนภูมิวงจรรวม
การเขียนโปรแกรม Arduino UNO
การเขียนโปรแกรมเริ่มต้นด้วย รวมทั้งต้องห้องสมุดที่จำเป็นสำหรับการ OV7670 เนื่องจาก OV7670 ทำงานบนอินเทอร์เฟซ I2C จึงรวมถึงหลังจากนี้จำเป็นต้องแก้ไขรีจิสเตอร์สำหรับ OV7670 โปรแกรมแบ่งออกเป็นฟังก์ชันเล็ก ๆ เพื่อความเข้าใจที่ดีขึ้น
การ ตั้งค่า () ประกอบด้วยการตั้งค่าเริ่มต้นทั้งหมดที่จำเป็นสำหรับการจับภาพเท่านั้น ฟังก์ชั่นแรกคือarduinoUnoInut ()ซึ่งใช้ในการเริ่มต้น arduino uno ในขั้นต้นจะปิดการใช้งานอินเทอร์รัปต์ส่วนกลางทั้งหมดและตั้งค่าคอนฟิกูเรชันอินเทอร์เฟซการสื่อสารเช่นนาฬิกา PWM การเลือกพินขัดจังหวะการเลือกพรีคลาส
arduinoUnoInut ();
หลังจากกำหนดค่า Arduino แล้วจะต้องกำหนดค่ากล้อง ในการเริ่มต้นกล้องเรามีตัวเลือกในการเปลี่ยนค่ารีจิสเตอร์เท่านั้น ค่ารีจิสเตอร์จำเป็นต้องเปลี่ยนจากค่าเริ่มต้นเป็นการกำหนดเอง เพิ่มความล่าช้าที่จำเป็นขึ้นอยู่กับความถี่ของไมโครคอนโทรลเลอร์ที่เราใช้ เนื่องจากไมโครคอนโทรลเลอร์ที่ทำงานช้ามีเวลาในการประมวลผลน้อยลงและเพิ่มความล่าช้าระหว่างการจับเฟรม
เป็นโมฆะ camInit (โมฆะ) { writeReg (0x12, 0x80); _delay_ms (100); wrSensorRegs8_8 (ov7670_default_regs); writeReg (REG_COM10, 32); // PCLK ไม่เปิดใช้งาน HBLANK }
กล้องถูกตั้งค่าให้ถ่ายภาพ QVGA ดังนั้นจึงต้องเลือกความละเอียด ฟังก์ชันกำหนดค่ารีจิสเตอร์เพื่อถ่ายภาพ QVGA
setResolution ();
ในบทช่วยสอนนี้ภาพจะถูกถ่ายเป็นขาวดำดังนั้นค่ารีจิสเตอร์จึงถูกตั้งค่าให้แสดงภาพขาวดำ ฟังก์ชันตั้งค่ารีจิสเตอร์จากรายการรีจิสเตอร์ซึ่งกำหนดไว้ล่วงหน้าในโปรแกรม
setColor ();
ฟังก์ชันด้านล่างคือฟังก์ชัน write to register ซึ่งเขียนค่าฐานสิบหกเพื่อลงทะเบียน หากคุณได้รับภาพที่มีสัญญาณรบกวนให้ลองเปลี่ยนเทอมที่สองเช่น 10 เป็น 9/11/12 แต่ส่วนใหญ่แล้วค่านี้ใช้งานได้ดีจึงไม่จำเป็นต้องเปลี่ยน
writeReg (0x11, 10);
ฟังก์ชันนี้ใช้เพื่อรับขนาดความละเอียดของภาพ ในโครงการนี้เรากำลังถ่ายภาพขนาด 320 x 240 พิกเซล
captureImg (320, 240);
นอกเหนือจากนี้โค้ดยังมีการกำหนดค่า I2C แบ่งออกเป็นหลายส่วน เพื่อรับข้อมูลจากกล้องการกำหนดค่า I2C มีฟังก์ชัน Start, Read, Write, Set Address ซึ่งมีความสำคัญเมื่อใช้โปรโตคอล I2C
คุณสามารถค้นหาโค้ดที่สมบูรณ์พร้อมวิดีโอสาธิตในตอนท้ายของบทช่วยสอนนี้ เพียงแค่อัปโหลดรหัสและเปิด Serial Port Reader และจับเฟรม
วิธีใช้ Serial Port Reader สำหรับอ่านภาพ
Serial Port Reader เป็น GUI ง่ายๆดาวน์โหลดได้จากที่นี่ สิ่งนี้จับการเข้ารหัส base64 และถอดรหัสเพื่อสร้างรูปภาพ เพียงทำตามขั้นตอนง่ายๆเหล่านี้เพื่อใช้ Serial Port Readerขั้นตอนที่ 1:เชื่อมต่อ Arduino ของคุณเข้ากับพอร์ต USB ของพีซีของคุณ
ขั้นตอนที่ 2:คลิกที่“ ตรวจสอบ” เพื่อค้นหาพอร์ต Arduino COM ของคุณ
ขั้นตอนที่ 3:สุดท้ายคลิกที่ปุ่ม "เริ่ม" เพื่อเริ่มอ่านแบบอนุกรม
ขั้นตอนที่ 4:คุณสามารถบันทึกภาพนี้ได้โดยคลิกที่“ บันทึกรูปภาพ”
ด้านล่างนี้คือภาพตัวอย่างที่นำมาจาก OV7670
ข้อควรระวังเมื่อใช้ OV7670
- พยายามใช้สายไฟหรือจัมเปอร์ให้สั้นที่สุด
- หลีกเลี่ยงการสัมผัสหลวมกับพินใด ๆ บน Arduino หรือ OV7670
- ระวังการเชื่อมต่อเนื่องจากการเดินสายจำนวนมากอาจทำให้ไฟฟ้าลัดวงจรได้
- หาก UNO ให้เอาต์พุต 5V เป็น GPIO ให้ใช้ Level Shifter
- ใช้อินพุต 3.3V สำหรับ OV7670 เนื่องจากแรงดันไฟฟ้าเกินกว่านี้อาจทำให้โมดูล OV7670 เสียหายได้
โครงการนี้จัดทำขึ้นเพื่อให้ภาพรวมของการใช้โมดูลกล้องกับ Arduino เนื่องจาก Arduino มีหน่วยความจำน้อยดังนั้นการประมวลผลอาจไม่เป็นไปตามที่คาดไว้ คุณสามารถใช้คอนโทรลเลอร์ที่แตกต่างกันซึ่งมีหน่วยความจำมากกว่าสำหรับการประมวลผล