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

تنفيذ مستشعر الإيماءات APDS9960 غير المحجوب: 5 خطوات
تنفيذ مستشعر الإيماءات APDS9960 غير المحجوب: 5 خطوات

فيديو: تنفيذ مستشعر الإيماءات APDS9960 غير المحجوب: 5 خطوات

فيديو: تنفيذ مستشعر الإيماءات APDS9960 غير المحجوب: 5 خطوات
فيديو: Implementing SCATD to Social Distancing Monitoring 2024, يوليو
Anonim
تنفيذ مستشعر الإيماءات APDS9960 غير المحظور
تنفيذ مستشعر الإيماءات APDS9960 غير المحظور
تنفيذ مستشعر الإيماءات APDS9960 غير المحظور
تنفيذ مستشعر الإيماءات APDS9960 غير المحظور
تنفيذ مستشعر الإيماءات APDS9960 غير المحظور
تنفيذ مستشعر الإيماءات APDS9960 غير المحظور

الديباجة

يوضح هذا Instructable كيفية إنشاء تطبيق غير معوق لـ APDS9960 Gesture Sensor باستخدام SparkFun_APDS-9960_Sensor_Arduino_Library.

مقدمة

لذا ربما تسأل نفسك ما هو عدم الحظر؟ أو حتى حظر لهذا الأمر؟

والأهم من ذلك ، لماذا من المهم أن يكون لديك أي شيء لا يحظر بشكل صحيح؟

حسنًا ، عندما يقوم المعالج الدقيق بتشغيل برنامج ما ، فإنه ينفذ سطورًا من التعليمات البرمجية بالتسلسل ، وبذلك يقوم بإجراء مكالمات إلى الوظائف والرجوع منها وفقًا للترتيب الذي كتبتها به.

استدعاء الحظر هو مجرد استدعاء لأي نوع من الوظائف التي تسبب توقف التنفيذ ، مما يعني استدعاء دالة حيث لن يستأنف المتصل التنفيذ حتى تنتهي الوظيفة التي تم استدعاؤها.

لذلك لماذا هذا مهم؟

في حالة كتابة بعض التعليمات البرمجية التي تحتاج إلى تنفيذ الكثير من الوظائف بشكل متسلسل بانتظام مثل قراءة درجة الحرارة وقراءة زر وتحديث العرض ، إذا كان الرمز لتحديث الشاشة عبارة عن مكالمة حظر ، فلن يستجيب نظامك لـ الضغط على الزر وتغيير درجة الحرارة ، حيث سيقضي المعالج كل وقته في انتظار تحديث الشاشة وعدم قراءة حالة الزر أو أحدث درجة حرارة.

من ناحيتي ، أرغب في إنشاء MQTT عبر جهاز سطح مكتب IoT قادر على WiFi والذي يقرأ قيم درجة الحرارة / الرطوبة المحلية والبعيدة ، ومستويات الإضاءة المحيطة ، والضغط الجوي ، وتتبع الوقت ، وعرض كل هذه المعلمات على شاشة LCD ، وتسجيل الدخول إلى uSD البطاقة في الوقت الفعلي ، وقراءة مدخلات الأزرار ، والكتابة إلى مصابيح LED للإخراج ومراقبة الإيماءات للتحكم في الأشياء في البنية التحتية لإنترنت الأشياء الخاصة بي والتي يجب التحكم فيها جميعًا بواسطة ESP8266-12.

لسوء الحظ ، كان المصدران الوحيدان لمكتبة APDS9960 اللذان استطعت العثور عليهما هما مكتبات SparkFun و AdaFruit ، وكلاهما مأخوذ من رمز التطبيق من Avago (الشركة المصنعة ADPS9960) ويمتلكان مكالمة باسم "readGesture" والتي تحتوي على فترة (1) {} ؛ الحلقة التي تؤدي عند استخدامها في المشروع أعلاه إلى إعادة تعيين ESP8266-12E عندما يصبح مستشعر ADPS9960 مشبعًا (أي عندما يظل كائن على مقربة ، أو كان هناك مصدر IR آخر يضيء المستشعر).

وبالتالي لحل هذا السلوك اخترت نقل معالجة الإيماءات إلى معالج ثانٍ حيث أصبح ESP8266-12E المتحكم الرئيسي وهذا النظام هو العبد ، كما هو موضح في الصورتين 1 و 2 أعلاه ، نظرة عامة على النظام ومخططات تكوين النظام على التوالي. تُظهر الصورة 3 مخطط النموذج الأولي.

من أجل الحد من التغييرات التي احتجت إلى إجرائها على الكود الخاص بي الحالي ، قمت أيضًا بكتابة فئة / مكتبة مجمعة باسم "APDS9960_NonBlocking".

ما يلي هو شرح مفصل لحل عدم الحظر.

ما الأجزاء التي أحتاجها؟

إذا كنت ترغب في إنشاء حل I2C الذي يعمل مع مكتبة APDS9960_NonBlocking ، فستحتاج إلى الأجزاء التالية.

  1. 1 قبالة ATMega328P هنا
  2. 1 قبالة PCF8574P هنا
  3. 6 من 10 كيلو مقاومات هنا
  4. 4 من 1 كيلو مقاومات هنا
  5. 1 من 1N914 ديود هنا
  6. 1 قبالة PN2222 NPN الترانزستور هنا
  7. 1 قبالة الكريستال 16 ميجا هرتز هنا
  8. 2 قبالة 0.1 فائق التوهج المكثفات هنا
  9. 1 من 1000 فائق التوهج المكثف كهربائيا هنا
  10. 1 من 10 فائق التوهج كهربائيا مكثف هنا
  11. 2 من مكثفات 22pF هنا

إذا كنت ترغب في قراءة إخراج مستشعر الإيماءات عبر الواجهة المتوازية ، فيمكنك إسقاط PCF8574P وثلاثة مقاومات 10K.

ما هو البرنامج الذي أحتاجه؟

Arduino IDE 1.6.9

ما المهارات التي احتاجها؟

لإعداد النظام ، استخدم الكود المصدري (المقدم) وأنشئ الدوائر الضرورية التي ستحتاج إلى ما يلي ؛

  • الحد الأدنى من الإلمام بالإلكترونيات ،
  • معرفة اردوينو و IDE ،
  • فهم كيفية برمجة Arduino مضمن (انظر التعليمات "برمجة ATTiny85 و ATTiny84 و ATMega328P: Arduino As ISP")
  • بعض الصبر.

المواضيع التي تمت تغطيتها

  • لمحة موجزة عن الدائرة
  • نظرة عامة موجزة عن البرنامج
  • اختبار جهاز استشعار الإيماءات APDS9960
  • استنتاج
  • مراجع

الخطوة 1: نظرة عامة على الدائرة

نظرة عامة على الدائرة
نظرة عامة على الدائرة

الدائرة مقسمة إلى قسمين ؛

  • الأول هو I2C التسلسلي إلى التحويل المتوازي الذي يتم عبر المقاومات R8 … 10 و IC1. هنا R8… R10 حدد عنوان I2C لشريحة I / O الموسعة 8 بت IC1 و NXP PCF8574A. نطاقات العناوين الصالحة لهذا الجهاز هي 0x38… 0x3F على التوالي. في مثال برنامج I2C المقدم يجب تغيير "I2C_APDS9960_TEST.ino" #define GESTURE_SENSOR_I2C_ADDRESS "ليناسب نطاق العنوان هذا.
  • جميع المكونات الأخرى تشكل عبيدًا مضمنًا في Arduino Uno ولها الوظائف التالية ؛

    • توفر R1 و T1 و R2 و D1 إدخال إعادة تعيين جهاز تابع. هنا نبضة عالية نشطة على IC1 - P7 ستجبر U1 على إعادة التعيين.
    • R3 ، R4 ، هي مقاومات مقيدة حالية لخطوط TX / RX لبرمجة الجهاز المضمّن.
    • يسمح C5 و R7 لـ Arduino IDE ببرمجة U1 تلقائيًا عبر نبضة على خط DTR لجهاز FTDI المرفق.
    • R5 و R6 هما مقاومات سحب I2C لـ APDS9960 مع C6 التي توفر فصلًا محليًا لسكك الإمداد.
    • تشكل U1 و C1 و C2 و Q1 Arduino Uno وساعتها على التوالي.
    • أخيرًا ، يوفر C3 و C4 فصلًا محليًا عن سكة الإمداد لـ U1.

الخطوة 2: نظرة عامة على البرنامج

نظرة عامة على البرنامج
نظرة عامة على البرنامج
نظرة عامة على البرنامج
نظرة عامة على البرنامج
نظرة عامة على البرنامج
نظرة عامة على البرنامج

الديباجة

لتجميع شفرة المصدر هذه بنجاح ، ستحتاج إلى المكتبات الإضافية التالية لبرمجة Arduino Uno U1 المضمن ؛

SparkFun_APDS9960.h

  • بقلم: ستيف كوين
  • الغرض: هذه نسخة متشعبة من مستشعر SparkFun APDS9960 متشعب من jonn26 / SparkFun_APDS-9960_Sensor_Arduino_Library. يحتوي على بعض التعديلات للمساعدة في التصحيح ويحتوي على كاشف غير حساس لتقليل التحفيز الزائف.
  • من:

APDS9960_NonBlocking.h

  • بقلم: ستيف كوين
  • الغرض: يوفر واجهة نظيفة لتضمين هذا التطبيق غير المحظور لمستشعر إيماءات APDS9960 في كود Arduino الخاص بك.
  • من:

راجع التعليمات التالية حول كيفية برمجة متحكم Arduino Uno (ATMega328P) المضمن إذا لم تكن على دراية بكيفية تحقيق ذلك ؛

برمجة ATTINY85 و ATTINY84 و ATMEGA328P: ARDUINO AS ISP

نظرة عامة وظيفية

يقوم متحكم الرقيق المضمن ATMega328P باستقصاء خط INT من ADPS9960. عندما ينخفض هذا الخط ، يقرأ المتحكم الدقيق سجلات ADPS9960 ويحدد ما إذا كانت هناك إيماءة صحيحة. إذا تم اكتشاف إيماءة صالحة ، فسيتم وضع رمز هذه الإيماءة 0x0… 0x6 ، 0xF على المنفذ B ويتم التأكيد على أن "nGestureAvailable" منخفض.

عندما يرى الجهاز الرئيسي "nGestureAvailable" نشط ، فإنه يقرأ القيمة الموجودة على المنفذ B ثم ينبض بـ "nGestureClear" منخفضًا مؤقتًا للإقرار باستلام البيانات.

يقوم الجهاز التابع بعد ذلك بإلغاء تأكيد "nGestureAvailable" على مستوى عالٍ ومسح البيانات الموجودة على المنفذ B. تُظهر الصورة 5 أعلاه لقطة شاشة مأخوذة من محلل منطقي أثناء دورة اكتشاف / قراءة كاملة.

نظرة عامة على التعليمات البرمجية

توضح الصورة 1 أعلاه كيفية عمل البرنامج الموجود في U1 على وظائف العبد المضمن Arduino Uno ، جنبًا إلى جنب مع Pic 2 كيف تتفاعل مهمتا الخلفية / المقدمة. Pic 3 عبارة عن مقطع رمز يحدد كيفية استخدام APDS9960_NonBlockinglibrary. يوفر Pic 4 تعيينًا بين Arduino Uno Digital Pins ودبابيس الأجهزة الفعلية على ATMega328P.

بعد إعادة تعيين وحدة التحكم الدقيقة المدمجة ، تقوم بتهيئة APDS9960 مما يسمح باكتشاف الإيماءات لتشغيل إخراج INT الخاص به وتكوين الإدخال / الإخراج الخاص به ، وإرفاق روتين خدمة المقاطعة (ISR) 'GESTURE_CLEAR ()' لمقاطعة المتجه INT0 (الدبوس الرقمي 2 ، دبوس الأجهزة 4) ، وتكوينه لمشغل حافة السقوط. هذا يشكل مدخلات nGestureClear من الجهاز الرئيسي.

يتم توصيل دبوس إخراج المقاطعة "INT" من APDS9960 بـ Digital Pin 4 ، جهاز IC Pin 6 الذي تم تكوينه كمدخل إلى U1.

يتم تكوين خط إشارة 'nGestureAvailable' على الرقم 7 الرقمي ، دبوس IC للأجهزة 13 كإخراج وضبط عالٍ ، غير نشط (غير مؤكد).

أخيرًا ، يتم تكوين بتات المنفذ B 0… 3 على التوالي كمخرجات وضبطها على قيمة منخفضة. هذه تشكل عضة البيانات التي تمثل أنواع الإيماءات المختلفة المكتشفة ؛ بلا = 0 × 0 ، الخطأ = 0 × 5 ، أعلى = 0 × 1 ، أسفل = 0 × 2 ، يسار = 0 × 3 ، يمين = 0 × 4 ، قريب = 0 × 5 ، بعيد = 0 × 6.

تمت جدولة مهمة الخلفية 'Loop' والتي تقوم باستمرار باستقصاء APDS9960 Interrupt output INT من خلال قراءة Digital Pin 4. عندما يصبح إخراج INT من APDS9960 نشطًا منخفضًا مما يشير إلى تشغيل المستشعر ، يحاول المتحكم الدقيق تفسير أي إيماءة عن طريق استدعاء 'readGesture () 'مع أنه بينما (1) {} ؛ حلقة غير منتهية.

إذا تم اكتشاف إيماءة صالحة ، تتم كتابة هذه القيمة إلى المنفذ B ، ويتم تأكيد إخراج "nGestureAvailable" وتعيين الإشارة المنطقية "bGestureAvailable" ، مما يمنع تسجيل أي إيماءات أخرى.

بمجرد أن يكتشف السيد ناتج "nGestureAvailable" النشط ، فإنه يقرأ هذه القيمة الجديدة وينبض بـ "nGestureClear" المنخفض النشط. تؤدي هذه الحافة المتساقطة إلى تشغيل المهمة الأمامية "ISR GESTURE_CLEAR ()" ليتم جدولتها لتعليق تنفيذ مهمة الخلفية "Loop" ، ومسح المنفذ B ، و "bGestureAvailable" semaphore وإخراج "nGestureAvailable".

تم الآن تعليق المهمة الأمامية "GESTURE_CLEAR ()" وإعادة جدولة مهمة الخلفية "Loop". يمكن الآن استشعار إيماءات أخرى من APDS9960.

باستخدام المقاطعة التي تم تشغيلها في مهام المقدمة / الخلفية بهذه الطريقة ، لن تؤثر الحلقة اللانهائية المحتملة في "readGesture ()" للجهاز التابع على الجهاز الرئيسي من التشغيل ولن تعيق تنفيذ الجهاز التابع أيضًا. يشكل هذا أساسًا لنظام تشغيل بسيط جدًا في الوقت الفعلي (RTOS).

ملاحظة: تعني البادئة "n" نشطة منخفضة أو مؤكدة كما في "nGestureAvailable"

الخطوة 3: اختبار جهاز الاستشعار بالإيماءات غير المحظور APDS9960

اختبار جهاز الاستشعار بالإيماءات بدون حظر APDS9960
اختبار جهاز الاستشعار بالإيماءات بدون حظر APDS9960
اختبار جهاز الاستشعار بالإيماءات بدون حظر APDS9960
اختبار جهاز الاستشعار بالإيماءات بدون حظر APDS9960
اختبار جهاز الاستشعار بالإيماءات بدون حظر APDS9960
اختبار جهاز الاستشعار بالإيماءات بدون حظر APDS9960
اختبار جهاز الاستشعار بالإيماءات بدون حظر APDS9960
اختبار جهاز الاستشعار بالإيماءات بدون حظر APDS9960

الديباجة

على الرغم من أن وحدة APDS9960 مزودة بـ + 5 فولت ، إلا أنها تستخدم منظمًا داخليًا + 3v3 مما يعني أن خطوط I2C متوافقة مع + 3v3 وليست + 5 فولت. هذا هو السبب في أنني اخترت استخدام Arduino Due المتوافق مع + 3v3 كوحدة تحكم اختبار صغيرة ، لتفادي الحاجة إلى مغيرات المستوى.

ومع ذلك ، إذا كنت ترغب في استخدام Arduino Uno فعليًا ، فستحتاج إلى تغيير مستوى خطوط I2C إلى U1. راجع التعليمات التالية حيث أرفقت مجموعة شرائح مفيدة (I2C_LCD_With_Arduino) والتي تقدم الكثير من النصائح العملية حول استخدام I2C.

اختبار واجهة I2C

توضح الصورتان 1 و 2 أعلاه كيفية إعداد وبرمجة النظام لواجهة I2C. ستحتاج إلى تنزيل مكتبة APDS9960_NonBlocking وتثبيتها أولاً. هنا

اختبار الواجهة المتوازية

تفاصيل الصورتين 3 و 4 هي نفسها للواجهة المتوازية

الخطوة 4: الخاتمة

استنتاج
استنتاج

عام

يعمل الكود جيدًا ويكشف الإيماءات بشكل متجاوب دون أي إيجابيات خاطئة. لقد تم تشغيله منذ بضعة أسابيع كجهاز تابع في مشروعي التالي. لقد جربت العديد من أوضاع الفشل المختلفة (وكذلك فعلت moggie Quinn المنزلية الفضولي) والتي أدت سابقًا إلى إعادة تعيين ESP8266-12 ، دون أي تأثير سلبي.

التحسينات الممكنة

  • الواضح. أعد كتابة مكتبة APDS9960 Gesture Sensor بحيث لا يتم حظرها.

    في الواقع ، اتصلت بشركة Broadcom التي وضعتني على موزع محلي تجاهل على الفور طلبي للحصول على الدعم ، فأنا لست SparkFun أو AdaFruit ، على ما أعتقد. لذلك من المحتمل أن ينتظر هذا بعض الوقت

  • انقل الكود إلى متحكم تابع أصغر. يعد استخدام ATMega328P لمهمة واحدة نوعًا من المبالغة. على الرغم من أنني نظرت في البداية إلى ATTiny84 ، إلا أنني توقفت عن استخدام واحد لأنني شعرت أن الحجم المترجم للشفرة كان مناسبًا لخط الحدود. مع الحمل الإضافي لضرورة تعديل مكتبة APDS9960 للعمل مع مكتبة I2C مختلفة.

الخطوة 5: المراجع

مطلوب لبرمجة اردوينو (ATMega328P - U1)

SparkFun_APDS9960.h

  • بقلم: ستيف كوين
  • الغرض: هذه نسخة متشعبة من مستشعر SparkFun APDS9960 متشعب من jonn26 / SparkFun_APDS-9960_Sensor_Arduino_Library. يحتوي على بعض التعديلات للمساعدة في التصحيح ويحتوي على كاشف غير حساس لتقليل التحفيز الزائف.
  • من:

مطلوب لتضمين هذه الوظيفة غير المحظورة في كود اردوينو الخاص بك وإعطاء أمثلة عملية

APDS9960_NonBlocking.h

  • بقلم: ستيف كوين
  • الغرض: يوفر واجهة نظيفة لتضمين هذا التطبيق غير المحظور لمستشعر إيماءات APDS9960 في كود Arduino الخاص بك.
  • من:

نظام تشغيل في الوقت الحقيقي

https://en.wikipedia.org/wiki/Real-time_operating_system

ورقة بيانات APDS9960

https://cdn.sparkfun.com/assets/learn_tutorials/3/2/1/Avago-APDS-9960-datasheet.pdf

موصى به: