جدول المحتويات:
- الخطوة 1: نظرة عامة على الدائرة
- الخطوة 2: نظرة عامة على البرنامج
- الخطوة 3: اختبار جهاز الاستشعار بالإيماءات غير المحظور APDS9960
- الخطوة 4: الخاتمة
- الخطوة 5: المراجع
فيديو: تنفيذ مستشعر الإيماءات APDS9960 غير المحجوب: 5 خطوات
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:40
الديباجة
يوضح هذا 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 قبالة ATMega328P هنا
- 1 قبالة PCF8574P هنا
- 6 من 10 كيلو مقاومات هنا
- 4 من 1 كيلو مقاومات هنا
- 1 من 1N914 ديود هنا
- 1 قبالة PN2222 NPN الترانزستور هنا
- 1 قبالة الكريستال 16 ميجا هرتز هنا
- 2 قبالة 0.1 فائق التوهج المكثفات هنا
- 1 من 1000 فائق التوهج المكثف كهربائيا هنا
- 1 من 10 فائق التوهج كهربائيا مكثف هنا
- 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 مزودة بـ + 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
موصى به:
قياس مسافة القرب باستخدام مستشعر الإيماءات APDS9960: 6 خطوات
قياس مسافة القرب باستخدام مستشعر الإيماءات APDS9960: في هذا البرنامج التعليمي سوف نتعلم كيفية قياس المسافة باستخدام مستشعر الإيماءات APDS9960 و arduino و Visuino. شاهد الفيديو
كيفية استخدام مستشعر إيماءات APDS9960 مع Arduino: 7 خطوات
كيفية استخدام مستشعر إيماءات APDS9960 مع Arduino: في هذا البرنامج التعليمي سوف نتعلم كيفية استخدام مستشعر إيماءات APDS9960 مع Arduino لعرض اتجاهات اليد على شاشة OLED باستخدام برنامج Visuino. شاهد الفيديو
تنفيذ أجهزة TicTacToe باستخدام RaspberryPi: 4 خطوات
تنفيذ أجهزة TicTacToe باستخدام RaspberryPi: يهدف هذا المشروع إلى بناء نموذج TicTacToe تفاعلي باستخدام اثنين من مصابيح LED الملونة المختلفة للدلالة على اللاعبين اللذين يستخدمان raspberry pi. كانت الفكرة هنا هي تنفيذ هذا على نطاق أوسع في زقاق - تخيل شبكة من 3x3 شبه كروية (li
التحكم في حلقة LED من Neopixel باستخدام مستشعر الإيماءات: 3 خطوات (بالصور)
التحكم في حلقة Neopixel Led باستخدام مستشعر الإيماءات: في هذا البرنامج التعليمي سنلعب باستخدام مستشعر الإيماءات (APDS-9960) وحلقة neopixel لمعرفة كيفية دمجهما معًا باستخدام Arduino UNO. إيماءات اليسار - اليمين من خلال تحريك حركة يقودها اليمين أو اليسار ، وإلى u
كيفية تنفيذ Java 3D: 14 خطوة
Java 3D How-to: امتلاك كائن ثلاثي الأبعاد يمكنك تدويره وتصغيره وتحريكه على صفحة ويب أمر رائع … لكن Java 3D ليس من السهل معرفة كيفية تشغيله! كل ذلك موجود هناك ، فقط انظر ملف Pdf ! شاهد أيضًا مقاطع الفيديو الخاصة بي على YouTube! Edgar Inventor … لكنني سأذهب خطوة بخطوة في inst