איך גורמים למיקרו-בקר לזהות צבע של אובייקט פיזי? סקירה, הוראות שימוש ובדיקות לאחד מהמודולים הנפוצים באתרים הסיניים
במיקרו-בקרים, ולוחות פיתוח אמבדד כמו ארדואינו, כמעט תמיד אין לנו מספיק משאבים לקחת תמונה ממצלמה דיגיטלית ולקרוא ממנה ערכי צבעים. כדי לגלות מה הצבע של משהו, אנחנו צריכים חיישן ייעודי.
באתרים הסיניים מוצעים כיום שלושה סוגי מודולים נפוצים וזולים עם חיישני צבע: כאלה שמבוססים על חיישן TCS3200 של חברת ams, כמו המודול GY-31 שאותו אציג בפוסט הזה, מודולים שעובדים עם חיישן TCS3472 המשוכלל יותר של TAOS, ומודולים על בסיס APDS-9960 העוד-יותר משוכלל של Avago, שיודע בנוסף לזהות קירבה ומחוות (Gestures).
כל חיישן צבע קולט ומעבד, בסופו של דבר, גלי אור שמגיעים אליו. הדבר פותח פתח להמון סוגי הפרעות, שיבושים וניואנסים אחרים: הספקטרום והעוצמה של מקור האור, מקורות אור לא רלוונטיים, המרקם ותכונות החזרת האור של המשטח הנמדד (אם מנסים לבדוק צבע של משטח) ועוד. לכן, מודולים רבים של חיישני צבע מצוידים בלד לבן אחד או יותר להארה אחידה ככל האפשר, ובכיסוי אטום כלשהו סביב החיישן (לצמצום כניסת אור מפריע מהצדדים). כמו כן, הם מיועדים לקריאה מטווח קרוב. במקרה של GY-31, מדובר על כסנטימטר.
תאורת לדים לחיישן – פרמטרים ושפצור
המודול שקניתי הגיע עם לדים עקומים לגמרי, שכנראה התכופפו במהלך המשלוח, אבל גם מראש הולחמו בצורה שכלל לא מתאימה לתפקוד החיישן:
שלפתי את המלחם ותיקנתי אותם כך שיהיו פחות או יותר ישרים, ויאירו את המשטח שמול החיישן ככל שניתן בלי שהאור שלהם יזלוג ישירות אליו. התמונה הבאה היא השלב הראשון של התיקון – לאחר מכן כופפתי את הלדים עוד יותר "פנימה", לכיוון החיישן שבמרכז (מוסתר ע"י הפלסטיק השחור).
אם כבר נגענו בלדים, בואו נראה איך הם עובדים. ארבעתם מחוברים במקביל, כשלכל אחד מהם מחובר נגד מגביל זרם בערך של 330 אוהם. לדים לבנים נוטים להפיל בסביבות 2.7V, אז לפי חוק אוהם, במתח הפעלה של 5V (המודול מיועד לעבוד בטווח מתחים 3-5V), נצפה שכל אחד מהם יצרוך כ-7 מיליאמפר וביחד 28. בפועל, המודול כולו צרך בסביבות 27mA.
כשמחברים את המודול לחשמל דרך פינים GND ו-Vcc, הלדים מאירים אוטומטית. יש פין בשם LED שמאפשר לכבות אותם: מתחת לפלסטיק השחור, הפין הזה מתחבר ל-Base של טרנזיסטור PNP פשוט, שמחובר כברירת מחדל גם ל-Vcc של המודול דרך נגד של 1K. כלומר, כדי לכבות את הלדים צריך "למשוך" את פין LED לאדמה – ישירות או דרך נגד עם ערך קטן, אחרת לא נצליח להתגבר על ה-pull-up המובנה. זה אומר שגם אם הלדים כבויים, עדיין יזרמו לנו שם עד 5 מיליאמפר, כך שלחיסכון בחשמל ביישום מופעל-בסוללה, הפין LED הוא לא פתרון טוב.
עקרון הפעולה של חיישן הצבע
יש הרבה דרכים להגדיר ולמדוד צבעים. החיישן TCS3200 עושה זאת באמצעות ערכי אדום, ירוק וכחול, שמבוטאים ביחס לבהירוּת באופן כללי. בתוך החיישן מותקנות פוטו-דיודות במערך של 8×8, כאשר לכל קבוצה של 16 מתוכן יש פילטר לצבע אחר – חוץ מהדיודות למדידת בהירות, שהן ללא פילטר צבע. המיקרו-בקר בוחר, באמצעות המתח על פינים S2 ו-S3 של החיישן, לאיזו קבוצת דיודות להתייחס, והחיישן מוציא את המידע הרלוונטי מפין OUT בצורת גל ריבועי, כאשר התדר של הגל הזה מייצג את עוצמת האור.
Brightness: S2 = H, S3 = L
Red : S2 = L, S3 = L
Green : S2 = H, S3 = H
Blue : S2 = L, S3 = H
לדוגמה, לפי ה-Datasheet, אם החיישן יואר באורך גל 470 ננומטר (כחול) בעוצמה של 47.2 מיקרוואט לסמ"ר, ונכוון את הפלט לדיודות הבהירוּת, נקבל גל ריבועי בתדר בין 12.5 ל-18.7 קילוהרץ, ואילו הדיודות עם הפילטר הכחול יתנו לנו תדר שהוא בין 61% ל-84% מהתדר הנ"ל. הדיודות האחרות ייתנו גל ריבועי בתדר נמוך יותר משמעותית. כמו שאתם רואים, השוֹנוּת בתוצאות יכולה להיות גדולה מאוד. אם אתם צריכים לזהות גוונים ברמת דיוק גבוהה, זה לא החיישן בשבילכם.
בחושך כמעט-מוחלט, אגב, תדר הגל היוצא עבור בהירות הוא כ-2Hz.
כיבוי והתאמת התדר היוצא
הפינים S0 ו-S1 במודול מיועדים להתאמה של תדר הפלט. כששניהם נמוכים, החיישן למעשה כבוי ולא נקבל שום פלט. כששניהם H (כלומר, כשמושכים את שניהם אל מתח ההפעלה של המודול), יוצא התדר הרגיל, שהטווח שלו יכול להיות בין 2Hz כאמור לבין אפילו 600KHz. אם אנחנו מצפים לתאורה די חזקה (=תדר פלט גבוה), והמיקרו-בקר שלנו איטי או עמוס בעבודה, אפשר להוריד את S1 ל-L (=אדמה) ולקבל תדר פלט מחולק בחמישה (20% מהתדר המקורי), או לחלופין להוריד את S0 ל-L ואז לקבל תדר פלט מחולק בחמישים (2% מהמקורי).
אגב, במודול GY-31 שני הפינים האלה "נמשכים" ל-Vcc על ידי נגדים 10K מובנים (משמאל על השטח הלבן, בתמונה למעלה), מה שאומר, קצת כמו שקרה עם הטרנזיסטור, שאנחנו לא יכולים לכבות את החיישן בלי לבזבז קצת זרם על הדרך.
בדיקה פשוטה
תפסתי שני אובייקטים צבעוניים נוחים שהסתובבו על שולחן העבודה, ומדדתי כל אחד מהם לפי התור, מטווח קצר מאוד, באמצעות ה-GY-31 וסקופ על הפלט. דגם ג'מבו שבור-זנב, שהודפס בתלת-ממד בכתום די בהיר, הפיק פלט ב-70KHz לבהירות, ב-54KHz לאדום, 14KHz לירוק ו-14KHz לכחול. היחס בין תדרי הצבעים לתדר הבהירות הכללית יוצא 0.77 לאדום ופעמיים 0.2, לירוק ולכחול. כשמכפילים כל יחס ב-255 מקבלים 197 ופעמיים 51. הזנתי את המספרים אלה כערכי RGB לרקע של תמונה בתוכנת ציור, וזה מה שיצא:
לא ביצעתי כל שינויי צבע/בהירות בצילום הזה, אך ראוי לציין שבעין ההתאמה נראתה קצת פחות טוב – הרקע במחשב נראה אדום יותר.
הנה התוצאה של תהליך זהה עם האובייקט השני, שהוא למעשה PCB שחור בתור מארז מפלסטיק שקוף-למחצה בגוון כחול-טורקיז:
הערות על איסוף המידע באמצעות מיקרו-בקרים
בגדול, בכלים שמיקרו-בקרים נותנים לנו, יש שתי דרכים עיקריות למדוד תדר של גל ריבועי כמו זה שה-GY-31 מוציא. הדרך הראשונה היא לספור X פולסים ולבדוק כמה זמן זה לקח, והשנייה היא ליצור חלון זמן Y ולספור כמה פולסים הגיעו בזמן הזה. במקרה שלנו, הדרך השנייה נוחה יותר כי התוצאות מתקבלות ב"פורמט" טבעי וקל לעיבוד (יחס ישר, תדר יותר גבוה => יותר פולסים).
איך שלא יהיה, אנחנו צריכים לתכנן היטב כמה פולסים, או כמה זמן, אנחנו סופרים, כי טווח התדרים הפוטנציאליים גדול מאוד. אם נספור, נניח, עשרה פולסים, ובמקרה החיישן שלנו ייקלע לעלטה מוחלטת, מדידת הבהירות לבדה תימשך כחמש שניות. ואם נמדוד במשך אלפית שנייה, אנחנו עלולים לאבד רזולוציה חשובה לערכים נמוכים (גם של הבהירות וגם של צבעים ספציפיים). הכלל המנחה הוא כמובן ללכת לפי כמות האור הצפויה ביישום, ולהשתדל שזו תהיה גבוהה (שוב, אם המיקרו-בקר מסוגל לעמוד בזה).
שלום לך, אני גם קיבלתי את החיישן בצורה הזאת של הלדים. אז תודה לך על המידע על התיקון שלהם.
עדיין לא הבנתי באופן חד משמעי על רגלי S0 ו S1. למה צריך אותם? על מה כדאי לכוון אותם?
תודה רבה!
הפינים האלה מאפשרים לחלק את התדרים היוצאים באיזשהו קבוע, אם במקרה נוח לך יותר "לקרוא" תדר נמוך מאשר גבוה. ברגע שתחליט עם איזה מכשיר ובאיזו שיטה אתה קורא את המידע שיוצא מהחיישן, תדע גם אילו תדרים כדאי לבחור…
היי,
אני משתמש בארדואינו.
איך אני יודע מה עדיף?
דבר שני, אני מקבל ערכים גבוהים בהרבה מ255..
מה אתה ממליץ לי לעשות?
תודה
…קודם כל, לקרוא שוב את הקטע "בדיקה פשוטה" בפוסט? הערכים עד 255 מגיעים דרך החישוב שהראיתי, זה לא משהו ש"מקבלים".
הבנתי,
אין לי סקופ כך שאני יכול למדוד את הערכים…
דבר שני, מה הכוונה תדר הבהירות הכללית?
תודה על המענה
לא חייבים סקופ, בשביל זה כתבתי את הקטע "הערות על איסוף המידע באמצעות מיקרו-בקרים". תדר הבהירות הכללית = התדר שהחיישן מוציא כשבוחרים לקרוא את מידע ה-Brightness: עד כמה חזק האור שהוא קולט, בלי קשר לצבע הספציפי.