विषयसूची:

Arduino UNO लॉजिक स्निफ़र: 8 चरण (चित्रों के साथ)
Arduino UNO लॉजिक स्निफ़र: 8 चरण (चित्रों के साथ)

वीडियो: Arduino UNO लॉजिक स्निफ़र: 8 चरण (चित्रों के साथ)

वीडियो: Arduino UNO लॉजिक स्निफ़र: 8 चरण (चित्रों के साथ)
वीडियो: #44 Wireless Rain Sensor - Discussions & Experiments 2024, जुलाई
Anonim
Arduino UNO लॉजिक स्निफ़र
Arduino UNO लॉजिक स्निफ़र

यह परियोजना एक साधारण प्रयोग के रूप में शुरू हुई। किसी अन्य प्रोजेक्ट के लिए ATMEGA328P के डेटाशीट पर अपने शोध के दौरान, मुझे कुछ दिलचस्प लगा। Timer1 इनपुट कैप्चर यूनिट। यह हमारे Arduino UNO के माइक्रोकंट्रोलर को सिग्नल एज का पता लगाने, टाइमस्टैम्प को स्टोर करने और एक रुकावट को ट्रिगर करने की अनुमति देता है, सभी हार्डवेयर में।

फिर मैंने सोचा कि यह किस एप्लिकेशन में उपयोगी हो सकता है, और इसका परीक्षण कैसे किया जाए। जैसा कि मैं कुछ समय के लिए एक तर्क विश्लेषक प्राप्त करना चाहता हूं, मैंने अपने Arduino UNO बोर्ड में एक को लागू करने का प्रयास करने का फैसला किया, बस सुविधा का परीक्षण करने के लिए, और देखें कि क्या हम इससे अच्छे परिणाम प्राप्त कर सकते हैं।

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

संक्षेप में, मेरा तर्क विश्लेषक होगा:

  • एक चैनल हो,
  • एक ग्राफिकल इंटरफ़ेस है,
  • यूएसबी के माध्यम से इंटरफेस के साथ संवाद करें,
  • Arduino UNO बोर्ड पर चलाएँ।

अंत में इसमें 800 नमूने मेमोरी गहराई होगी, और 115200 बॉड यूएआरटी संदेश को सफलतापूर्वक कैप्चर करने में सक्षम था (मैंने वास्तव में उच्च गति पर इसका परीक्षण नहीं किया था)।

इस निर्देश में इस परियोजना के "यह कैसे काम करता है" और "इसका उपयोग कैसे करें" दोनों भाग शामिल हैं, इसलिए उन लोगों के लिए जो तकनीकी पक्ष में रुचि नहीं रखते हैं, आप सीधे चरण 4 पर जा सकते हैं।

आपूर्ति

मैं विश्लेषक को यथासंभव सरल रखना चाहता था, इसलिए बहुत कम हार्डवेयर की आवश्यकता थी।

आपको चाहिये होगा:

  • एक Arduino UNO बोर्ड (या समतुल्य जब तक यह ATMEGA328P MCU पर निर्भर करता है),
  • एक कंप्यूटर,
  • डिबग करने के लिए कुछ (एक अन्य Arduino UNO बोर्ड कुछ परीक्षण करने के लिए ठीक काम करता है)।

Arduino UNO और वेब इंटरफ़ेस दोनों के लिए कोड यहां पाया जा सकता है। आपको p5.serialcontrol, और PulseView सॉफ़्टवेयर की भी आवश्यकता होगी।

चरण 1: कार्य सिद्धांत

काम के सिद्धांत
काम के सिद्धांत

विचार सरल है। आप कैप्चर सेटिंग्स चुनें, और "अधिग्रहण" पर क्लिक करें। वेब इंटरफ़ेस उन्हें p5.serialcontrol सॉफ़्टवेयर पर भेजेगा, जो हमें ब्राउज़र से सीरियल इंटरफ़ेस का उपयोग करने की अनुमति देता है, क्योंकि यह सीधे उस तक नहीं पहुंच सकता है। p5.serialcontrol सॉफ्टवेयर तब Arduino UNO बोर्ड को सूचना देता है, जो डेटा को कैप्चर करता है, और उन्हें उसी पथ के माध्यम से इंटरफ़ेस पर वापस भेजता है।

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

Arduino UNO की इनपुट कैप्चर यूनिट को विभिन्न क्लॉक डिवीजनों का उपयोग करने के लिए कॉन्फ़िगर किया जा सकता है, इस प्रकार रिज़ॉल्यूशन को कम करता है, लेकिन अतिप्रवाह से पहले देरी को बढ़ाता है। यह डेटा कैप्चर करना शुरू करने के लिए उठने, गिरने या दोनों किनारों पर भी ट्रिगर हो सकता है।

चरण 2: Arduino UNO स्केच

अरुडिनो यूएनओ स्केच
अरुडिनो यूएनओ स्केच

मैंने Arduino IDE के साथ स्केच लिखा और संकलित किया। मैंने सबसे पहले अपने TCCR1A और TCCR1B रजिस्टरों को सेटअप () में लिखकर टाइमर1 को "सामान्य" ऑपरेशन मोड में सेट करना शुरू किया। इसके बाद मैंने भविष्य में इसके उपयोग को थोड़ा आसान बनाने के लिए कुछ कार्य किए, जैसे कि "setTim1PSC ()" नामक क्लॉक डिवीजन को सेट करना। मैंने Timer1 इनपुट कैप्चर यूनिट और ओवरफ्लो इंटरप्ट को सक्रिय और निष्क्रिय करने के लिए फ़ंक्शन भी लिखे।

मैंने "नमूने" सरणी को जोड़ा, जो अधिग्रहित डेटा को धारण करेगा। यह एक वैश्विक सरणी है जिसे मैंने संकलक को अनुकूलन करने से रोकने के लिए "अस्थिर" पर सेट किया है और इसे फ्लैश में रखा है, जैसा कि यह मेरे पहले संकलन के दौरान कर रहा था। मैंने इसे "uint16_t" सरणी के रूप में परिभाषित किया, क्योंकि टाइमर 1 भी 16 बिट है, जिसकी लंबाई 810 है। हम 800 मानों पर कब्जा करना बंद कर देते हैं, लेकिन जैसा कि स्पष्ट गति कारणों के लिए इंटरप्ट के बाहर परीक्षण किया जाता है, मैंने 10 रखना चुना अतिप्रवाह को रोकने के लिए अधिक मूल्य। शेष कोड के लिए कुछ अतिरिक्त चर के साथ, स्केच 1313 बाइट्स (88%) मेमोरी का उपयोग कर रहा है, जिससे हमें 235 बाइट्स मुफ्त रैम मिल जाती है। हम पहले से ही उच्च मेमोरी उपयोग में हैं, और मैं अधिक नमूना क्षमता नहीं जोड़ना चाहता, क्योंकि यह बहुत कम मेमोरी स्पेस के कारण अजीब व्यवहार कर सकता है।

निष्पादन की गति को हमेशा बढ़ाने की मेरी खोज में, मैंने उनके निष्पादन समय को कम से कम करने के लिए इंटरप्ट के अंदर बयानों के बजाय फ़ंक्शन पॉइंटर्स का उपयोग किया। कैप्चर पिन हमेशा Arduino UNO नंबर 8 होगा, क्योंकि यह केवल Timer1 की इनपुट कैप्चर यूनिट से जुड़ा है।

कैप्चर प्रक्रिया ऊपर की छवि पर दिखाई गई है। यह तब शुरू होता है जब Arduino UNO को एक वैध UART डेटा फ़्रेम प्राप्त होता है, जिसमें वांछित कैप्चर सेटिंग्स होती हैं। फिर हम चुने हुए किनारे पर कब्जा करने के लिए सही रजिस्टरों को कॉन्फ़िगर करके उन सेटिंग्स को संसाधित करते हैं, और सही घड़ी विभाजन का उपयोग करते हैं। फिर हम पहले सिग्नल एज का पता लगाने के लिए PCINT0 (पिन चेंज) इंटरप्ट को सक्षम करते हैं। जब हम इसे प्राप्त करते हैं, तो हम टाइमर 1 मान को रीसेट करते हैं, पीसीआईएनटी0 इंटरप्ट को अक्षम करते हैं, और आईसीयू (इनपुट कैप्चर यूनिट) इंटरप्ट को सक्षम करते हैं। उस क्षण से, सिग्नल पर कोई भी गिरती/बढ़ती बढ़त (चुने गए कॉन्फ़िगरेशन के आधार पर), इनपुट कैप्चर यूनिट को ट्रिगर करेगी, इस प्रकार इस घटना के टाइमस्टैम्प को ICR1 रजिस्टर में सहेजती है, और एक रुकावट को क्रियान्वित करती है। इस रुकावट में हम अपने "नमूने" सरणी में ICR1 रजिस्टर वैल्यू डालते हैं, और अगले कैप्चर के लिए इंडेक्स को बढ़ाते हैं। जब टाइमर 1 या सरणी ओवरफ्लो हो जाती है, तो हम कैप्चर इंटरप्ट को अक्षम कर देते हैं, और डेटा को यूएआरटी के माध्यम से वेब इंटरफ़ेस पर वापस भेज देते हैं।

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

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

चरण 3: वेब इंटरफ़ेस और P5.js

वेब इंटरफेस और P5.js
वेब इंटरफेस और P5.js

जैसा कि शीर्षक से पता चलता है, वेब इंटरफेस p5.js की मदद से बनाया गया था। उन लोगों के लिए जो इसे पहले से नहीं जानते हैं, मैं आपको वेबसाइट पर जाकर देखने की अत्यधिक सलाह देता हूं, क्योंकि यह वास्तव में एक अच्छी लाइब्रेरी है। यह प्रसंस्करण पर आधारित है, उपयोग में आसान है, आपको बहुत तेजी से अच्छे परिणाम प्राप्त करने की अनुमति देता है, और अच्छी तरह से प्रलेखित है। इन्हीं सब कारणों से मैंने इस पुस्तकालय को चुना है। मैंने मेनू के लिए Quicksettings.js लाइब्रेरी का भी उपयोग किया, मेरे डेटा को प्लॉट करने के लिए grafica.js एक, और Arduino UNO के साथ संचार करने के लिए p5.serialport लाइब्रेरी का उपयोग किया।

मैं इंटरफ़ेस पर बहुत अधिक समय नहीं बिताऊंगा, क्योंकि मैंने इसे अभी डेटा पूर्वावलोकन और सेटिंग नियंत्रण के लिए डिज़ाइन किया है, और इसलिए भी कि यह मेरे प्रयोग का विषय बिल्कुल भी नहीं था। हालाँकि, मैं निम्नलिखित भागों में पूरे सिस्टम का उपयोग करने के विभिन्न चरणों की व्याख्या करूँगा, इस प्रकार उपलब्ध विभिन्न नियंत्रणों की व्याख्या करूँगा।

चरण 4: सिस्टम सेटअप

पहली बात यह है कि अगर पहले से नहीं किया गया है तो यहां Arduino UNO और इंटरफ़ेस कोड डाउनलोड करें। फिर आप Arduino IDE के माध्यम से अपने Arduino UNO बोर्ड को "UNO_LS.ino" स्केच के साथ पुन: प्रोग्राम कर सकते हैं।

आपको p5.serialcontrol सॉफ्टवेयर को इसके जीथब रिपोजिटरी से डाउनलोड करना चाहिए था। आपको अपने ऑपरेटिंग सिस्टम से मेल खाने वाली ज़िप फ़ाइल प्राप्त करनी होगी (मैंने इसे केवल विंडोज़ पर परीक्षण किया है)। किसी फ़ोल्डर में ज़िप निकालें, उसमें पाए गए निष्पादन योग्य को प्रारंभ करें, और इसे वैसे ही छोड़ दें। किसी भी सीरियल पोर्ट से कनेक्ट करने का प्रयास न करें, बस इसे बैकग्राउंड में चालू रहने दें, इसे रिले के रूप में उपयोग किया जाएगा।

"इंटरफ़ेस" फ़ोल्डर खोलें। आपको "index.html" नाम की एक फाइल मिलनी चाहिए। इसे अपने ब्राउज़र में खोलें, यह वेब इंटरफ़ेस है।

और बस! आपको अतिरिक्त पुस्तकालय डाउनलोड करने की आवश्यकता नहीं है, मेरे द्वारा प्रदान किए गए पैकेज में सब कुछ शामिल किया जाना चाहिए।

चरण 5: कनेक्शन, कॉन्फ़िगरेशन और अधिग्रहण

कनेक्शन, विन्यास और अधिग्रहण
कनेक्शन, विन्यास और अधिग्रहण

इंटरफ़ेस को Arduino UNO बोर्ड से जोड़ने के लिए, बस सूची में संबंधित पोर्ट का चयन करें और "ओपन" बटन दबाएं। यदि ऑपरेशन सफल रहा, तो "राज्य" संदेश को "COMX खोला गया" जैसा कुछ प्रदर्शित करना चाहिए।

अब आप अपने कैप्चर विकल्प चुन सकते हैं। पहले किनारे का चयन है। मैं आपको हमेशा "दोनों" का उपयोग करने की सलाह देता हूं, क्योंकि यह आपको वास्तविक सिग्नल का सबसे अच्छा प्रतिनिधित्व देगा। यदि "दोनों" सेटिंग सिग्नल को कैप्चर करने में विफल हो जाती है (यदि उदाहरण के लिए सिग्नल की आवृत्ति बहुत अधिक है), तो आप "राइजिंग" या "फॉलिंग" एज सेटिंग के साथ प्रयास कर सकते हैं, जो उस सिग्नल पर निर्भर करता है जिसे आप देखने का प्रयास करते हैं।

दूसरी सेटिंग क्लॉक डिवीजन है। यह आपको वह रिजॉल्यूशन देगा जिस पर आप सिग्नल को कैप्चर करने में सक्षम होंगे। आप विभाजन कारक को "8", "64", "256" और "1024" द्वारा सेट करना चुन सकते हैं। Arduino UNO बोर्ड माइक्रोकंट्रोलर को देखने के लिए 16MHz क्वार्ट्ज का उपयोग करता है, इसलिए नमूना आवृत्ति "16MHz/डिवीजन कारक" होगी। इस सेटिंग से सावधान रहें, क्योंकि यह यह भी निर्धारित करेगा कि आप कितने समय तक सिग्नल कैप्चर कर पाएंगे। चूंकि टाइमर 1 एक 16 बिट टाइमर है, अतिप्रवाह से पहले अनुमत कैप्चर समय "(2 ^ 16) * (डिवीजन कारक)/16 मेगाहर्ट्ज" होगा। आपके द्वारा चुनी गई सेटिंग के आधार पर, यह ~33ms और 4.2s के बीच होगी। अपनी पसंद को अपने दिमाग में रखें, बाद में आपको इसकी जरूरत पड़ेगी।

अंतिम सेटिंग शोर रद्द करने वाला है। मैंने इस पर बहुत अधिक परीक्षण नहीं किया, और 99% मामलों में आपको इसकी आवश्यकता नहीं होगी, इसलिए इसे अनियंत्रित छोड़ दें। उन लोगों के लिए जो अभी भी इसके बारे में उत्सुक हैं, आप ATMEGA328P के डेटाशीट के टाइमर/काउंटर 1 अनुभाग में शोर रद्द करने वाले की खोज कर सकते हैं।

Arduino UNO बोर्ड के पिन 8 को अपने सिग्नल से कनेक्ट करना न भूलें, और परीक्षण सर्किट और लॉजिक एनालाइज़र दोनों के लिए समान वोल्टेज संदर्भ के लिए आधार को एक साथ तार दें। यदि आपको ग्राउंड आइसोलेशन की आवश्यकता है, या 5V से भिन्न स्तरों वाले संकेतों को मापने की आवश्यकता है, तो आपको संभवतः अपने सर्किट में एक ऑप्टो-आइसोलेटर जोड़ने की आवश्यकता होगी।

एक बार सब कुछ ठीक से कॉन्फ़िगर हो जाने के बाद, आप "अधिग्रहण" बटन दबा सकते हैं।

चरण 6: परिणाम और सीएसवी डेटा निर्यात कैप्चर करें

परिणाम और सीएसवी डेटा निर्यात कैप्चर करें
परिणाम और सीएसवी डेटा निर्यात कैप्चर करें

एक बार जब आपका Arduino UNO एक कैप्चर पूरा कर लेता है, तो यह स्वचालित रूप से डेटा को वेब इंटरफ़ेस पर वापस भेज देगा, जो उन्हें प्लॉट करेगा। आप सही स्लाइडर के साथ ज़ूम इन या आउट कर सकते हैं, और नीचे वाले के साथ नमूनों के माध्यम से यात्रा कर सकते हैं।

प्लॉट आपको केवल एक पूर्वावलोकन देता है, और इसमें कोई डेटा विश्लेषण उपकरण नहीं है। इस प्रकार, अपने डेटा पर और विश्लेषण करने के लिए, आपको इसे PulseView में आयात करना होगा।

पहला कदम एक csv फ़ाइल को निर्यात करना है जिसमें आपका सारा डेटा है। ऐसा करने के लिए, आपको बस वेब इंटरफेस से "निर्यात" बटन पर क्लिक करना होगा। संकेत मिलने पर अपनी फ़ाइल को किसी ज्ञात स्थान पर सहेजें।

अब पल्स व्यू खोलें। शीर्ष मेनू बार पर, "खोलें" (फ़ोल्डर आइकन) पर क्लिक करें, और "अल्पविराम से अलग किए गए मान आयात करें …" चुनें। अपने डेटा वाली पहले से जेनरेट की गई csv फ़ाइल चुनें।

एक छोटी सी विंडो दिखाई देगी। सब कुछ वैसे ही छोड़ दें, आपको बस कैप्चर के लिए चुने गए क्लॉक डिवीजन फैक्टर के अनुसार "सैंपलरेट" सेटिंग को संशोधित करने की आवश्यकता है। आपकी नमूना आवृत्ति "16 मेगाहर्ट्ज/(डिवीजन कारक)" होगी। फिर "ओके" पर क्लिक करें, आपका सिग्नल स्क्रीन पर दिखना चाहिए।

चरण 7: पल्स व्यू सिग्नल विश्लेषण

पल्स व्यू सिग्नल विश्लेषण
पल्स व्यू सिग्नल विश्लेषण

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

यह बाईं ओर एक टैग वाला एक चैनल जोड़ देगा (ठीक उसी तरह जैसे आपके डेटा के लिए)। टैग पर क्लिक करके आप डिकोडर की सेटिंग बदल सकते हैं। सही लोगों को चुनने के बाद, मैं उसी संदेश को पुनः प्राप्त करने में सक्षम था जो मेरे परीक्षण उपकरण द्वारा भेजा गया था। इससे पता चलता है कि पूरा सिस्टम उम्मीद के मुताबिक काम करता है।

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

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

भले ही परियोजना शुरुआत में एक प्रयोग थी, मुझे मिले परिणामों से मैं खुश हूं। मैं बिना किसी समस्या के "दोनों" एज मोड में 115200 बॉड तक UART संकेतों का नमूना लेने में सक्षम था, और मैं "फॉलिंग" एज मोड में 230400 बॉड तक जाने में भी कामयाब रहा। आप ऊपर दिए गए चित्र पर मेरा परीक्षण सेटअप देख सकते हैं।

मेरे कार्यान्वयन में कई कमियां हैं, इस तथ्य से शुरू होकर कि यह एक समय में केवल एक सिग्नल को कैप्चर कर सकता है, क्योंकि केवल Arduino UNO का पिन 8 "इनपुट कैप्चर सक्षम" है। यदि आप अधिक चैनलों के साथ एक Arduino तर्क विश्लेषक की खोज कर रहे हैं, तो Catoblepas की जाँच करें।

आप एक Arduino UNO से उच्च आवृत्तियों (कुछ मेगाहर्ट्ज) के साथ संकेतों को पकड़ने में सक्षम होने की उम्मीद नहीं कर सकते हैं, क्योंकि यह केवल 16MHz पर देखा जाता है (यदि किसी ने ऐसा किया है, तो मुझे इसकी विधि देखने में दिलचस्पी होगी)। हालाँकि, मैं अभी भी उन परिणामों से प्रभावित हूँ जो हम इस ATMEGA328P माइक्रोकंट्रोलर से प्राप्त कर सकते हैं।

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

वह मेरा पहला इंस्ट्रक्शनल था, और एक लंबा जो मुझे लगता है। मुझे आशा है कि यह आपके लिए एक दिलचस्प पठन रहा है।

मुझे बताएं कि क्या आपको त्रुटियां मिलती हैं, या यदि आपके कोई प्रश्न हैं!

सिफारिश की: