- רכיבים נדרשים
- מבוא ל- APDS-9960 דיגיטלי קרבה RGB וחיישן מחווה
- תרשים מעגל
- תכנות Arduino לחישה ומחוות צבעים
כיום רוב הטלפונים מגיעים עם תכונת בקרת מחוות כדי לפתוח או לסגור כל אפליקציה, להתחיל מוזיקה, להשתתף בשיחות וכו '. זו תכונה שימושית מאוד כדי לחסוך זמן וזה גם נראה מגניב לשלוט בכל מכשיר עם מחוות. השתמשנו בעבר במד תאוצה לבניית רובוט מבוקר מחוות ועכבר אוויר מבוקר. אבל היום אנו לומדים לממשק חיישן מחוות APDS9960 עם Arduino. לחיישן זה יש גם חיישן RGB לזיהוי צבעים, שישמש גם במדריך זה. אז אתה לא צריך להשתמש בחיישנים נפרדים לזיהוי מחוות וצבעים, אם כי יש חיישן ייעודי לזיהוי צבע - חיישן צבע TCS3200 שכבר השתמשנו בו עם Arduino לבניית מכונת סדרן צבעים.
רכיבים נדרשים
- ארדואינו UNO
- APDS9960 RGB וחיישן תנועה
- LCD בגודל 16x2
- מתג DPDT
- סיר 100K ונגד 10K
- כבלים מגשרים
מבוא ל- APDS-9960 דיגיטלי קרבה RGB וחיישן מחווה
APDS9960 הוא חיישן רב תכליתי. זה יכול לזהות מחוות, אור הסביבה וערכי RGB באור. חיישן זה יכול לשמש גם כחיישן קירבה ומשמש בעיקר בסמארטפונים, כדי להשבית את מסך המגע בזמן השתתפות בשיחה.
חיישן זה מורכב מארבע פוטודיודות. פוטודיודות אלה מזהות את אנרגיית ה- IR המוחזרת המועברת באמצעות נורית LED. כך שבכל פעם שמתבצעת מחווה כלשהי אז אנרגיית ה- IR הזו נחסמת ומשקפת בחזרה לחיישן, כעת החיישן מזהה את המידע (כיוון, מהירות) על המחווה וממיר אותו למידע דיגיטלי. ניתן להשתמש בחיישן זה למדידת מרחק המכשול על ידי זיהוי אור IR מוחזר. יש לו מסנני חסימת UV ו- IR לחישה של צבעי RGB והוא מייצר נתונים של 16 סיביות לכל צבע.
הצמצום של חיישן APDS-9960 מוצג להלן. חיישן זה עובד על פרוטוקול תקשורת I 2 C. הוא צורך זרם של 1 µA ומופעל על ידי 3.3 וולט אז היזהר ואל תחבר אותו עם פינת 5 וולט. סיכת ה- INT כאן היא סיכת הפסקה, המשמשת להנעת תקשורת I 2 C. וסיכת VL היא סיכת חשמל אופציונלית עבור נורית הלוח אם מגשר ה- PS אינו מחובר. אם מגשר ה- PS סגור, עליך להפעיל רק סיכת VCC, הוא יספק כוח לשניהם - למודול ולנורית ה- IR.
תרשים מעגל
חיבורים ל- APDS960 עם Arduino פשוטים מאוד. נשתמש בכפתור DPDT כדי לעבור בין שני המצבים RGB Sensing ו- Gesture Sensing. ראשית, סיכות התקשורת I2C SDA ו- SCL של APDS9960 מחוברות לסיכת Arduino A4 ו- A5 בהתאמה. כאמור קודם מתח ההפעלה של החיישן הוא 3.3v ולכן VCC ו- GND של APDS9960 מחוברים ל- 3.3V ו- GND של Arduino. סיכת ההפסקה (INT) של APDS9960 מחוברת לסיכת D2 של ארדואינו.
עבור LCD, סיכות נתונים (D4-D7) מחוברות לסיכות הדיגיטליות D6-D3 של Arduino ו- RS ו- EN פינים מחוברים ל- D6 ו- D7 של Arduino. V0 של LCD מחובר לסיר וסיר 100K משמש לשליטה על בהירות ה- LCD. עבור כפתורי DPDT השתמשנו רק ב -3 פינים. הסיכה השנייה מחוברת לסיכה D7 של Arduino לקלט והשניים האחרים מחוברים ל- GND ו- VCC ואחריהם נגד 10K.
תכנות Arduino לחישה ומחוות צבעים
חלק התכנות פשוט וקל והתוכנית המלאה עם סרטון הדגמה ניתנת בסוף הדרכה זו.
ראשית עלינו להתקין ספרייה מתוצרת Sparkfun. להתקנת ספרייה זו נווט אל סקיצה-> כלול ספרייה-> נהל ספריות.
כעת בסרגל החיפוש הקלד "Sparkfun APDS9960" ולחץ על כפתור ההתקנה כשתראה את הספרייה.
ואנחנו מוכנים לצאת לדרך. בוא נתחיל.
אז ראשית עלינו לכלול את כל קבצי הכותרת הנדרשים. קובץ הכותרת הראשון LiquidCrystal.h משמש לפונקציות LCD. קובץ הכותרת השני Wire.h משמש לתקשורת I 2 C ואחרון SparkFun_APDS996.h משמש לחיישן APDS9960.
#לִכלוֹל
עכשיו בשורות הבאות הגדרנו את הפינים לכפתור ול- LCD.
const int buttonPin = 7; const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
בחלק הבא הגדרנו מאקרו לסיכת ההפסקה המחובר לסיכה דיגיטלית 2 ולחצן משתנה אחד מצב למצב הנוכחי של הכפתור ו- isr_flag לשגרת שירות ההפסקה.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
בשלב הבא נוצר אובייקט עבור SparkFun_APDS9960, כך שנוכל לגשת לתנועות המחווה ולהביא את ערכי ה- RGB.
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); uint16_t ambient_light = 0; uint16_t red_light = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
בשנת ההתקנה פונקציה, את השורה הראשונה היא להביא את ערך מלחצן (נמוך / גבוה) ומגדיר הקו השני & השלישי פסיקה ו סיכת כפתור כקלט. apds.init () מאותחל את חיישן APDS9960 ו- lcd.begin (16,2) מאותחל את ה- LCD.
הגדרת חלל () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
בשנת לולאת פונקציה בשורה הראשונה מקבלת את הערכים מהלחץ ומאחסן אותם buttonState משתנה המוגדרים קודם לכן. כעת בשורות הבאות אנו בודקים את הערכים מתוך הכפתור, אם הוא גבוה אז אנו מאפשרים את חיישן האור ואם הוא נמוך אז אתחל את חיישן המחווה.
AttachInterrupt () הוא פונקציה משמשת פסיקה חיצונית אשר במקרה זה היא הפסיקה של החיישן. הטיעון הראשון בפונקציה זו הוא מספר הפסיקה. ב- Arduino UNO, ישנם שני סיכות דיגיטליות של סיכות הפסקה - 2 ו- 3 המסומנות על ידי INT.0 ו- INT.1. וחיברנו את זה לסיכה 2 אז כתבנו שם 0. הטיעון השני מכנה את הפונקציה interruptRoutine () המוגדרת מאוחר יותר. הטיעון האחרון הוא FALLING כך שהוא יפעיל את ההפרעה כאשר הסיכה עוברת מגבוה לנמוך. למידע נוסף על הפרעות בארדואינו כאן.
loop loop () { buttonState = digitalRead (buttonPin); אם (buttonState == HIGH) { apds.enableLightSensor (true); }
בחלק הבא אנו בודקים אם יש סיכת כפתור. אם הוא גבוה אז התחל תהליך עבור חיישן RGB. ואז בדוק אם חיישן האור קורא ערכים או לא. אם הוא אינו מסוגל לקרוא את הערכים אז במקרה זה, הדפס את " שגיאת קריאת ערכי האור". ואם הוא יכול לקרוא ערכים, השווה את הערכים של שלושת הצבעים והגבוה ביותר, הדפיס את הצבע על גבי LCD.
אם (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (light_light)) { lcd.print ("שגיאה בקריאת ערכי האור"); } אחר { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("אדום"); עיכוב (1000); lcd.clear (); } ……. ………..
בשורות הבאות בדוק אם יש סיכת כפתור, ואם הוא נמוך התהליך חיישן המחווה. ואז בדוק אם isr_flag ואם הוא 1 אז נקרא פונקציה detachInterrupt () . פונקציה זו משמשת לכיבוי ההפרעה. השורה הבאה קוראת ל- handleGesture () אשר מוגדרת פונקציה מאוחר יותר. בשורות הבאות נוספות מגדירים את isr_flag לאפס ומחברים את הפסיקה.
אחרת אם (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
הבא הוא interruptRoutine () . פונקציה זו משמשת להפעלת המשתנה isr_flag 1, כך שניתן יהיה לאתחל את שירות ההפרעה.
בטל interruptRoutine (). { isr_flag = 1; }
HandleGesture () פונקציה מוגדרת בחלק הבא. פונקציה זו בודקת תחילה את זמינותו של חיישן המחוות. אם הוא זמין, הוא קורא את ערכי המחווה ובודק באיזו מחווה מדובר (למעלה, למטה, ימינה, שמאלה, רחוק, קרוב) ומדפיס את הערכים המתאימים ל- LCD.
בטל handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); עיכוב (1000); lcd.clear (); לשבור; מקרה DIR_DOWN: lcd.print ("DOWN"); עיכוב (1000); lcd.clear (); לשבור; מקרה DIR_LEFT: lcd.print ("LEFT"); עיכוב (1000); lcd.clear (); לשבור; מקרה DIR_RIGHT: lcd.print ("RIGHT"); עיכוב (1000); lcd.clear (); לשבור; מקרה DIR_NEAR: lcd.print ("NEAR"); עיכוב (1000); lcd.clear (); לשבור; מקרה DIR_FAR: lcd.print ("FAR"); עיכוב (1000); lcd.clear (); לשבור; ברירת מחדל: lcd.print ("ללא"); עיכוב (1000); lcd.clear (); } } }
לבסוף, העלה את הקוד לארדואינו והמתין לאתחול החיישן. עכשיו בזמן שהכפתור כבוי פירושו שהוא נמצא במצב מחווה. אז נסה להזיז את הידיים לכיוונים שמאל, ימין, למעלה, למטה. במשך הרבה מחוות, לשמור את היד במרחק של 2-4 ס"מ בין חיישן במשך 2-3 שניות ולהסיר אותו. ולמחווה כמעט הרחק את היד שלך מחיישן ואז התקרב אליה והסר אותה.
כעת הפעל את הכפתור כדי להעביר אותו למצב חישת צבע ולקחת אובייקטים אדומים, כחולים וירוקים בזה אחר זה אל החיישן. זה ידפיס את צבע האובייקט.