فهرست مطالب:

دوربین خود را بسازید: 8 مرحله
دوربین خود را بسازید: 8 مرحله

تصویری: دوربین خود را بسازید: 8 مرحله

تصویری: دوربین خود را بسازید: 8 مرحله
تصویری: صفر تا صد تنظیمات دوربین آیفون 2024, جولای
Anonim
Image
Image
دوربین خود را بسازید
دوربین خود را بسازید

این دستورالعمل نحوه ساخت دوربین تک رنگ با استفاده از سنسور تصویر Omnivision OV7670 ، میکروکنترلر آردوینو ، چند سیم جامپر و نرم افزار Processing 3 را توضیح می دهد.

نرم افزار آزمایشی برای به دست آوردن تصویر رنگی نیز ارائه شده است.

کلید "c" را برای گرفتن تصویر 640*480 پیکسل فشار دهید … برای ذخیره تصویر در فایل ، کلید "s" را فشار دهید. در صورت تمایل به ایجاد یک فیلم کوتاه زمان کوتاه ، تصاویر پی در پی شماره گذاری می شوند.

دوربین سریع نیست (هر اسکن 6.4 ثانیه طول می کشد) و فقط برای استفاده در نورهای ثابت مناسب است.

هزینه ، بدون احتساب آردوینو و رایانه شخصی شما ، کمتر از یک فنجان قهوه است.

تصاویر

قطعات کامپوننت ، بدون سیم کشی بلوز ، در عکس ابتدایی نشان داده شده است.

عکس دوم یک اسکرین شات است که نرم افزار دوربین آردوینو و پردازشگر قاب 3 را نشان می دهد. قسمت داخلی نحوه اتصال دوربین را نشان می دهد.

این ویدئو دوربین را در حال حرکت نشان می دهد. وقتی کلید ضبط "c" فشار داده می شود ، یک فلاش مختصر ایجاد می شود و با اسکن تصویر ، یک فوران فعالیت ادامه می یابد. پس از اتمام اسکن ، تصویر به طور خودکار در پنجره نمایش ظاهر می شود. پس از هر بار فشار دادن کلید "s" ، تصاویر در پوشه Processing ظاهر می شوند. این ویدئو با دوچرخه سواری سریع در هر سه تصویر ذخیره شده به پایان می رسد.

مرحله 1: نمودار مدار

مدار
مدار
مدار
مدار
مدار
مدار

نمودار مدار ، برای همه نسخه های این دوربین ، در عکس 1 نشان داده شده است.

عکس های 2 ، 3 نحوه اتصال سیم ها و اجزای بلوز را نشان می دهد.

بدون براکت آلومینیومی ، تصاویر در کنار آنها قرار گرفته است.

هشدار

Arduino خود را قبل از اتصال هرگونه سیم جامپر به تراشه دوربین OV7670 برنامه ریزی کنید. این مانع از بین رفتن پین های خروجی 5 ولت از برنامه قبلی می شود که تراشه دوربین 3V3 ولت OV7670 را از بین می برد.

مرحله 2: لیست قطعات

فهرست قطعات
فهرست قطعات

قسمت های زیر از https://www.aliexpress.com/ تهیه شده است

  • تنها 1 ماژول دوربین VGA 300KP OV7670 برای arduino DIY KIT
  • فقط یک براکت دوربین کامل با پیچ و مهره
  • 1 فقط UNO R3 برای arduino MEGA328P 100٪ اصلی ATMEGA16U2 با کابل USB

قطعات زیر به صورت محلی تهیه شده است

  • 18 کابل جهنده زن و مرد آردوینو
  • فقط 3 کابل جهنده زن و زن آردونین
  • فقط 1 تخته نان کوچک
  • فقط 4 مقاومت 4K7 اهم 1/2 وات
  • فقط 1 پایه آلومینیومی قراضه.

همچنین به برگه های داده زیر نیاز دارید:

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

مرحله 3: نظریه

تئوری
تئوری

تراشه دوربین OV7670

خروجی پیش فرض از تراشه دوربین OV7670 شامل یک سیگنال ویدئویی YUV (4: 2: 2) و 3 شکل موج زمان بندی است. سایر فرمت های خروجی با برنامه نویسی رجیسترهای داخلی از طریق گذرگاه سازگار با I2C امکان پذیر است.

سیگنال ویدئویی YUV (4: 2: 2) (عکس 1) یک دنباله پیوسته پیکسلهای تک رنگ (سیاه و سفید) با اطلاعات رنگ U (تفاوت رنگ آبی) و V (تفاوت رنگ قرمز) است.

این فرمت خروجی با نام YUV (4: 2: 2) شناخته می شود زیرا هر گروه 4 بایت حاوی 2 بایت تک رنگ و و 2 بایت رنگی است.

تک رنگ

برای به دست آوردن یک تصویر تک رنگ باید هر بایت داده دوم را نمونه برداری کنیم.

یک آردوینو فقط 2K حافظه دسترسی تصادفی دارد اما هر فریم شامل 640*2*480 = 307 ، 200 بایت داده است. مگر اینکه یک قاب گیر به OV7670 اضافه کنیم ، همه داده ها باید خط به خط برای پردازش به رایانه ارسال شوند.

دو احتمال وجود دارد:

برای هر 480 فریم متوالی ، می توانیم یک خط را با سرعت بالا به آردوینو ضبط کنیم ، قبل از ارسال آن به رایانه با سرعت 1 مگابیت بر ثانیه. چنین رویکردی نشان می دهد که OV7670 با سرعت کامل کار می کند اما زمان زیادی طول می کشد (بیش از یک دقیقه).

روشی که من اتخاذ کرده ام این است که PCLK را تا 8uS کاهش داده و هر نمونه را به محض ارسال ارسال کنم. این روش به طور قابل توجهی سریعتر است (6.4 ثانیه).

مرحله 4: طراحی یادداشت ها

نکات طراحی
نکات طراحی
نکات طراحی
نکات طراحی
نکات طراحی
نکات طراحی

سازگاری

تراشه دوربین OV7670 یک دستگاه 3v3 ولت است. برگه اطلاعات نشان می دهد که ولتاژهای بالای 3.5 ولت به تراشه آسیب می رساند.

برای جلوگیری از تخریب تراشه دوربین OV7670 آردوینو 5 ولت:

  • سیگنال ساعت خارجی (XCLK) از آردوینو باید با استفاده از تقسیم ولتاژ به سطح ایمن کاهش یابد.
  • مقاومت های کششی داخلی Arduino I2C تا 5 ولت باید غیرفعال شده و با مقاومتهای کششی خارجی به منبع تغذیه 3 و 3 ولت جایگزین شوند.
  • Arduino خود را قبل از اتصال سیم های جامپر برنامه ریزی کنید زیرا ممکن است برخی از پین ها همچنان به عنوان خروجی از پروژه قبلی برنامه ریزی شوند !!! (من این را به سختی آموختم … خوشبختانه دو مورد را خریدم زیرا بسیار ارزان بودند).

ساعت خارجی

تراشه دوربین OV7670 به یک ساعت خارجی در محدوده فرکانس 10 مگاهرتز تا 24 مگاهرتز نیاز دارد.

بالاترین فرکانسی که ما می توانیم از آردوینو 16 مگاهرتز تولید کنیم 8 مگاهرتز است اما به نظر می رسد این کار می کند.

پیوند سریال

برای ارسال 1 بایت داده روی یک پیوند سریال 1 مگابیت بر ثانیه (میلیون بیت در ثانیه) حداقل 10 uS (میکرو ثانیه) زمان نیاز است. این زمان به شرح زیر است:

  • 8 بیت داده (8us)
  • 1 بیت شروع (1uS)
  • 1 توقف بیت (1uS)

ساعت داخلی

فرکانس ساعت داخلی پیکسلی (PCLK) در OV7670 توسط بیت های [5: 0] در CLKRC ثبت شده تنظیم شده است (به عکس 1 مراجعه کنید). [1]

اگر بیت [5: 0] = B111111 = 63 را تنظیم کرده و آن را در فرمول بالا اعمال کنیم ، سپس:

  • F (ساعت داخلی) = F (ساعت ورودی)/(بیت [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 هرتز یا
  • = 8 یو اس

از آنجا که ما فقط از هر بایت داده دوم نمونه برداری می کنیم ، فاصله PCLK 8uS منجر به یک نمونه 16uS می شود که زمان کافی برای انتقال 1 بایت داده (10uS) 6uS برای پردازش است.

نرخ فریم

هر فرمت ویدئویی VGA شامل 784*510 پیکسل (عناصر تصویر) است که 640*480 پیکسل نمایش داده می شود. از آنجا که فرمت خروجی YUV (4: 2: 2) به طور متوسط 2 بایت داده در هر پیکسل دارد ، هر فریم 784*2*510*8 uS = 6.4 ثانیه طول می کشد.

این دوربین سریع نیست !!!

موقعیت یابی افقی

اگر مقدار HSTART و HSTOP را با حفظ تفاوت 640 پیکسل تغییر دهیم ، ممکن است تصویر به صورت افقی منتقل شود.

هنگام حرکت تصویر به سمت چپ ، ممکن است مقدار HSTOP شما کمتر از مقدار HSTART باشد!

نگران نباشید … این همه مربوط به سرریزهای شمارنده است که در عکس 2 توضیح داده شده است.

ثبت می کند

OV7670 دارای 201 ثبت هشت بیتی برای کنترل مواردی مانند افزایش ، تعادل رنگ سفید و نوردهی است.

یک بایت داده تنها 256 مقدار را در محدوده [0] تا [255] مجاز می کند. اگر به کنترل بیشتری نیاز داریم ، باید چندین رجیستر را به هم متصل کنیم. دو بایت 65536 امکان به ما می دهد … سه بایت 16 ، 777 ، 216 به ما می دهد.

ثبت 16 بیتی AEC (کنترل خودکار نوردهی) که در عکس 3 نشان داده شده است ، نمونه ای از این دست است و با ترکیب بخش هایی از سه ثبات زیر ایجاد می شود.

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

هشدار دهید … آدرس های ثبت نام با هم گروه بندی نشده اند!

اثرات جانبی

نرخ فریم آهسته تعدادی از عوارض جانبی ناخواسته را معرفی می کند:

برای نوردهی صحیح ، OV7670 انتظار دارد با نرخ فریم 30 فریم در ثانیه (فریم در ثانیه) کار کند. از آنجا که هر فریم 6.4 ثانیه طول می کشد ، شاتر الکترونیکی 180 بار بیشتر از حالت عادی باز می شود ، این بدان معناست که همه تصاویر بیش از حد نوردهی می شوند مگر اینکه برخی از مقادیر ثبت شده را تغییر دهیم.

برای جلوگیری از قرار گرفتن در معرض بیش از حد ، من تمام بیت های ثبت AEC (کنترل نوردهی خودکار) را به صفر رسانده ام. حتی در صورت روشن بودن نور ، یک فیلتر با چگالی خنثی در جلوی لنز مورد نیاز است.

به نظر می رسد قرار گرفتن در معرض طولانی مدت بر داده های UV تأثیر می گذارد. از آنجا که من هنوز ترکیبهای ثابتی را پیدا نکرده ام که رنگهای صحیح تولید می کنند … این را در حال پیشرفت بدانید.

توجه داشته باشید

[1]

فرمول نشان داده شده در برگه اطلاعات (عکس 1) درست است اما محدوده فقط بیت [4: 0] را نشان می دهد؟

مرحله 5: زمان بندی شکل موج

شکل موج زمان بندی
شکل موج زمان بندی
شکل موج زمان بندی
شکل موج زمان بندی
شکل موج زمان بندی
شکل موج زمان بندی

یادداشت در گوشه سمت چپ پایین نمودار "VGA Frame Timing" (عکس 1) آمده است:

برای YUV/RGB ، tp = 2 x TPCLK

شکل های 1 ، 2 و 3 برگه (ها) را تأیید می کند و تأیید می کند که Omnivision هر 2 بایت داده را معادل 1 پیکسل می داند.

شکل موج اسیلوسکوپ همچنین تأیید می کند که HREF در فواصل خالی پایین است.

شکل 4 تایید می کند که خروجی XCLK از آردوینو 8 مگاهرتز است. دلیل اینکه ما یک موج سینوسی را می بینیم ، نه یک موج مربع ، این است که همه هارمونیک های عجیب و غریب برای اسیلوسکوپ نمونه برداری 20 مگاهرتزی من نامرئی هستند.

مرحله 6: قاب گیر

چنگ زن قاب
چنگ زن قاب

سنسور تصویر در تراشه دوربین OV7670 شامل مجموعه ای از 486*656 پیکسل است که از شبکه ای با رزولوشن 640*480 پیکسل برای عکس استفاده می شود.

مقادیر ثبات HSTART ، HSTOP ، HREF و VSTRT ، VSTOP ، VREF برای قرار دادن تصویر روی سنسور استفاده می شود. اگر تصویر به درستی روی سنسور قرار نگرفته باشد ، یک نوار سیاه روی یک یا چند لبه مشاهده خواهید کرد ، همانطور که در بخش "یادداشت های طراحی" توضیح داده شده است.

OV7670 هر خط تصویر را یک پیکسل در یک زمان از گوشه بالا سمت چپ اسکن می کند تا به پیکسل پایین سمت راست برسد. Arduino به سادگی این پیکسل ها را از طریق پیوند سریال به کامپیوتر منتقل می کند ، همانطور که در عکس 1 نشان داده شده است.

وظیفه گیرندگان قاب این است که هر یک از این 640*480 = 307200 پیکسل را ضبط کرده و محتویات را در یک پنجره "تصویر" نمایش دهند.

پردازش 3 با استفاده از چهار خط کد زیر به این هدف می رسد !!

خط کد 1:

بایت byteBuffer = بایت جدید [maxBytes+1]؛ // جایی که maxBytes = 307200

کد زیرین در این عبارت ایجاد می کند:

  • یک آرایه 307201 بایت به نام "byteBuffer [307201]"
  • بایت اضافی برای یک کاراکتر خاتمه (خط تغذیه) است.

خط کد 2:

اندازه (640 ، 480) ؛

کد زیرین در این عبارت ایجاد می کند:

  • متغیری به نام "width = 640؛"
  • متغیری به نام "ارتفاع = 480" ؛
  • یک آرایه 307200 پیکسلی به نام "پیکسل [307200]"
  • پنجره "تصویر" 640*480 پیکسل که محتویات آرایه پیکسل در آن نمایش داده می شود. این پنجره "تصویر" به طور مداوم با نرخ فریم 60 فریم در ثانیه تجدید می شود.

خط کد 3:

byteCount = myPort.readBytesUntil (lf، byteBuffer)؛

کد زیر در این بیانیه:

  • داده های ورودی را به صورت محلی بافر می کند تا زمانی که یک شخصیت "lf" (خط تغذیه) را ببیند.
  • پس از آن اولین 307200 بایت داده محلی را در آرایه byteBuffer می ریزد.
  • همچنین تعداد بایت های دریافتی (307201) را در متغیری به نام "byteCount" ذخیره می کند.

خط کد 4:

پیکسل = رنگ (byteBuffer ) ؛

هنگامی که در حلقه for-next قرار داده می شود ، کد زیرین در این عبارت:

  • محتویات آرایه "byteBuffer " را در آرایه "pixels " کپی می کند
  • محتویات آن در پنجره تصویر ظاهر می شود.

سکته های کلیدی:

گیرنده قاب ، کلیدهای زیر را تشخیص می دهد:

  • ‘c’ = گرفتن تصویر
  • ‘s’ = تصویر را در فایل ذخیره کنید.

مرحله 7: نرم افزار

در صورت عدم نصب ، هر یک از بسته های نرم افزاری زیر را بارگیری و نصب کنید:

  • "آردوینو" از
  • "جاوا 8" از https://java.com/fa/download/ [1]
  • "پردازش 3" از

نصب طرح آردوینو:

  • تمام سیم های بلوز OV7670 را بردارید [2]
  • کابل USB را به آردوینو متصل کنید
  • محتویات "OV7670_camera_mono_V2.ino" (ضمیمه شده) را در "طرح" آردوینو کپی کرده و ذخیره کنید.
  • طرح را در آردوینو خود بارگذاری کنید.
  • آردوینو را از برق بکشید
  • اکنون می توانید با خیال راحت سیم های بلوز OV7670 را دوباره وصل کنید
  • کابل USB را دوباره وصل کنید.

نصب و اجرای طرح پردازش

  • محتویات "OV7670_camera_mono_V2.pde" (ضمیمه شده) را در "طرح" پردازش کپی کرده و ذخیره کنید.
  • روی دکمه "run" بالا سمت چپ کلیک کنید … یک پنجره تصویر سیاه ظاهر می شود
  • روی پنجره تصویر "سیاه" کلیک کنید
  • برای ثبت تصویر ، دکمه "c" را فشار دهید. (حدود 6.4 ثانیه).
  • برای ذخیره تصویر در پوشه پردازش ، کلید "s" را فشار دهید
  • مراحل 4 و 5 را تکرار کنید
  • برای خروج از برنامه روی دکمه "توقف" کلیک کنید.

یادداشت

[1]

پردازش 3 به جاوا 8 نیاز دارد

[2]

این یک گام ایمنی "فقط یک بار" است تا از آسیب دیدن تراشه دوربین OV7670 خود جلوگیری کنید.

تا زمانی که طرح "OV7670_camera_mono.ini" در Arduino شما بارگذاری نشده باشد ، مقاومتهای کششی داخلی به 5 ولت متصل می شوند ، به علاوه این احتمال وجود دارد که برخی از خطوط داده Arduino خروجی 5 ولت داشته باشند … همه آنها کشنده هستند تراشه دوربین 3V3 ولت OV7670.

پس از برنامه نویسی آردوینو ، نیازی به تکرار این مرحله نیست و ممکن است مقادیر ثبات با خیال راحت تغییر کند.

مرحله 8: به دست آوردن تصویر رنگی

بدست آوردن تصویر رنگی
بدست آوردن تصویر رنگی
به دست آوردن تصویر رنگی
به دست آوردن تصویر رنگی
به دست آوردن تصویر رنگی
به دست آوردن تصویر رنگی

نرم افزار زیر کاملاً آزمایشی است و به امید اینکه برخی از تکنیک ها مفید واقع شوند ، ارسال شده است. به نظر می رسد رنگ ها معکوس هستند … من هنوز تنظیمات ثبت صحیح را پیدا نکرده ام. اگر راه حلی پیدا کردید لطفاً نتایج خود را ارسال کنید

اگر می خواهیم یک تصویر رنگی بدست آوریم ، باید تمام بایت های داده ضبط شده و فرمول های زیر اعمال شود.

OV7670 از فرمول های زیر برای تبدیل اطلاعات رنگ RGB (قرمز ، سبز ، آبی) به 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)

ممکن است از فرمول های زیر برای تبدیل YUV (4: 2: 2) به رنگ RGB استفاده شود: [2]

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

نرم افزار پیوست به سادگی یک پسوند نرم افزار تک رنگ است:

  • یک درخواست ضبط "c" به آردوینو ارسال می شود
  • آردوینو بایت های زوج (تک رنگ) را به رایانه ارسال می کند
  • رایانه شخصی این بایت ها را در یک آرایه ذخیره می کند
  • آردوینو در مرحله بعد بایت های عدد فرد (chroma) را به رایانه ارسال می کند.
  • این بایت ها در آرایه دوم ذخیره می شوند … ما اکنون کل تصویر را داریم.
  • فرمولهای فوق اکنون برای هر گروه چهار بایت داده UYVY اعمال می شود.
  • پیکسل های رنگی حاصل در آرایه "pixels " قرار می گیرند
  • رایانه آرایه "pixels " را اسکن می کند و تصویری در پنجره "image" ظاهر می شود.

نرم افزار Processing 3 هر اسکن و نتایج نهایی را به طور مختصر نمایش می دهد:

  • عکس 1 داده های کروم U & V را از اسکن 1 نشان می دهد
  • عکس 2 داده های روشنایی Y1 و Y2 را از اسکن 2 نشان می دهد
  • عکس 3 تصویر رنگی را نشان می دهد … فقط یک چیز اشتباه است … کیف باید سبز باشد !!

هنگامی که این برنامه را حل کردم ، کد جدیدی ارسال خواهم کرد…

منابع:

[1]

www.haoyuelectronics.com/Attachment/OV7670٪… (صفحه 33)

[2]

fa.wikipedia.org/wiki/YCbCr (تبدیل JPEG)

برای مشاهده سایر دستورالعمل های من اینجا را کلیک کنید.

توصیه شده: