- المكونات المطلوبة
- مقدمة إلى APDS-9960 Digital Proximity RGB & Gesture Sensor
- مخطط الرسم البياني
- برمجة اردوينو للإيماءات واستشعار اللون
تأتي معظم الهواتف اليوم مزودة بخاصية التحكم بالإيماءات لفتح أو إغلاق أي تطبيق ، وبدء تشغيل الموسيقى ، وحضور المكالمات وما إلى ذلك. هذه ميزة مفيدة للغاية لتوفير الوقت ، كما أنها تبدو رائعة للتحكم في أي جهاز بالإيماءات. استخدمنا سابقًا مقياس التسارع لبناء روبوت يتم التحكم فيه بالإيماءات وفأرة هوائية يتم التحكم فيها بالإيماءات. لكننا نتعلم اليوم كيفية التعامل مع مستشعر الإيماءات APDS9960 مع Arduino. يحتوي هذا المستشعر أيضًا على مستشعر RGB لاكتشاف الألوان ، والتي سيتم استخدامها أيضًا في هذا البرنامج التعليمي. لذلك لا تحتاج إلى استخدام مستشعرات منفصلة للكشف عن الإيماءات والألوان ، على الرغم من توفر مستشعر مخصص لاكتشاف الألوان - مستشعر الألوان TCS3200 الذي استخدمناه بالفعل مع Arduino لبناء آلة فرز الألوان.
المكونات المطلوبة
- اردوينو UNO
- APDS9960 RGB ومستشعر الإيماءات
- 16x2 LCD
- مفتاح DPDT
- وعاء 100 كيلو ومقاوم 10 كيلو
- كابلات العبور
مقدمة إلى APDS-9960 Digital Proximity RGB & Gesture Sensor
APDS9960 هو مستشعر متعدد الوظائف. يمكنه اكتشاف الإيماءات والإضاءة المحيطة وقيم RGB في الضوء. يمكن أيضًا استخدام هذا المستشعر كجهاز استشعار تقارب ويستخدم غالبًا في الهواتف الذكية لتعطيل شاشة اللمس أثناء حضور مكالمة.
يتكون هذا المستشعر من أربعة صمامات ضوئية. تكتشف هذه الثنائيات الضوئية طاقة الأشعة تحت الحمراء المنعكسة التي تنتقل بواسطة مصباح LED على اللوحة. لذلك كلما تم تنفيذ أي إيماءة ، يتم إعاقة طاقة الأشعة تحت الحمراء هذه وتعكس مرة أخرى إلى المستشعر ، والآن يكتشف المستشعر المعلومات (الاتجاه والسرعة) حول الإيماءة ويحولها إلى معلومات رقمية. يمكن استخدام هذا المستشعر لقياس مسافة العائق عن طريق الكشف عن ضوء الأشعة تحت الحمراء المنعكس. يحتوي على مرشحات حجب للأشعة فوق البنفسجية والأشعة تحت الحمراء لاستشعار ألوان RGB وتنتج بيانات 16 بت لكل لون.
يظهر أدناه طرف مستشعر APDS-9960. يعمل هذا المستشعر على بروتوكول الاتصال I 2 C. يستهلك تيار 1µA ويعمل بجهد 3.3 فولت لذا كن حذرًا ولا تقم بتوصيله بدبوس 5 فولت. دبوس INT هنا هو دبوس المقاطعة ، والذي يستخدم لتشغيل اتصال I 2 C. ودبوس VL هو دبوس طاقة اختياري لمصباح LED الموجود باللوحة إذا لم يكن موصل PS غير متصل. إذا تم إغلاق وصلة مرور PS ، فأنت بحاجة فقط إلى تشغيل دبوس VCC ، وسوف يوفر الطاقة لكل من الوحدة النمطية و IR LED.
مخطط الرسم البياني
اتصالات APDS960 مع Arduino بسيطة للغاية. سوف نستخدم زر DPDT للتبديل بين وضعي RGB Sensing و Gesture Sensing. أولاً ، يتم توصيل دبابيس اتصالات I2C SDA و SCL لـ APDS9960 بـ Arduino pin A4 و A5 على التوالي. كما ذكرنا سابقًا ، فإن جهد التشغيل للمستشعر هو 3.3 فولت ، لذا فإن VCC و GND لـ APDS9960 متصلان بـ 3.3V و GND من Arduino. يتم توصيل دبوس المقاطعة (INT) الخاص بـ APDS9960 بدبوس D2 في Arduino.
بالنسبة لشاشات الكريستال السائل ، يتم توصيل دبابيس البيانات (D4-D7) بالدبابيس الرقمية D6-D3 من Arduino ويتم توصيل دبابيس RS و EN بـ D6 و D7 من Arduino. V0 من LCD متصل بالوعاء ويستخدم وعاء 100K للتحكم في سطوع شاشة LCD. بالنسبة لأزرار DPDT ، استخدمنا 3 دبابيس فقط. الدبوس الثاني متصل بـ D7 من Arduino للإدخال والآخران متصلان بـ GND و VCC متبوعًا بمقاوم 10K.
برمجة اردوينو للإيماءات واستشعار اللون
جزء البرمجة بسيط وسهل ويتم تقديم البرنامج الكامل مع فيديو توضيحي في نهاية هذا البرنامج التعليمي.
نحتاج أولاً إلى تثبيت مكتبة من صنع Sparkfun. لتثبيت هذه المكتبة ، انتقل إلى Sketch-> Include Library-> Manage Libraries.
الآن في شريط البحث ، اكتب "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 بحيث ستطلق المقاطعة عندما ينتقل الدبوس من الأعلى إلى الأسفل. تعرف على المزيد حول مقاطعات Arduino هنا.
حلقة باطلة () { buttonState = digitalRead (buttonPin) ؛ إذا (buttonState == HIGH) { apds.enableLightSensor (صواب) ؛ }
في الجزء التالي ، نتحقق من دبوس الزر. إذا كانت عالية ، فابدأ العملية لمستشعر RGB. ثم تحقق مما إذا كان مستشعر الضوء يقرأ القيم أم لا. إذا لم يكن قادرًا على قراءة القيم ، في هذه الحالة ، اطبع " خطأ في قراءة قيم الضوء". وإذا كان بإمكانه قراءة القيم ، فقم بمقارنة قيم الألوان الثلاثة وأيهما أعلى ، اطبع هذا اللون على شاشة LCD.
if (buttonState == مرتفع) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("خطأ في قراءة قيم الضوء") ؛ } else { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Red") ؛ تأخير (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 ، بحيث يمكن تهيئة خدمة المقاطعة.
مقاطعة باطلةروتين (). { isr_flag = 1 ، }
تم تحديد وظيفة handleGesture () في الجزء التالي. تتحقق هذه الوظيفة أولاً من توفر مستشعر الإيماءات. إذا كان متاحًا ، فإنه يقرأ قيم الإيماءات ويتحقق من الإيماءة (أعلى ، أسفل ، يمين ، يسار ، بعيد ، قريب) ويطبع القيم المقابلة على شاشة LCD.
void 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 () ؛ } } }
أخيرًا ، قم بتحميل الكود إلى Arduino وانتظر حتى يتم تهيئة المستشعر. الآن أثناء إيقاف تشغيل الزر ، فهذا يعني أنه في وضع الإيماءات. لذا حاول تحريك يديك في اتجاهات اليسار واليمين والأعلى والأسفل. ل البعيدة لفتة، والحفاظ على يدك على مسافة 2-4 بوصة من أجهزة الاستشعار لمدة 2-3 ثوان، وإزالته. وعن قرب فتة تبقي يدك بعيدة عن استشعار ثم أعتبر قرب وإزالته.
الآن قم بتشغيل الزر لوضعه في وضع استشعار اللون وأخذ الأشياء الحمراء والزرقاء والخضراء واحدة تلو الأخرى بالقرب من المستشعر. ستتم طباعة لون الكائن.