विषयसूची:

Arduino आधारित पल्स इंडक्शन डिटेक्टर - फ्लिप कॉइल: 5 चरण (चित्रों के साथ)
Arduino आधारित पल्स इंडक्शन डिटेक्टर - फ्लिप कॉइल: 5 चरण (चित्रों के साथ)

वीडियो: Arduino आधारित पल्स इंडक्शन डिटेक्टर - फ्लिप कॉइल: 5 चरण (चित्रों के साथ)

वीडियो: Arduino आधारित पल्स इंडक्शन डिटेक्टर - फ्लिप कॉइल: 5 चरण (चित्रों के साथ)
वीडियो: creative ideas for Logic gates 2024, जुलाई
Anonim
Arduino आधारित पल्स इंडक्शन डिटेक्टर - फ्लिप कॉइल
Arduino आधारित पल्स इंडक्शन डिटेक्टर - फ्लिप कॉइल
Arduino आधारित पल्स इंडक्शन डिटेक्टर - फ्लिप कॉइल
Arduino आधारित पल्स इंडक्शन डिटेक्टर - फ्लिप कॉइल

विचार

अतीत में अलग-अलग परिणामों के साथ कुछ मेटल डिटेक्टरों का निर्माण करने के बाद मैं उस दिशा में Arduino की क्षमताओं का पता लगाना चाहता था।

Arduino के साथ मेटल डिटेक्टर बनाने के कुछ अच्छे उदाहरण हैं, कुछ यहाँ निर्देश के रूप में हैं। लेकिन जब उन्हें देखते हैं, तो उन्हें आमतौर पर एनालॉग सिग्नल उपचार के लिए या तो कुछ बाहरी घटकों की आवश्यकता होती है या संवेदनशीलता काफी कम होती है।

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

दूसरी ओर, Arduino 16MHz पर चल रहा है और इसमें कुछ समय क्षमताएं हैं। इ। घड़ी की गति का उपयोग करते हुए 0.0625μS का संकल्प। इसलिए सेंसिंग के लिए एनालॉग इनपुट का उपयोग करने के बजाय, वोल्टेज में छोटे गतिशील परिवर्तनों को महसूस करने का सबसे सरल तरीका एक निश्चित संदर्भ वोल्टेज पर समय के साथ वोल्टेज ड्रॉप में परिवर्तन की तुलना करना है।

इस प्रयोजन के लिए ATmega328 में D6 और D7 के बीच एक आंतरिक तुलनित्र की साफ सुथरी विशेषता है। यह तुलनित्र सटीक ईवेंट हैंडलिंग को सक्षम करते हुए एक रुकावट को ट्रिगर करने में सक्षम है। मिलिस () और माइकोस () जैसे बड़े करीने से कोडित टाइमिंग रूटीन को छोड़कर और बहुत अधिक रिज़ॉल्यूशन के साथ ATmega328 के आंतरिक टाइमर में जाने से, Arduino धातु का पता लगाने के दृष्टिकोण के लिए एक महान आधार है।

तो एक स्रोत कोड दृश्य से, इनपुट की ध्रुवीयता में "परिवर्तन" के लिए आंतरिक तुलनित्र को प्रोग्राम करना और परिवर्तनों के समय में परिवर्तन के लिए उच्चतम गति के साथ एक आंतरिक काउंटर का उपयोग करना एक अच्छी शुरुआत होगी।

इसे प्राप्त करने के लिए Arduido में सामान्य कोड है:

// सभी आवश्यक पूर्व चर आदि को परिभाषित करना और रजिस्टरों को स्थापित करना

अहस्ताक्षरित चार घड़ीसेलेक्टबिट्स = _BV (CS10); // कोई प्रीस्केल नहीं, पूर्ण xtal शून्य सेटअप () {पिनमोड (6, INPUT); // + तुलनित्र - उन्हें INPUT के रूप में सेट करके, वे // उच्च प्रतिबाधा पिनमोड (7, INPUT) पर सेट हैं; // - तुलनित्र के - उन्हें INPUT के रूप में सेट करके, वे // उच्च प्रतिबाधा cli() पर सेट हैं; // स्टॉप इंटरप्ट TCCR1A = 0; // पूरे TCCR1A रजिस्टर को 0 TCCR1B = 0 पर सेट करें; // TCCR1B के लिए समान -> सामान्य मोडTCNT1 = 0; // काउंटर वैल्यू को 0 पर इनिशियलाइज़ करें; TCCR1B |= क्लॉकसेलेक्टबिट्स; // प्रीस्केलर सेट करता है और घड़ी शुरू करता है TIMSK1 = _BV(TOIE1); // टाइमर ओवरफ्लो इंटरप्ट को बिट सेई () को सक्षम करने के लिए सेट करता है; // अनुमति इंटरप्ट एसीएसआर = (0 << एसीडी) | // एनालॉग तुलनित्र: सक्षम (0 << एसीबीजी) | // एनालॉग तुलनित्र बैंडगैप चुनें: AIN0 सकारात्मक इनपुट पर लागू होता है (0 << ACO) | // एनालॉग तुलनित्र आउटपुट: ऑफ (1 << एसीआई) | // एनालॉग तुलनित्र इंटरप्ट फ्लैग: क्लियर पेंडिंग इंटरप्ट (1 << ACIE) | // एनालॉग तुलनित्र इंटरप्ट: सक्षम (0 << एसीआईसी) | // एनालॉग तुलनित्र इनपुट कैप्चर: अक्षम (0 << ACIS1 | 0 << ACIS0 // आउटपुट टॉगल पर रुकावट // (0 << ACIS1 | 1 << ACIS0 // आरक्षित // (1 << ACIS1 | 0 << ACIS0 // गिरने वाले आउटपुट एज पर इंटरप्ट // (1 << ACIS1 | 1 << ACIS0 // बढ़ते इनपुट एज पर इंटरप्ट; }

// इस दिनचर्या को हर बार कहा जाता है जब तुलनित्र व्यवधान उत्पन्न करता है

ISR(ANALOG_COMP_vect) { oldSREG=SREG; क्ली (); टाइमस्टैम्प = टीसीएनटी1; एसआरईजी = पुरानाएसआरईजी; }

// इस रूटीन को हर बार आंतरिक काउंटर में ओवरफ्लो होने पर कहा जाता है

ISR (TIMER1_OVF_vect) {timer1_overflow_count++; }

// इस रूटीन का उपयोग टाइमर को 0. पर रीसेट करने के लिए किया जाता है

शून्य रीसेट टाइमर (शून्य) {oldSREG = SREG; क्ली (); // अक्षम करें TCNT1 = 0 को बाधित करता है; // काउंटर वैल्यू को 0 SREG = oldSREG में इनिशियलाइज़ करें; // पुनर्स्थापना स्थिति रजिस्टर TCCR1B |= clockSelectBits; // प्रीस्केलर सेट करता है और घड़ी टाइमर शुरू करता है1_overflow_count=0; // ओवरफ्लो काउंटर रीसेट करता है }

बेशक यह विचार बिल्कुल नया नहीं है। इस कोड का मुख्य भाग कहीं और पाया जा सकता है। TPIMD - टिनी पल्स इंडक्शन मेटल डिटेक्टर होम पेज पर एक माइक्रोकंट्रोलर के लिए इस तरह का एक अच्छा कार्यान्वयन।

www.miymd.com/index.php/projects/tpimd/ (दुर्भाग्य से यह पृष्ठ अब ऑनलाइन नहीं है, वर्तमान में www.basic4mcu.com पर साइट का बैकअप है, "TPIMD" के लिए खोजें)।

चरण 1: Arduino पल्स इंडक्शन आइडिया - फ्लिप कॉइल

Arduino पल्स इंडक्शन आइडिया - फ्लिप कॉइल
Arduino पल्स इंडक्शन आइडिया - फ्लिप कॉइल
Arduino पल्स इंडक्शन आइडिया - फ्लिप कॉइल
Arduino पल्स इंडक्शन आइडिया - फ्लिप कॉइल

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

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

इस मूल समस्या को हल करने के लिए, कॉइल को पल्स के बाद इलेक्ट्रॉनिक रूप से "फ़्लिप ओवर" करने की आवश्यकता होती है। इस मामले में नाड़ी सकारात्मक हो सकती है और क्षय वक्र भी सकारात्मक हो सकता है।

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

इस सकारात्मक वक्र का उपयोग तुलनित्र के माध्यम से उस समय के बिंदु का पता लगाने के लिए किया जा सकता है जहां क्षय वोल्टेज एक संदर्भ वोल्टेज को "पार" करता है। कॉइल के पास के खजाने के मामले में, क्षय वक्र बदल जाता है और संदर्भ वोल्टेज को पार करने का समय बदल जाता है। इस परिवर्तन का पता लगाया जा सकता है।

कुछ प्रयोग करने के बाद निम्नलिखित सर्किट काम करने लगा।

सर्किट में एक Arduino नैनो मॉड्यूल होता है। यह मॉड्यूल D10 के माध्यम से कॉइल (SV3 पर) को पावर देने वाले दो MOSFET ट्रांजिस्टर चलाता है। जब D10 पर पल्स समाप्त हो जाता है, तो दोनों MOSFETs कॉइल को 12V और GND से अलग कर देते हैं। कुंडल में सहेजी गई ऊर्जा R2 (220 ओम) के माध्यम से बाहर निकलती है। उसी समय R1 (560 ओम) कॉइल के पूर्व सकारात्मक पक्ष को GND से जोड़ता है। यह ऋणात्मक क्षय वक्र को R5 (330 ओम) पर धनात्मक वक्र में बदल देता है। डायोड Arduino के इनपुट पिन की सुरक्षा करते हैं।

R7 लगभग 0.04V पर वोल्टेज डिवाइडर है। फिलहाल D7 पर क्षय वक्र D6 पर 0.04 की तुलना में अधिक नकारात्मक हो जाता है, एक रुकावट ट्रिगर होती है और नाड़ी के अंत के बाद की अवधि बच जाती है।

कुंडल के पास धातु के मामले में, क्षय वक्र अधिक समय तक रहता है, और नाड़ी के अंत और रुकावट के बीच का समय लंबा हो जाता है।

चरण 2: डिटेक्टर का निर्माण (ब्रेडबोर्ड)

डिटेक्टर का निर्माण (ब्रेडबोर्ड)
डिटेक्टर का निर्माण (ब्रेडबोर्ड)
डिटेक्टर का निर्माण (ब्रेडबोर्ड)
डिटेक्टर का निर्माण (ब्रेडबोर्ड)
डिटेक्टर का निर्माण (ब्रेडबोर्ड)
डिटेक्टर का निर्माण (ब्रेडबोर्ड)

डिटेक्टर बनाना काफी आसान है। यह या तो ब्रेडबोर्ड पर (मूल सर्किट से चिपके हुए) या पीसीबी पर भागों को सोल्डर करके किया जा सकता है।

Arduino नैनो बोर्ड पर D13 LED का उपयोग धातु के लिए एक संकेत के रूप में किया जाता है

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

चित्रों में 0.96 OLED डिस्प्ले के कनेक्शन नहीं दिखाए गए हैं। यह डिस्प्ले जुड़ा हुआ है:

Vcc - 5V (Arduino पिन पर, आपूर्ति वोल्टेज नहीं !!!)

जीएनडी - जीएनडी

एससीएल - ए5

एसडीए - ए4

शुरुआत में डिटेक्टर को कैलिब्रेट करने के लिए इस OLED डिस्प्ले की जरूरत होती है। यह Arduino के PIN6 पर सही वोल्टेज सेट करके किया जाता है। यह वोल्टेज लगभग 0.04V होना चाहिए। डिस्प्ले सही वोल्टेज सेट करने में मदद करता है।

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

चरण 3: पीसीबी जाना

पीसीबी जा रहे हैं
पीसीबी जा रहे हैं
पीसीबी जा रहे हैं
पीसीबी जा रहे हैं
पीसीबी जा रहे हैं
पीसीबी जा रहे हैं
पीसीबी जा रहे हैं
पीसीबी जा रहे हैं

टांका लगाने के लिए मुझे वास्तव में दो तरफा हाई-टेक पीसीबी पसंद नहीं है, इसलिए मैंने सर्किट को एक तरफा पीसीबी पर फिट करने के लिए संशोधित किया।

निम्नलिखित संशोधन किए गए:

1. डायोड को छोड़ दिया गया था।

2. MOSFETs के फाटकों को 10 ओम. का रेसिस्टर मिला

3. D6 पर वोल्टेज-डिवाइडर के लिए आपूर्ति वोल्टेज D8. पर एक उच्च स्तर के सिग्नल द्वारा दिया जाता है

4. MOSFETs के लिए ड्राइवर पिन बदल दिया गया था।

इस तरह एक तरफा पीसीबी बनाया जा सकता है जिसे यूनिवर्सल पीसीबी पर टांका लगाया जा सकता है। इस सर्किट का उपयोग करके आपके पास केवल 8-10 बाहरी घटकों के साथ एक कार्यशील PI डिटेक्टर होगा (यह निर्भर करता है कि OLED डिस्प्ले और/या स्पीकर का उपयोग किया जाता है)।

चरण 4: डिटेक्टर की स्थापना और उपयोग करना

डिटेक्टर की स्थापना और उपयोग करना
डिटेक्टर की स्थापना और उपयोग करना
डिटेक्टर की स्थापना और उपयोग करना
डिटेक्टर की स्थापना और उपयोग करना
डिटेक्टर की स्थापना और उपयोग करना
डिटेक्टर की स्थापना और उपयोग करना

यदि डिटेक्टर ठीक से बनाया गया है और प्रोग्राम Arduino को लिखा गया है, तो यूनिट को स्थापित करने का सबसे आसान (यदि एकमात्र नहीं) तरीका OLED डिस्प्ले का उपयोग करना है। डिस्प्ले 5V, GND, A4, A5 से जुड़ा है। यूनिट के चालू होने के बाद डिस्प्ले को "कैलिब्रेटिंग" दिखाना चाहिए। कुछ सेकंड के बाद इसे "अंशांकन किया गया" कहना चाहिए और डिस्प्ले पर तीन नंबर दिखाए जाने चाहिए।

पहला नंबर कैलिब्रेशन के दौरान पहचाना गया "संदर्भ मान" है। दूसरा मान अंतिम मापा गया मान है और तीसरा मान पिछले 32 मापों का माध्य-मान है।

ये तीन मान कमोबेश एक जैसे होने चाहिए (मेरे परीक्षण-मामलों में 1000 से कम)। मध्य मान कमोबेश स्थिर होना चाहिए।

प्रारंभिक सेट अप शुरू करने के लिए, कॉइल के पास कोई धातु नहीं होनी चाहिए।

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

ऐसा हो सकता है कि डिस्प्ले फ्रीज हो जाए। बस रीसेट बटन दबाएं और फिर से शुरू करें।

मेरे सेटअप के लिए (कॉइल: 18 टर्न @ 20cm) स्थिर मान लगभग 630-650 है। एक बार सेट हो जाने पर, रीसेट बटन दबाएं, यूनिट फिर से कैलिब्रेट करता है और सभी ट्री मान फिर से एक ही श्रेणी में होने चाहिए। यदि धातु को अब कुंडल में लाया जाता है, तो Arduino-Board (D13) पर लगी एलईडी को प्रकाश करना चाहिए। एक संलग्न स्पीकर कुछ क्लिकिंग शोर देता है (वहां प्रोग्रामिंग में सुधार के लिए कुछ जगह है)।

उच्च उम्मीदों को रोकने के लिए:

डिटेक्टर कुछ सामान का पता लगाता है, लेकिन यह एक बहुत ही सरल और सीमित डिटेक्टर रहता है।

क्षमताओं का आभास देने के लिए, a ने विभिन्न अन्य डिटेक्टरों के साथ कुछ संदर्भों का पता लगाया। परिणामों को देखते हुए, यह अभी भी केवल 8 बाहरी भागों वाले डिटेक्टर के लिए काफी प्रभावशाली है, लेकिन पेशेवर डिटेक्टरों से मेल नहीं खाता है।

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

मज़े करो!

चरण 5: अपडेट1: 16x2 एलसीडी का उपयोग करना

Update1: 16x2 LCD का उपयोग करना
Update1: 16x2 LCD का उपयोग करना
Update1: 16x2 LCD का उपयोग करना
Update1: 16x2 LCD का उपयोग करना
Update1: 16x2 LCD का उपयोग करना
Update1: 16x2 LCD का उपयोग करना

सुधार

आगे के परीक्षण के दौरान मैंने महसूस किया कि I2C OLED डिस्प्ले के लिए पुस्तकालय काफी समय का उपयोग कर रहा था। इसलिए मैंने इसके बजाय I2C कनवर्टर के साथ 16x2 डिस्प्ले का उपयोग करने का निर्णय लिया।

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

दूसरा मान क्षय वक्र के वास्तविक विलंब मान को दर्शाता है। यह मान आम तौर पर उतना दिलचस्प नहीं होता है, लेकिन डिटेक्टर के प्रारंभिक सेटअप के लिए आवश्यक होता है।

कार्यक्रम अब एक क्रम में कई पल्स अवधि के लिए अनुमति देता है (प्रदर्शन के प्रयोग / सुधार के साधन)। मैंने कोई ब्रेक थ्रू हासिल नहीं किया। तो डिफ़ॉल्ट एक पल्स अवधि पर सेट है।

डिटेक्टर का प्रारंभिक सेटअप

डिटेक्टर स्थापित करते समय, दूसरी पंक्ति का दूसरा मान प्रासंगिक होता है (पहले वाले को अनदेखा किया जा सकता है)। प्रारंभ में मान "अस्थिर" हो सकता है (चित्र देखें)। ट्रिम रेसिस्टर को तब तक घुमाएं जब तक कि मान स्थिर रीडिंग तक न पहुंच जाए। फिर मान को अधिकतम स्थिर मान तक बढ़ाने के लिए इसे चालू करें। पुन: कैलिब्रेट करने के लिए रीसेट बटन दबाएं और डिटेक्टर उपयोग के लिए तैयार है।

मुझे यह आभास हुआ कि अधिकतम स्थिर मूल्य निर्धारित करके, मैंने गैर-लौह धातुओं के लिए संवेदनशीलता खो दी है। तो गैर-लौह सामग्री के लिए अच्छी संवेदनशीलता रखने के लिए सेटिंग्स के कुछ प्रयोग करने लायक हो सकते हैं।

कॉयल

मैं आगे के परीक्षण के लिए 3 कॉइल बनाता हूं

1 -> 18 मोड़ @ 200mm

2 -> 25 मोड़ @ 100mm

३ -> ४८ मोड़ @ १०० मिमी

दिलचस्प बात यह है कि सभी कॉइल लगभग समान प्रदर्शन (हवा में 40-50 मिमी पर 20ct सिक्का) के साथ बहुत अच्छी तरह से काम करते हैं। यह काफी व्यक्तिपरक अवलोकन हो सकता है।

सिफारिश की: