विषयसूची:

नॉनब्लॉकिंग APDS9960 जेस्चर सेंसर कार्यान्वयन: 5 चरण
नॉनब्लॉकिंग APDS9960 जेस्चर सेंसर कार्यान्वयन: 5 चरण

वीडियो: नॉनब्लॉकिंग APDS9960 जेस्चर सेंसर कार्यान्वयन: 5 चरण

वीडियो: नॉनब्लॉकिंग APDS9960 जेस्चर सेंसर कार्यान्वयन: 5 चरण
वीडियो: Finexus: Tracking Precise Motions of Multiple Fingertips Using Magnetic Sensing 2024, जुलाई
Anonim
नॉनब्लॉकिंग APDS9960 जेस्चर सेंसर कार्यान्वयन
नॉनब्लॉकिंग APDS9960 जेस्चर सेंसर कार्यान्वयन
नॉनब्लॉकिंग APDS9960 जेस्चर सेंसर कार्यान्वयन
नॉनब्लॉकिंग APDS9960 जेस्चर सेंसर कार्यान्वयन
नॉनब्लॉकिंग APDS9960 जेस्चर सेंसर कार्यान्वयन
नॉनब्लॉकिंग APDS9960 जेस्चर सेंसर कार्यान्वयन

प्रस्तावना

यह निर्देश योग्य विवरण देता है कि SparkFun_APDS-9960_Sensor_Arduino_Library का उपयोग करके APDS9960 जेस्चर सेंसर का गैर-अवरुद्ध कार्यान्वयन कैसे बनाया जाए।

परिचय

तो आप शायद खुद से पूछ रहे हैं कि नॉन-ब्लॉकिंग क्या है? या उस बात के लिए अवरुद्ध भी?

इससे भी महत्वपूर्ण बात यह है कि गैर-अवरुद्ध कुछ भी सही होना क्यों महत्वपूर्ण है?

ठीक है, इसलिए जब एक माइक्रोप्रोसेसर एक प्रोग्राम चलाता है तो यह क्रमिक रूप से कोड की पंक्तियों को निष्पादित करता है और ऐसा करने पर कॉल करता है और उस क्रम के अनुसार फ़ंक्शन से वापस आता है जिसमें आपने उन्हें लिखा था।

एक अवरुद्ध कॉल किसी भी प्रकार की कार्यक्षमता के लिए केवल एक कॉल है जो निष्पादन को रोकने का कारण बनती है, जिसका अर्थ है एक फ़ंक्शन कॉल जहां कॉल करने वाला फ़ंक्शन निष्पादित होने तक निष्पादन को फिर से शुरू नहीं करेगा।

तो यह इतना जरूरी क्यों है?

उस मामले में जहां आपने कुछ कोड लिखा है, जिसमें नियमित रूप से बहुत सारे कार्यों को क्रमिक रूप से निष्पादित करने की आवश्यकता होती है जैसे कि तापमान पढ़ना, एक बटन पढ़ना और एक डिस्प्ले को अपडेट करना, क्या डिस्प्ले को अपडेट करने के लिए कोड एक ब्लॉकिंग कॉल होना चाहिए, आपका सिस्टम अनुत्तरदायी होगा बटन दबाता है और तापमान में परिवर्तन होता है, क्योंकि प्रोसेसर अपना सारा समय डिस्प्ले के अपडेट होने और बटन की स्थिति या नवीनतम तापमान को नहीं पढ़ने में व्यतीत करेगा।

मेरे हिस्से के लिए मैं वाईफाई सक्षम आईओटी डेस्कटॉप डिवाइस पर एक एमक्यूटीटी बनाना चाहता हूं जो स्थानीय और दूरस्थ अस्थायी/आर्द्रता मान, परिवेश प्रकाश स्तर, बैरोमेट्रिक दबाव दोनों को पढ़ता है, समय का ट्रैक रखता है, एलसीडी पर इन सभी मानकों को प्रदर्शित करता है, यूएसडी में लॉग इन करता है वास्तविक समय में कार्ड, बटन इनपुट पढ़ें, आउटपुट एलईडी को लिखें और मेरे IoT बुनियादी ढांचे में चीजों को नियंत्रित करने के लिए इशारों की निगरानी करें और इन सभी को एक ESP8266-12 द्वारा नियंत्रित किया जाना है।

दुर्भाग्य से APDS9960 लाइब्रेरी के केवल दो स्रोत जो मुझे मिल सकते थे, वे थे SparkFun और AdaFruit लाइब्रेरी, दोनों ही Avago (ADPS9960 निर्माता) के एप्लिकेशन कोड से फट गए और उनके पास 'readGesture' नाम का एक कॉल है जिसमें कुछ समय (1) {} शामिल है; लूप जो जब उपरोक्त प्रोजेक्ट में उपयोग किया जाता है तो ESP8266-12E को रीसेट करने का कारण बनता है जब भी ADPS9960 सेंसर संतृप्त हो जाता है (अर्थात जब कोई वस्तु निकटता में रहती है, या सेंसर को रोशन करने वाला कोई अन्य IR स्रोत था)।

नतीजतन इस व्यवहार को हल करने के लिए मैंने इशारों के प्रसंस्करण को दूसरे प्रोसेसर में स्थानांतरित करना चुना जिससे ईएसपी 8266-12 ई मास्टर माइक्रोकंट्रोलर बन गया और यह सिस्टम दास, जैसा कि ऊपर चित्र 1 और 2 में दिखाया गया है, सिस्टम अवलोकन और सिस्टम संरचना आरेख क्रमशः. Pic 3 प्रोटोटाइप सर्किट दिखाता है।

अपने मौजूदा कोड में किए जाने वाले परिवर्तनों को सीमित करने के लिए मैंने 'APDS9960_NonBlocking' नाम से एक रैपर क्लास/लाइब्रेरी भी लिखी।

गैर-अवरुद्ध समाधान का विस्तृत विवरण इस प्रकार है।

मुझे किन भागों की आवश्यकता है?

यदि आप I2C समाधान का निर्माण करना चाहते हैं जो APDS9960_NonBlocking लाइब्रेरी के साथ काम करता है, तो आपको निम्नलिखित भागों की आवश्यकता होगी।

  1. ATMega328P पर 1 छूट यहाँ
  2. यहाँ PCF8574P पर 1 छूट
  3. यहाँ १० के प्रतिरोधों में से ६
  4. यहाँ 1K प्रतिरोधों से 4 दूर
  5. यहाँ 1N914 डायोड से 1
  6. 1 यहाँ PN2222 NPN ट्रांजिस्टर बंद है
  7. यहां 16 मेगाहर्ट्ज क्रिस्टल पर 1 बंद करें
  8. 0.1uF कैपेसिटर से 2 यहाँ
  9. यहां 1000uF इलेक्ट्रोलाइटिक कैपेसिटर पर 1 छूट
  10. 10uF इलेक्ट्रोलाइटिक कैपेसिटर से 1 यहां
  11. 22pF कैपेसिटर से 2 यहाँ

यदि आप समानांतर इंटरफ़ेस के माध्यम से जेस्चर सेंसर आउटपुट पढ़ना चाहते हैं तो आप PCF8574P और तीन बंद 10K प्रतिरोधों को छोड़ सकते हैं।

मुझे किस सॉफ्टवेयर की आवश्यकता है?

अरुडिनो आईडीई 1.6.9

मुझे क्या कौशल चाहिए?

सिस्टम को स्थापित करने के लिए, स्रोत कोड (प्रदान किया गया) का उपयोग करें और आवश्यक सर्किटरी बनाएं जिसकी आपको आवश्यकता होगी;

  • इलेक्ट्रॉनिक्स की एक न्यूनतम समझ,
  • Arduino और उसके IDE का ज्ञान,
  • एक एम्बेडेड Arduino को प्रोग्राम करने की समझ (निर्देश देखें 'ATTiny85, ATTiny84 और ATMega328P: Arduino As ISP' प्रोग्रामिंग देखें)
  • कुछ धैर्य।

शामिल विषय

  • सर्किट का संक्षिप्त अवलोकन
  • सॉफ्टवेयर का संक्षिप्त अवलोकन
  • APDS9960 जेस्चर सेंसिंग डिवाइस का परीक्षण
  • निष्कर्ष
  • संदर्भ

चरण 1: सर्किट अवलोकन

सर्किट अवलोकन
सर्किट अवलोकन

सर्किट को दो खंडों में बांटा गया है;

  • पहला सीरियल I2C है जो प्रतिरोधों R8…10 और IC1 के माध्यम से समानांतर रूपांतरण के लिए पूरा किया जाता है। यहाँ R8…R10 ने 8 बिट I/O विस्तारक चिप IC1 और NXP PCF8574A के लिए I2C पता सेट किया है। इस डिवाइस के लिए वैलिड एड्रेस रेंज क्रमशः 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 को संलग्न FTDI डिवाइस की DTR लाइन पर एक पल्स के माध्यम से U1 को स्वचालित रूप से प्रोग्राम करने की अनुमति देते हैं।
    • R5 और R6, APDS9960 के लिए I2C पुल अप रेसिस्टर्स हैं, जिनमें C6 स्थानीय आपूर्ति रेल डिकूपिंग प्रदान करता है।
    • U1, C1, C2 और Q1 क्रमशः एम्बेडेड Arduino Uno और इसकी घड़ी बनाते हैं।
    • अंत में C3 और C4 U1 के लिए स्थानीय आपूर्ति रेल डिकूपिंग प्रदान करते हैं।

चरण 2: सॉफ्टवेयर अवलोकन

सॉफ्टवेयर अवलोकन
सॉफ्टवेयर अवलोकन
सॉफ्टवेयर अवलोकन
सॉफ्टवेयर अवलोकन
सॉफ्टवेयर अवलोकन
सॉफ्टवेयर अवलोकन

प्रस्तावना

इस स्रोत कोड को सफलतापूर्वक संकलित करने के लिए आपको एम्बेडेड Arduino Uno U1 को प्रोग्राम करने के लिए निम्नलिखित अतिरिक्त पुस्तकालयों की आवश्यकता होगी;

SparkFun_APDS9960.h

  • द्वारा: स्टीव क्विन
  • उद्देश्य: यह स्पार्कफन APDS9960 सेंसर का एक कांटा संस्करण है जिसे jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library से फोर्क किया गया है। डिबग में मदद करने के लिए इसमें कुछ संशोधन हैं और नकली ट्रिगरिंग को कम करने के लिए एक डी-सेंसिटाइज़्ड डिटेक्टर है।
  • से:

APDS9960_NonBlocking.h

  • द्वारा: स्टीव क्विन
  • उद्देश्य: APDS9960 जेस्चर सेंसर के इस गैर-अवरुद्ध कार्यान्वयन को आपके Arduino कोड में एम्बेड करने के लिए एक स्वच्छ इंटरफ़ेस प्रदान करता है।
  • से:

यदि आप इसे प्राप्त करने के तरीके से परिचित नहीं हैं, तो एक एम्बेडेड Arduino Uno (ATMega328P) माइक्रोकंट्रोलर को प्रोग्राम करने के तरीके के बारे में निम्नलिखित निर्देश देखें;

ATTINY85, ATTINY84 और ATMEGA328P की प्रोग्रामिंग: ARDUINO AS ISP

कार्यात्मक अवलोकन

ATMega328P एम्बेडेड स्लेव माइक्रोकंट्रोलर ADPS9960 से INT लाइन को पोल करता है। जब यह रेखा कम हो जाती है तो माइक्रोकंट्रोलर ADPS9960 रजिस्टरों को पढ़ता है और निर्धारित करता है कि क्या कोई वैध इशारा महसूस किया गया है। यदि एक वैध जेस्चर का पता चला है, तो इस जेस्चर के लिए कोड 0x0…0x6, 0xF को पोर्ट B पर रखा गया है और 'nGestureAvailable' को कम बताया गया है।

जब मास्टर डिवाइस 'nGestureAvailable' को सक्रिय देखता है, तो यह पोर्ट B पर मान पढ़ता है और फिर डेटा की प्राप्ति को स्वीकार करने के लिए 'nGestureClear' को अस्थायी रूप से कम करता है।

स्लेव डिवाइस तब 'nGestureAvailable' को उच्च स्तर पर डि-एसर्ट करता है और पोर्ट B पर डेटा को साफ़ करता है। ऊपर Pic 5 एक पूर्ण पता लगाने/पढ़ने के चक्र के दौरान एक लॉजिक एनालाइज़र से लिया गया स्क्रीन ग्रैब दिखाता है।

कोड अवलोकन

Pic 1 ऊपर विवरण देता है कि कैसे U1 में सॉफ्टवेयर एम्बेडेड गुलाम Arduino Uno कार्य करता है, साथ ही Pic 2 कैसे दो पृष्ठभूमि/अग्रभूमि कार्य इंटरैक्ट करता है। Pic 3 एक कोड खंड है जो बताता है कि APDS9960_NonBlockingLibrary का उपयोग कैसे किया जाता है। Pic 4 ATMega328P पर Arduino Uno Digital Pins और वास्तविक हार्डवेयर पिन के बीच मैपिंग देता है।

एम्बेडेड स्लेव माइक्रोकंट्रोलर को रीसेट करने के बाद APDS9960 को अपने INT आउटपुट को ट्रिगर करने के लिए जेस्चर डिटेक्शन की अनुमति देता है और वेक्टर INT0 (डिजिटल पिन 2, हार्डवेयर IC पिन 4) को बाधित करने के लिए इंटरप्ट सर्विस रूटीन (ISR) 'GESTURE_CLEAR ()' को संलग्न करते हुए I/O को कॉन्फ़िगर करता है।, इसे गिरते किनारे के ट्रिगर के लिए कॉन्फ़िगर करना। यह मास्टर डिवाइस से nGestureClear इनपुट बनाता है।

APDS9960 से इंटरप्ट आउटपुट पिन 'INT' डिजिटल पिन 4, हार्डवेयर IC पिन 6 से जुड़ा है जिसे U1 के इनपुट के रूप में कॉन्फ़िगर किया गया है।

डिजिटल पिन 7, हार्डवेयर IC पिन 13 पर 'nGestureAvailable' सिग्नल लाइन को आउटपुट के रूप में कॉन्फ़िगर किया गया है और उच्च, निष्क्रिय (डी-एस्सर्टेड) सेट किया गया है।

अंत में पोर्ट बी बिट्स 0…3 क्रमशः आउटपुट के रूप में कॉन्फ़िगर किया गया है और कम सेट किया गया है। ये डेटा कुतरने का निर्माण करते हैं जो विभिन्न ज्ञात हावभाव प्रकारों का प्रतिनिधित्व करता है; कोई नहीं = 0x0, त्रुटि = 0xF, ऊपर = 0x1, नीचे = 0x2, बायां = 0x3, दायां = 0x4, निकट = 0x5 और दूर = 0x6।

बैकग्राउंड टास्क 'लूप' शेड्यूल किया गया है जो डिजिटल पिन 4 पढ़ने के माध्यम से APDS9960 इंटरप्ट आउटपुट INT को लगातार पोल करता है। जब APDS9960 से INT आउटपुट सक्रिय कम हो जाता है, यह दर्शाता है कि सेंसर चालू हो गया है, माइक्रोकंट्रोलर 'readGesture' को कॉल करके किसी भी जेस्चर की व्याख्या करने की कोशिश करता है।)' इसके साथ है जबकि (1) {}; अंतहीन पाश।

यदि एक वैध जेस्चर का पता लगाया गया है, तो यह मान पोर्ट बी को लिखा जाता है, 'nGestureAvailable' आउटपुट पर जोर दिया जाता है और बूलियन सेमाफोर 'bGestureAvailable' सेट किया जाता है, जिससे आगे के जेस्चर को लॉग होने से रोका जा सके।

एक बार जब मास्टर सक्रिय 'nGestureAvailable' आउटपुट का पता लगा लेता है तो यह इस नए मान को पढ़ता है और दालों 'nGestureClear' को सक्रिय कम करता है। यह गिरता हुआ किनारा अग्रभूमि कार्य 'ISR GESTURE_CLEAR ()' को पृष्ठभूमि कार्य 'लूप' के निष्पादन को निलंबित करने के लिए ट्रिगर करता है, पोर्ट B, 'bGestureAvailable' सेमाफोर और 'nGestureAvailable' आउटपुट को साफ़ करता है।

अग्रभूमि कार्य 'GESTURE_CLEAR ()' अब निलंबित कर दिया गया है और पृष्ठभूमि कार्य 'लूप' को फिर से शेड्यूल किया गया है। APDS9960 से आगे के इशारों को अब महसूस किया जा सकता है।

इस तरह से इंटरप्ट ट्रिगर किए गए अग्रभूमि/पृष्ठभूमि कार्यों का उपयोग करके स्लेव डिवाइस के 'रीड जेस्चर ()' में संभावित अनंत लूप मास्टर डिवाइस को संचालन से प्रभावित नहीं करेगा और स्लेव डिवाइस के निष्पादन को भी बाधित नहीं करेगा। यह एक बहुत ही सरल रीयल टाइम ऑपरेटिंग सिस्टम (RTOS) का आधार बनता है।

नोट: उपसर्ग 'n' का अर्थ है सक्रिय कम या 'nGestureAvailable' के रूप में मुखर

चरण 3: नॉनब्लॉकिंग APDS9960 जेस्चर सेंसिंग डिवाइस का परीक्षण

नॉनब्लॉकिंग APDS9960 जेस्चर सेंसिंग डिवाइस का परीक्षण
नॉनब्लॉकिंग APDS9960 जेस्चर सेंसिंग डिवाइस का परीक्षण
नॉनब्लॉकिंग APDS9960 जेस्चर सेंसिंग डिवाइस का परीक्षण
नॉनब्लॉकिंग APDS9960 जेस्चर सेंसिंग डिवाइस का परीक्षण
नॉनब्लॉकिंग APDS9960 जेस्चर सेंसिंग डिवाइस का परीक्षण
नॉनब्लॉकिंग APDS9960 जेस्चर सेंसिंग डिवाइस का परीक्षण
नॉनब्लॉकिंग APDS9960 जेस्चर सेंसिंग डिवाइस का परीक्षण
नॉनब्लॉकिंग APDS9960 जेस्चर सेंसिंग डिवाइस का परीक्षण

प्रस्तावना

भले ही APDS9960 मॉड्यूल +5v के साथ आपूर्ति की जाती है, यह एक ऑन-बोर्ड +3v3 नियामक का उपयोग करता है जिसका अर्थ है कि यह I2C लाइनें +3v3 अनुरूप हैं और +5v नहीं। यही कारण है कि मैंने स्तर शिफ्टर्स की आवश्यकता को कम करने के लिए परीक्षण माइक्रो नियंत्रक के रूप में +3v3 अनुरूप Arduino देय का उपयोग करना चुना।

हालाँकि, यदि आप एक वास्तविक Arduino Uno का उपयोग करना चाहते हैं, तो आपको I2C लाइनों को U1 में स्थानांतरित करने की आवश्यकता होगी। निम्नलिखित निर्देश देखें जहां मैंने एक उपयोगी स्लाइड सेट (I2C_LCD_With_Arduino) संलग्न किया है जो I2C का उपयोग करने के लिए बहुत सारे व्यावहारिक सुझाव देता है।

I2C इंटरफ़ेस परीक्षण

ऊपर दिए गए चित्र 1 और 2 दिखाते हैं कि I2C इंटरफ़ेस के लिए सिस्टम को कैसे सेट अप और प्रोग्राम किया जाए। आपको पहले APDS9960_NonBlocking लाइब्रेरी को डाउनलोड और इंस्टॉल करना होगा। यहां

समानांतर इंटरफ़ेस परीक्षण

Pics 3 और 4 समानांतर इंटरफ़ेस के लिए समान विवरण देते हैं

चरण 4: निष्कर्ष

निष्कर्ष
निष्कर्ष

आम

कोड अच्छी तरह से काम करता है और बिना किसी झूठी सकारात्मकता के प्रतिक्रियात्मक रूप से इशारों का पता लगाता है। यह मेरे अगले प्रोजेक्ट में स्लेव डिवाइस के रूप में कुछ हफ्तों से चल रहा है और चल रहा है। मैंने कई अलग-अलग विफलता मोड की कोशिश की है (और इसलिए जिज्ञासु क्विन घरेलू मोगी है) जिसके परिणामस्वरूप पहले ईएसपी 8266-12 रीसेट हुआ, जिसका कोई नकारात्मक प्रभाव नहीं था।

संभावित सुधार

  • स्पष्ट। गैर-अवरुद्ध होने के लिए APDS9960 जेस्चर सेंसर लाइब्रेरी को फिर से लिखें।

    वास्तव में मैंने ब्रॉडकॉम से संपर्क किया, जिसने मुझे एक स्थानीय वितरक के पास भेजा, जिसने समर्थन के लिए मेरे अनुरोध को तुरंत अनदेखा कर दिया, मैं सिर्फ स्पार्कफन या एडाफ्रूट नहीं हूं, मुझे लगता है। तो शायद इसके लिए कुछ समय इंतजार करना होगा।

  • कोड को छोटे स्लेव माइक्रोकंट्रोलर में पोर्ट करें। एक कार्य के लिए ATMega328P का उपयोग करना थोड़ा अधिक है। हालाँकि मैंने शुरू में ATTiny84 को देखा था, लेकिन एक का उपयोग करना बंद कर दिया क्योंकि मुझे लगा कि कोड का संकलित आकार एक सीमा रेखा फिट था। एक अलग I2C पुस्तकालय के साथ काम करने के लिए APDS9960 पुस्तकालय को संशोधित करने के अतिरिक्त ओवरहेड के साथ।

चरण 5: संदर्भ

एम्बेडेड आर्डिनो (ATMega328P - U1) को प्रोग्राम करने के लिए आवश्यक है

SparkFun_APDS9960.h

  • द्वारा: स्टीव क्विन
  • उद्देश्य: यह स्पार्कफन APDS9960 सेंसर का एक कांटा संस्करण है जिसे jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library से फोर्क किया गया है। डिबग में मदद करने के लिए इसमें कुछ संशोधन हैं और नकली ट्रिगरिंग को कम करने के लिए एक डी-सेंसिटाइज़्ड डिटेक्टर है।
  • से:

इस गैर-अवरुद्ध कार्यक्षमता को अपने arduino कोड में एम्बेड करने और काम किए गए उदाहरण देने के लिए आवश्यक है

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

सिफारिश की: