विषयसूची:

Arduino RF सेंसर डिकोडर: 5 कदम
Arduino RF सेंसर डिकोडर: 5 कदम

वीडियो: Arduino RF सेंसर डिकोडर: 5 कदम

वीडियो: Arduino RF सेंसर डिकोडर: 5 कदम
वीडियो: RF MODULE with Arduino | How does work RF MODULE | RF MODULE Transmitter and Receiver [With Code] 2024, नवंबर
Anonim
Arduino RF सेंसर डिकोडर
Arduino RF सेंसर डिकोडर

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

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

चरण 1: सेंसर मॉड्यूल

सेंसर मॉड्यूल
सेंसर मॉड्यूल
सेंसर मॉड्यूल
सेंसर मॉड्यूल
सेंसर मॉड्यूल
सेंसर मॉड्यूल
सेंसर मॉड्यूल
सेंसर मॉड्यूल

जैसा कि आप ऊपर की तस्वीरों में देख सकते हैं कि ट्रांसमीटर में डोर ओपन सेंसर, मोशन डिटेक्टर, आर्मिंग रिमोट और अलार्म बॉक्स की प्रोग्रामिंग के लिए इस्तेमाल किया जाने वाला वायरलेस कीपैड शामिल है। जैसा कि यह पता चला है, इनमें से कोई भी दो डिवाइस समान सिंक लंबाई या बिट अवधि का उपयोग नहीं करते हैं। संदेश की लंबाई के अलावा एकमात्र समानता, बिट्स का मूल स्वरूप है। प्रत्येक बिट एक निश्चित समयावधि लेता है जिसमें शून्य और एक के बीच का अंतर उच्च/निम्न भागों का कर्तव्य चक्र होता है।

ऊपर दिखाया गया सुंदर तरंग वह नहीं है जो मुझे पहली बार मिला था। क्योंकि 433-मेगाहर्ट्ज फ़्रीक्वेंसी बैंड में बहुत अधिक ट्रैफ़िक है, इसलिए मुझे एक ट्रिगर करने की गुंजाइश निर्धारित करने से ठीक पहले सेंसर को सक्रिय करना सुनिश्चित करना था। सौभाग्य से सेंसर सक्रिय होने पर डेटा संदेश की कई प्रतियां निकाल देते हैं और रिमोट और कीपैड संदेशों को तब तक आउटपुट करना जारी रखते हैं जब तक कि एक कुंजी दबाया जाता है। दायरे का उपयोग करके मैं प्रत्येक आइटम के लिए सिंक लंबाई और डेटा बिट अवधि निर्धारित करने में सक्षम था। जैसा कि पहले उल्लेख किया गया है, सिंक का समय अलग है और बिट समय अलग है लेकिन संदेश प्रारूपों में निम्न स्तर का सिंक होता है जिसके बाद 24 डेटा बिट्स और एक स्टॉप बिट होता है। यह मेरे लिए पर्याप्त था कि मैं प्रत्येक डिवाइस के लिए सभी अलग-अलग विवरणों को हार्ड कोड किए बिना सॉफ़्टवेयर में एक सामान्य डिकोडर बनाने में सक्षम हो सकूं।

चरण 2: हार्डवेयर

हार्डवेयर
हार्डवेयर
हार्डवेयर
हार्डवेयर

मैंने मूल रूप से एक PIC माइक्रोकंट्रोलर और असेंबली भाषा का उपयोग करके एक सेंसर डिकोडर बनाया था। मैं हाल ही में Arduino वेरिएंट के साथ खेल रहा हूं इसलिए मैंने सोचा कि मैं देखूंगा कि क्या मैं इसे दोहरा सकता हूं। सरल योजनाबद्ध ऊपर दिखाया गया है और मेरे प्रोटोटाइप की एक तस्वीर भी है। मैंने केवल Arduino नैनो से RF रिसीवर बोर्ड में जाने के लिए तीन सामान्य जम्पर तारों का उपयोग किया था। पावर और सिंगल डेटा लाइन की जरूरत है।

यदि आप "3-इन -1 टाइम एंड वेदर डिस्प्ले" पर मेरे इंस्ट्रक्शनल को पढ़ते हैं, तो आप देखेंगे कि मैं एक सामान्य RXB6, 433-मेगाहर्ट्ज रिसीवर का उपयोग करता हूं। आप इस परियोजना के लिए आवश्यक कम दूरी पर काम करने के लिए वास्तव में सस्ते रिसीवर प्राप्त करने में सक्षम हो सकते हैं लेकिन मैं अभी भी एक सुपर-हेटरोडाइन रिसीवर का उपयोग करने की सलाह देता हूं।

चरण 3: सॉफ्टवेयर

सॉफ्टवेयर प्राप्त बिट्स को प्रदर्शित करने योग्य ASCII वर्णों में परिवर्तित करता है। यह सिंक की लंबाई और 1 और 0 बिट्स की लंबाई के मान को आउटपुट करता है। क्योंकि मैं पहले से ही सिंक की लंबाई और बिट प्रारूपों को जानता था, मैं विशेष रूप से उनके लिए सॉफ्टवेयर लिख सकता था। इसके बजाय, मैंने यह देखने का फैसला किया कि क्या मैं इसे सिंक लंबाई को हल करने और डेटा बिट्स को स्वचालित रूप से समझने के लिए लिख सकता हूं। अगर मैं किसी समय अन्य प्रारूपों का पता लगाने की कोशिश करना चाहता हूं तो इससे इसे संशोधित करना आसान हो जाना चाहिए। यह ध्यान रखना महत्वपूर्ण है कि सॉफ़्टवेयर यह नहीं जानता है कि संदेश का पहला बिट 1 या 0 है। यह मानता है कि यह 1 है, लेकिन अगर यह पता चलता है कि यह शून्य होना चाहिए, तो यह उलट जाएगा सीरियल पोर्ट को भेजने से पहले पूर्ण संदेश में बिट्स।

सिंक पल्स और डेटा बिट्स का समय एक इंटरप्ट हैंडलर को ट्रिगर करने के लिए INT0 बाहरी इंटरप्ट इनपुट का उपयोग करके निर्धारित किया जाता है। INT0 उठने, गिरने या दोनों किनारों पर या स्थिर निम्न-स्तर पर ट्रिगर हो सकता है। सॉफ्टवेयर दोनों किनारों पर बाधित हो जाता है और पल्स कम रहने की मात्रा को मापता है। यह चीजों को सरल करता है क्योंकि संदेश प्रारंभ/सिंक एक निम्न-स्तरीय पल्स है और बिट्स को उनके निम्न-स्तरीय समय के आधार पर निर्धारित किया जा सकता है।

इंटरप्ट हैंडलर पहले यह निर्धारित करता है कि कैप्चर की गई गिनती स्टार्ट/सिंक पल्स होने के लिए काफी लंबी है या नहीं। मेरे पास 4, 9, 10 और 14 मिलीसेकंड के सिंक पल्स का उपयोग करने वाले विभिन्न उपकरण हैं। न्यूनतम/अधिकतम अनुमत सिंक मानों के लिए परिभाषित विवरण सॉफ़्टवेयर में सामने हैं और वर्तमान में 3 और 16 मिलीसेकंड के लिए सेट हैं। बिट समय भी सेंसर के बीच भिन्न होता है इसलिए डिकोडिंग बिट्स के लिए एल्गोरिदम को इसे ध्यान में रखना होगा। पहले बिट का बिट समय बाद के बिट के समय के रूप में सहेजा जाता है जिसमें पहले बिट से महत्वपूर्ण अंतर होता है। बाद के बिट समय की प्रत्यक्ष तुलना संभव नहीं है इसलिए "फज कारक" परिभाषित ("भिन्नता") का उपयोग किया जाता है। बिट डिकोडिंग यह मानकर शुरू होती है कि पहला डेटा बिट हमेशा एक तर्क 1 के रूप में दर्ज किया जाता है। वह मान सहेजा जाता है और फिर बाद के बिट्स का परीक्षण करने के लिए उपयोग किया जाता है। यदि बाद की डेटा बिट गणना सहेजे गए मान के विचरण विंडो के भीतर है तो इसे तर्क 1 के रूप में भी दर्ज किया जाता है। यदि यह सहेजे गए मान के विचरण विंडो के बाहर है तो इसे तर्क 0 के रूप में दर्ज किया जाता है। यदि तर्क 0 बिट टाइम पहले बिट टाइम से छोटा होता है, फिर सॉफ्टवेयर को यह बताने के लिए एक फ्लैग सेट किया जाता है कि प्रदर्शित होने से पहले बाइट्स को उल्टा करने की आवश्यकता है। एकमात्र मामला जहां यह एल्गोरिदम विफल हो जाता है, जब किसी संदेश में बिट्स सभी 0 होते हैं। हम उस सीमा को स्वीकार कर सकते हैं क्योंकि उस तरह का संदेश निरर्थक है।

जिन सेंसरों में मेरी दिलचस्पी है, उनमें संदेश की लंबाई 24 डेटा बिट्स है, लेकिन सॉफ्टवेयर उस लंबाई तक सीमित नहीं है। सात बाइट्स तक के लिए एक बफर है (अधिक जोड़ा जा सकता है) और बाइट्स में न्यूनतम और अधिकतम संदेश लंबाई के लिए परिभाषित करता है। सॉफ्टवेयर बिट्स को इकट्ठा करने, उन्हें बाइट्स में बदलने, उन्हें अस्थायी रूप से स्टोर करने और फिर उन्हें सीरियल पोर्ट के माध्यम से ASCII फॉर्मेट में आउटपुट करने के लिए सेट किया गया है। संदेश के आउटपुट को ट्रिगर करने वाली घटना एक नई शुरुआत/सिंक पल्स की प्राप्ति है।

चरण 4: डेटा लॉगिंग

डेटा प्रविष्ट कराना
डेटा प्रविष्ट कराना

सॉफ्टवेयर को Arduino के सीरियल (TX) आउटपुट के माध्यम से परिवर्तित डेटा को ASCII वर्णों के रूप में आउटपुट करने के लिए सेट किया गया है। जब मैंने पीआईसी संस्करण बनाया तो मुझे डेटा प्रदर्शित करने के लिए पीसी पर एक टर्मिनल प्रोग्राम में इंटरफेस करने की आवश्यकता थी। Arduino IDE का एक फायदा यह है कि इसमें एक सीरियल मॉनिटर फंक्शन बनाया गया है। मैंने सीरियल पोर्ट रेट को 115.2k पर सेट किया और फिर सीरियल मॉनिटर विंडो को उसी रेट पर सेट किया। यहां दिया गया स्क्रीन शॉट एक विशिष्ट डिस्प्ले दिखाता है जिसमें विभिन्न प्रकार के सेंसर से आउटपुट होते हैं जो मेरे पास हैं। जैसा कि आप देख सकते हैं, डेटा कभी-कभी सही नहीं होता है लेकिन आप आसानी से निर्धारित कर सकते हैं कि प्रत्येक सेंसर का वास्तविक मूल्य क्या होना चाहिए।

चरण 5: नमूना रिसीवर सॉफ्टवेयर

नमूना रिसीवर सॉफ्टवेयर
नमूना रिसीवर सॉफ्टवेयर

मैंने एक नमूना सॉफ़्टवेयर सूची शामिल की है जो दर्शाती है कि आप अपने आवेदन के लिए कोड का एक विशिष्ट सेट प्राप्त करने के लिए एकत्रित जानकारी का उपयोग कैसे कर सकते हैं। यह उदाहरण मेरे Etekcity रिमोट आउटलेट में से एक का अनुकरण करने के लिए स्थापित किया गया है। एक कमांड नैनो (D13) में निर्मित एलईडी को चालू करता है और दूसरा कमांड एलईडी को बंद कर देता है। यदि आपके पास अपने Arduino में एलईडी नहीं है, तो रोकनेवाला और एलईडी जोड़ें जैसा कि चित्र में दिखाया गया है। एक वास्तविक अनुप्रयोग में यह फ़ंक्शन विद्युत आउटलेट (रिले या ट्राइक का उपयोग करके) के लिए बिजली चालू/बंद कर देगा। संशोधन में आसानी के लिए सिंक समय, बिट समय और अपेक्षित डेटा बाइट्स सभी को सामने परिभाषित किया गया है। आप अपने विशिष्ट एप्लिकेशन के लिए चीजों को चालू/बंद करने आदि के लिए किसी भी शेष डेटा लाइन का उपयोग कर सकते हैं। बस लागू कमांड कोड को परिभाषित करें और अपनी आवश्यकताओं के अनुरूप एलईडी ऑन / ऑफ लॉजिक को "लूप" में बदलें।

सिफारिश की: