תוכן עניינים:

צור מצלמה משלך: 8 שלבים
צור מצלמה משלך: 8 שלבים

וִידֵאוֹ: צור מצלמה משלך: 8 שלבים

וִידֵאוֹ: צור מצלמה משלך: 8 שלבים
וִידֵאוֹ: לא הביישן למד 2024, יולי
Anonim
Image
Image
צור מצלמה משלך
צור מצלמה משלך

מדריך זה מסביר כיצד ליצור מצלמה מונוכרום באמצעות חיישן תמונה Omnivision OV7670, מיקרו -בקר Arduino, כמה חוטי מגשר ותוכנת עיבוד 3.

כמו כן מוצגת תוכנה ניסיונית להשגת תמונת צבע.

לחץ על מקש "c" כדי לצלם תמונה בגודל 640*480 פיקסלים … לחץ על מקש "s" כדי לשמור את התמונה בקובץ. תמונות עוקבות ממוספרות ברצף אם תרצה ליצור סרט זמן קצר.

המצלמה אינה מהירה (כל סריקה אורכת 6.4 שניות) ומתאימה לשימוש רק בתאורה קבועה.

העלות, למעט הארדואינו והמחשב האישי שלך, היא פחות מכוס קפה.

תמונות

חלקי הרכיב, ללא חיווט מגשר, מוצגים בתצלום הפתיחה.

התמונה השנייה היא צילום מסך המציג את תוכנת המצלמות של Arduino ואת לוכד המסגרות Processing 3. הבלעה מראה כיצד המצלמה מחוברת.

הסרטון מדגים את המצלמה בפעולה. כאשר נלחץ על מקש הצילום "c" יש הבזק קצר ואחריו פרץ של פעילות תוך סריקה של התמונה. התמונה מופיעה אוטומטית בחלון התצוגה לאחר השלמת הסריקה. לאחר מכן נראה שהתמונות מופיעות בתיקיית העיבוד לאחר כל לחיצה על מקש "s". הסרטון מסתיים ברכיבה מהירה בכל אחת משלוש התמונות השמורות.

שלב 1: תרשים מעגלים

תרשים מעגלים
תרשים מעגלים
תרשים מעגלים
תרשים מעגלים
תרשים מעגלים
תרשים מעגלים

תרשים המעגל, לכל הגרסאות של מצלמה זו, מוצג בתמונה 1.

תמונות 2, 3 מראות כיצד המחברים-החוטים והרכיבים מחוברים.

ללא סוגר האלומיניום התמונות מונחות על צדן.

אַזהָרָה

תכנת את הארדואינו שלך לפני שתחבר כל חוטי מגשר לשבב המצלמה OV7670. זה ימנע מפיני פלט של 5 וולט מתוכנית קודמת להרוס את שבב המצלמה OV7670 3v3 וולט.

שלב 2: רשימת חלקים

רשימת חלקים
רשימת חלקים

החלקים הבאים התקבלו מ-

  • 1 רק מודול מצלמת VGA 300KP OV7670 עבור ערכת DIY DIY arduino
  • סוגר מצלמה אחד בלבד עם אגוזים וברגים
  • 1 UNO R3 בלבד עבור arduino MEGA328P 100% מקורי ATMEGA16U2 עם כבל USB

החלקים הבאים התקבלו באופן מקומי

  • 18 כבלי מגשר זכר-נקבה אנלי Arduino
  • 3 כבלי מגשר נקבה-נקבה מסוג Arduinin בלבד
  • קרש לחם אחד בלבד
  • 4 נגדי 1/2 וואט 4K7 אוהם בלבד
  • מעמד אלומיניום גרוטאות אחד בלבד.

תזדקק גם לדפי הנתונים הבאים:

  • 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 בתים צבעוניים.

מונוכרום

כדי לקבל תמונה מונוכרום עלינו לדגום כל בייט נתונים שני.

ל- Arduino יש רק זיכרון גישה אקראי של 2K אך כל מסגרת כוללת 640*2*480 = 307, 200 בתים של נתונים. אלא אם כן נוסיף לוכד מסגרות ל- OV7670 כל הנתונים חייבים להישלח אל המחשב שורה אחר שורה לעיבוד.

ישנן שתי אפשרויות:

עבור כל אחד מ -480 פריימים רצופים, אנו יכולים ללכוד קו אחד לארדואינו במהירות גבוהה לפני שנשלח אותו למחשב במהירות של 1Mbps. גישה כזו תראה את ה- OV7670 עובד במלוא המהירות אך ייקח הרבה זמן (הרבה יותר מדקה).

הגישה שנקטתי היא להאט את ה- PCLK עד 8uS ולשלוח כל דוגמה כפי שהיא מגיעה. גישה זו מהירה משמעותית (6.4 שניות).

שלב 4: הערות עיצוב

הערות עיצוב
הערות עיצוב
הערות עיצוב
הערות עיצוב
הערות עיצוב
הערות עיצוב

תְאִימוּת

שבב המצלמה OV7670 הוא מכשיר 3V3 וולט. גליון הנתונים מציין כי מתח מעל 3.5 וולט יפגע בשבב.

כדי למנוע מ- Arduino 5 וולט שלך להרוס את שבב המצלמה OV7670:

  • יש להפחית את אות השעון החיצוני (XCLK) מהארדואינו לרמה בטוחה באמצעות מחלק מתח.
  • יש לנטרל את נגדי המשיכה הפנימיים של Arduino I2C ל -5 וולט ולהחליף אותם בנגדי משיכה חיצוניים לאספקת 3v3 וולט.
  • תכנת את הארדואינו שלך לפני שתצמיד חוטי מגשר כלשהם מכיוון שחלק מהסיכות עדיין עשויות להיות מתוכנתות כפלט מפרויקט קודם לכן !!! (למדתי זאת בדרך הקשה … למרבה המזל קניתי שניים מכיוון שהם היו כל כך זולים).

שעון חיצוני

שבב המצלמה OV7670 דורש שעון חיצוני בטווח התדרים 10Mhz עד 24MHz.

התדר הגבוה ביותר שנוכל לייצר מארדואינו 16 מגה -הרץ הוא 8 מגה -הרץ אך נראה שזה עובד.

קישור סדרתי

זה לוקח לפחות 10 uS (מיקרו שניות) כדי לשלוח 1 בייט נתונים על פני קישור טורי של 1Mbps (מיליון סיביות לשנייה). הזמן הזה מורכב כדלקמן:

  • 8 סיביות נתונים (8us)
  • סיביות התחלה אחת (1uS)
  • סיבית עצירה אחת (1uS)

שעון פנימי

תדר שעון הפיקסלים הפנימי (PCLK) בתוך OV7670 נקבע על ידי סיביות [5: 0] בתוך ה- CLKRC (ראו תמונה 1). [1]

אם הגדרנו סיביות [5: 0] = B111111 = 63 ונחיל אותו על הנוסחה שלמעלה אז:

  • F (שעון פנימי) = F (שעון קלט)/(ביט [5: 0} +1)
  • = 8000000/(63+1)
  • = 125000 הרץ או
  • = 8uS

מכיוון שאנו מדגמים רק כל בייט נתונים שני, מרווח 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" (תמונה 1) כתובה:

עבור YUV/RGB, tp = 2 x TPCLK

איורים 1, 2 ו -3 מאמתים את גליונות הנתונים ומאשרים כי Omnivision מתייחס לכל 2 בתים של נתונים כמקבילה של פיקסל אחד.

צורות הגל של האוסילוסקופ גם מוודאות ש- HREF נשאר נמוך בזמן מרווחי ההיתוך.

איור 4 מאשר כי פלט ה- XCLK מהארדואינו הוא 8MHz. הסיבה שאנו רואים גל סינוס, ולא גל מרובע, היא שכל ההרמוניות המוזרות אינן נראות לאוסילוסקופ הדגימה 20MHz שלי.

שלב 6: מסגר תופס

חוט מסגרת
חוט מסגרת

חיישן התמונה בתוך שבב מצלמה OV7670 כולל מערך של 656*486 פיקסלים מתוכם רשת של 640*480 פיקסלים משמשת לצילום.

ערכי הרישום HSTART, HSTOP, HREF ו- VSTRT, VSTOP, VREF משמשים למיקום התמונה על פני החיישן. אם התמונה לא ממוקמת כראוי מעל החיישן תראה פס שחור על קצה אחד או יותר כפי שהוסבר בסעיף "הערות עיצוב".

ה- OV7670 סורק כל שורה בתמונה פיקסל אחד בכל פעם החל מהפינה השמאלית העליונה עד שהוא מגיע לפיקסל הימני התחתון. ה- Arduino פשוט מעביר את הפיקסלים האלה למחשב באמצעות הקישור הטורי כפי שמוצג בתמונה 1.

המשימה של לוכדי המסגרות היא ללכוד כל אחד מ- 640*480 = 307200 פיקסלים ולהציג את התוכן בחלון "תמונה".

עיבוד 3 משיג זאת באמצעות ארבע שורות הקוד הבאות !!

שורת קוד 1:

byte byteBuffer = בייט חדש [maxBytes+1]; // שבו maxBytes = 307200

הקוד הבסיסי בהצהרה זו יוצר:

  • מערך בתים של 307201 הנקרא "byteBuffer [307201]"
  • הבייט הנוסף מיועד לתו סיום (קו הזנה).

שורת קוד 2:

גודל (640, 480);

הקוד הבסיסי בהצהרה זו יוצר:

  • משתנה שנקרא "רוחב = 640;"
  • משתנה שנקרא "גובה = 480";
  • מערך 307200 פיקסלים הנקרא "פיקסלים [307200]"
  • חלון "תמונה" של 640*480 פיקסלים בו מוצגים תוכן מערך הפיקסלים . חלון "תמונה" זה מתרענן ברציפות בקצב פריימים של 60 פריימים לשנייה.

שורת קוד 3:

byteCount = myPort.readBytesUntil (lf, byteBuffer);

הקוד הבסיסי בהצהרה זו:

  • מאגר את הנתונים הנכנסים באופן מקומי עד שהוא רואה תו "lf" (linefeed).
  • לאחר מכן הוא זורק את 307200 בתים הראשונים של נתונים מקומיים למערך byteBuffer .
  • הוא גם שומר את מספר הבייטים שהתקבלו (307201) למשתנה שנקרא "byteCount".

שורת קוד 4:

פיקסלים = color (byteBuffer );

כאשר הוא ממוקם בלולאה להמשך הבא, הקוד הבסיסי בהצהרה זו:

  • מעתיק את התוכן של מערך "byteBuffer " למערך "פיקסלים"
  • שתוכנו מופיע בחלון התמונה.

מקשי מפתח:

לוכד המסגרות מזהה את הקשות המקשים הבאות:

  • 'C' = לצלם את התמונה
  • 'S' = שמור את התמונה בקובץ.

שלב 7: תוכנה

הורד והתקן כל אחת מחבילות התוכנה הבאות אם עדיין לא מותקן:

  • "Arduino" מתוך
  • "Java 8" מתוך https://java.com/en/download/ [1]
  • "עיבוד 3" מאת

התקנת הסקיצה של Arduino:

  • הסר את כל חוטי המגשר של OV7670 [2]
  • חבר כבל USB ל- Arduino שלך
  • העתק את התוכן של "OV7670_camera_mono_V2.ino" (מצורף) ל"שרטוט "של ארדואינו ושמור.
  • העלה את הסקיצה לארדואינו שלך.
  • נתק את הארדואינו
  • כעת תוכל לחבר מחדש בבטחה את חוטי המגשר OV7670
  • חבר מחדש את כבל ה- USB.

התקנה והפעלה של סקיצת העיבוד

  • העתק את תוכן "OV7670_camera_mono_V2.pde" (המצורף) ל"סקירה "בעיבוד ושמור.
  • לחץ על כפתור "הפעלה" השמאלי העליון … יופיע חלון תמונה שחור
  • לחץ על חלון התמונה "השחור"
  • לחץ על מקש "c" כדי לצלם תמונה. (כ- 6.4 שניות).
  • לחץ על מקש "s" כדי לשמור את התמונה בתיקיית העיבוד שלך
  • חזור על שלבים 4 ו -5
  • לחץ על כפתור "עצור" כדי לצאת מהתוכנית.

הערות

[1]

עיבוד 3 דורש Java 8

[2]

זהו צעד בטיחות "פעם אחת בלבד" כדי למנוע פגיעה בשבב המצלמה OV7670 שלך.

עד להעלאת המערכון "OV7670_camera_mono.ini" לארדואינו, נגדי המשיכה הפנימיים מחוברים ל -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" נשלחת ל- Arduino
  • ה- Arduino שולח את הבתים הממוספרים (מונוכרום) למחשב האישי
  • המחשב שומר את הבייטים הללו במערך
  • הבא Arduino שולח את בתים ממוספרים (chroma) למחשב האישי.
  • בתים אלה נשמרים במערך שני … כעת יש לנו את התמונה כולה.
  • הנוסחאות הנ"ל מוחלות כעת על כל קבוצה של ארבעה בתים של UYVY נתונים.
  • פיקסלי הצבע המתקבלים ממוקמים לאחר מכן במערך "פיקסלים"
  • המחשב סורק את מערך "הפיקסלים " ותמונה מופיעה בחלון "התמונה".

תוכנת עיבוד 3 מציגה בקצרה כל סריקה והתוצאות הסופיות:

  • תמונה 1 מציגה את נתוני chroma U & V מסריקה 1
  • תמונה 2 מציגה את נתוני הזוהר Y1 ו- Y2 מסריקה 2
  • תמונה 3 מציגה את תמונת הצבע … רק דבר אחד לא בסדר … התיק צריך להיות ירוק !!

אפרסם קוד חדש לאחר שאפתור את התוכנית הזו …

הפניות:

[1]

www.haoyuelectronics.com/Attachment/OV7670%… (עמוד 33)

[2]

en.wikipedia.org/wiki/YCbCr (המרת JPEG)

לחץ כאן לצפייה במדריכים האחרים שלי.

מוּמלָץ: