विषयसूची:

Arduino से सुपर फास्ट एनालॉग वोल्टेज: 10 कदम (चित्रों के साथ)
Arduino से सुपर फास्ट एनालॉग वोल्टेज: 10 कदम (चित्रों के साथ)

वीडियो: Arduino से सुपर फास्ट एनालॉग वोल्टेज: 10 कदम (चित्रों के साथ)

वीडियो: Arduino से सुपर फास्ट एनालॉग वोल्टेज: 10 कदम (चित्रों के साथ)
वीडियो: Amazing arduino project 2024, जुलाई
Anonim
Image
Image

यह निर्देशयोग्य दिखाता है कि एक Arduino और एक साधारण अवरोधक और संधारित्र जोड़ी से सुपर फास्ट एनालॉग वोल्टेज परिवर्तन कैसे उत्पन्न करें। एक एप्लिकेशन जहां यह उपयोगी है, एक आस्टसीलस्कप पर ग्राफिक्स बनाने में है। कई अन्य परियोजनाएं हैं जिन्होंने ऐसा किया है। जॉनगिनेर पल्स चौड़ाई मॉडुलन (पीडब्लूएम) का उपयोग करके एक साधारण क्रिसमस ट्री दिखाता है। दूसरों ने उस परियोजना में एक प्रतिरोधी सीढ़ी का उपयोग करके या एक समर्पित डिजिटल-से-एनालॉग कनवर्टर चिप का उपयोग करके सुधार किया है।

पीडब्लूएम का उपयोग करने से बहुत झिलमिलाहट होती है, जबकि एक रोकनेवाला सीढ़ी या डिजिटल-से-एनालॉग कनवर्टर का उपयोग करने के लिए अधिक आउटपुट पिन और घटकों की आवश्यकता होती है जो आसानी से उपलब्ध नहीं हो सकते हैं। मैं जिस सर्किट का उपयोग करता हूं वह वही मृत सरल अवरोधक और संधारित्र जोड़ी है जैसा कि क्रिसमस ट्री डेमो में उपयोग किया जाता है, लेकिन काफी कम झिलमिलाहट के साथ संचालित होता है।

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

अगर आपको यह निर्देश पसंद आया है, तो कृपया इसे वोट करने पर विचार करें!:)

चरण 1: सर्किट का निर्माण

सर्किट का निर्माण
सर्किट का निर्माण

सर्किट बनाने के लिए, आपको निम्नलिखित की आवश्यकता होगी:

a) Atmel 16MHz ATmega328P पर आधारित एक Arduino, जैसे कि Arduino Uno या Arduino Nano।

b) R मान के दो प्रतिरोधक जो कम से कम 150Ω हों।

सी) मूल्य सी के दो कैपेसिटर जैसे कि सी = 0.0015 / आर, उदाहरण:

  • आर = 150Ω और सी = 10μ
  • आर = 1.5kΩ और सी = 1μ
  • आर = 15kΩ और सी = 100nF
  • आर = 150kΩ और सी = 10nF

इन मूल्यों को चुनने के कारण दो गुना हैं। मुख्य रूप से, हम Arduino के पिन पर करंट को अधिकतम रेटेड करंट 40mA से नीचे रखना चाहते हैं। 5V के Arduino आपूर्ति वोल्टेज के साथ उपयोग किए जाने पर 150Ω के मान का उपयोग वर्तमान को 30mA तक सीमित करता है। R का बड़ा मान धारा को कम करेगा और इसलिए स्वीकार्य है।

दूसरी बाधा यह है कि हम समय को स्थिर रखना चाहते हैं, जो कि R और C का गुणनफल है, लगभग 1.5ms के बराबर। सॉफ्टवेयर को इस समय के लिए विशेष रूप से निरंतर ट्यून किया गया है। हालांकि सॉफ्टवेयर में आर और सी के मूल्यों को समायोजित करना संभव है, एक संकीर्ण सीमा है जिसके चारों ओर यह काम करेगा, इसलिए जितना संभव हो सके सुझाए गए अनुपात के करीब घटकों को चुनें।

आरसी स्थिरांक क्यों महत्वपूर्ण है, इस बारे में अधिक गहन व्याख्या सिद्धांत खंड में दी जाएगी, जब मैंने आपको दिखाया है कि प्रदर्शन सर्किट को कैसे इकट्ठा किया जाए।

चरण 2: ऑसिलोस्कोप सेट करना

आस्टसीलस्कप की स्थापना
आस्टसीलस्कप की स्थापना

प्रदर्शन के लिए एक आस्टसीलस्कप को X/Y मोड पर सेट करने की आवश्यकता होती है। जैसा कि योजनाबद्ध में दिखाया गया है, परीक्षण लीड को जोड़ने की आवश्यकता है। आपका आस्टसीलस्कप मेरे से अलग होगा, लेकिन मैं अपनी इकाई पर X/Y मोड सेट करने के लिए आवश्यक कदम उठाऊंगा:

ए) क्षैतिज स्वीप को चैनल बी (एक्स अक्ष) द्वारा नियंत्रित करने के लिए सेट करें।

बी) ऑसिलोस्कोप को दोहरे चैनल मोड पर सेट करें।

c) दोनों चैनलों पर वोल्ट/डिव सेट करें ताकि यह 0V से 5V तक वोल्टेज प्रदर्शित कर सके। मैंने अपना 0.5V/div पर सेट किया।

d) दोनों चैनलों पर कपलिंग मोड को DC पर सेट करें।

ई) एक्स और वाई की स्थिति को समायोजित करें ताकि जब Arduino बंद हो जाए तो डॉट स्क्रीन के निचले बाएं कोने में हो।

चरण 3: सॉफ्टवेयर डाउनलोड करें और चलाएं

Image
Image

फास्ट वेक्टर डिस्प्ले फॉर Arduino रिपॉजिटरी से सॉफ्टवेयर डाउनलोड करें। सॉफ्टवेयर जीएनयू एफ़ेरो पब्लिक लाइसेंस v3 के तहत लाइसेंस प्राप्त है और उस लाइसेंस की शर्तों के तहत स्वतंत्र रूप से उपयोग और संशोधित किया जा सकता है।

Arduino IDE में "fast-vector-display-arduino.ino" फ़ाइल खोलें और अपने Arduino पर अपलोड करें। क्षण भर में, आप अपने आस्टसीलस्कप स्क्रीन पर "नया साल मुबारक" एनीमेशन देखेंगे।

मैंने इस परियोजना को क्रिसमस तक आने वाले हफ्तों में एक व्यक्तिगत हैकटन के रूप में विकसित किया है, इसलिए एक क्रिसमस और नए साल का थीम वाला संदेश है जिसे आप कोड में पैटर्न चर को संशोधित करके देख सकते हैं।

चरण 4: अपनी खुद की कस्टम ड्राइंग बनाएं

समझें कि पीडब्लूएम इतना धीमा क्यों है
समझें कि पीडब्लूएम इतना धीमा क्यों है

यदि आप अपना स्वयं का चित्र बनाना चाहते हैं, तो आप USER_PATTERN को परिभाषित करने वाली रेखा पर Arduino स्केच में बिंदु निर्देशांक पेस्ट कर सकते हैं।

मैंने पाया कि कस्टम ड्राइंग बनाने के लिए इंकस्केप एक बहुत अच्छा टूल है:

  1. इम्पैक्ट जैसे बड़े, बोल्ड फॉन्ट का उपयोग करके टेक्स्ट बनाएं।
  2. टेक्स्ट ऑब्जेक्ट का चयन करें और "पथ" मेनू से "ऑब्जेक्ट टू पाथ" चुनें।
  3. अलग-अलग अक्षरों का चयन करें और एक कनेक्टेड आकार बनाने के लिए उन्हें ओवरलैप करें
  4. उन्हें एकल वक्र में संयोजित करने के लिए "पथ" मेनू से "संघ" चुनें।
  5. यदि किसी अक्षर में छेद हैं, तो आयत उपकरण के साथ एक आयत खींचकर एक छोटा पायदान काट लें और इसे "अंतर" उपकरण का उपयोग करके समोच्च से घटाएं।
  6. नोड्स दिखाने के लिए पथ को डबल-क्लिक करें।
  7. आयत सभी नोड्स का चयन करें और "चयनित नोड्स कॉर्नर बनाएं" टूल पर क्लिक करें।
  8. एसवीजी फाइल को सेव करें।

महत्वपूर्ण बात यह है कि आपकी ड्राइंग में एक ही बंद रास्ता होना चाहिए और कोई छेद नहीं होना चाहिए। सुनिश्चित करें कि आपके डिज़ाइन में लगभग 130 अंक से कम है।

चरण 5: निर्देशांक को SVG फ़ाइल से Arduino IDE में चिपकाएँ

  1. SVG फ़ाइल खोलें और निर्देशांकों की प्रतिलिपि बनाएँ। इन्हें "पथ" तत्व में एम्बेड किया जाएगा। निर्देशांक की पहली जोड़ी को नजरअंदाज किया जा सकता है; उन्हें 0, 0 से बदलें।
  2. निर्देशांकों को "#define USER_PATTERN" के ठीक बाद कोष्ठक के अंदर Arduino स्केच में चिपकाएँ।
  3. सभी रिक्त स्थान को अल्पविराम से बदलें, अन्यथा आपको एक संकलन त्रुटि मिलेगी। "बदलें और खोजें" टूल मददगार हो सकता है।
  4. संकलित करें और चलाएं!
  5. यदि आपको कोई समस्या है, तो किसी भी त्रुटि के लिए सीरियल कंसोल देखें। विशेष रूप से, यदि आपके पैटर्न में आंतरिक बफ़र के लिए बहुत अधिक बिंदु हैं, तो आपको संदेश दिखाई देंगे। ऐसे मामलों में, छवि अत्यधिक झिलमिलाहट प्रदर्शित करेगी।

चरण 6: समझें कि पीडब्लूएम इतना धीमा क्यों है

शुरू करने के लिए, आइए संधारित्र के व्यवहार की समीक्षा करें क्योंकि यह चार्ज हो रहा है।

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

जब हम संधारित्र को चार्ज करने के लिए पल्स चौड़ाई मॉडुलन (पीडब्लूएम) का उपयोग करते हैं, तो हम बेहतर नहीं होते हैं। PWM के साथ वोल्टेज 0V और 5V के बीच तेजी से स्विच करता है। व्यवहार में, इसका मतलब है कि हम संधारित्र में चार्ज को धक्का देने और इसे फिर से थोड़ा सा खींचने के बीच तेजी से वैकल्पिक होते हैं - यह धक्का और पुल एक बड़ा कदम आगे बढ़ाकर मैराथन दौड़ने की कोशिश करने जैसा है और फिर थोड़ा कदम पीछे बार बार।

जब आप इसका औसत निकालते हैं, तो PWM का उपयोग करके संधारित्र को चार्ज करने का व्यवहार ठीक वैसा ही होता है जैसे आपने संधारित्र को चार्ज करने के लिए Vpwm के एक स्थिर वोल्टेज का उपयोग किया था। वांछित वोल्टेज के "पर्याप्त रूप से करीब" प्राप्त करने में हमें अभी भी लगभग 5 आरसी सेकंड लगते हैं।

चरण 7: ए से बी तक पहुंचें, थोड़ा तेज़।

ए से बी तक पहुंचें, थोड़ा तेज।
ए से बी तक पहुंचें, थोड़ा तेज।

मान लीजिए कि हमारे पास एक संधारित्र है जो पहले से ही Va तक चार्ज है। मान लीजिए कि हम b का नया मान लिखने के लिए analogWrite() का उपयोग करते हैं। वोल्टेज Vb प्राप्त होने के लिए आपको न्यूनतम कितना समय इंतजार करना होगा?

यदि आपने 5 RC सेकंड का अनुमान लगाया है, तो यह बहुत अच्छा है! 5 RC सेकंड प्रतीक्षा करके, संधारित्र लगभग Vb तक चार्ज होने वाला है। लेकिन अगर हम चाहें तो वास्तव में थोड़ा कम इंतजार कर सकते हैं।

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

इसलिए उस समय का इंतजार न करने से हमें सुधार दिखाई देता है। समय t_ab वास्तव में 5 RC से थोड़ा कम है।

लेकिन रुकिए, हम इतना बेहतर कर सकते हैं! v_b के ऊपर उस सारे स्थान को देखें। यह Vcc, हमारे लिए उपलब्ध अधिकतम वोल्टेज और Vb के बीच का अंतर है, जिस तक हम पहुंचना चाहते हैं। क्या आप देख सकते हैं कि वह अतिरिक्त वोल्टेज हमें उस स्थान तक पहुँचाने में कैसे मदद कर सकता है जहाँ हम बहुत तेज़ी से जाना चाहते हैं?

चरण 8: टर्बो चार्जर के साथ ए से बी तक पहुंचें

टर्बो चार्जर के साथ ए से बी तक पहुंचें!
टर्बो चार्जर के साथ ए से बी तक पहुंचें!

ये सही है। लक्ष्य वोल्टेज V_b पर PWM का उपयोग करने के बजाय, हम इसे बहुत अधिक, बहुत कम समय के लिए स्थिर Vcc पर रखते हैं। मैं इसे टर्बो चार्जर विधि कहता हूं और यह हमें वहां ले जाता है जहां हम वास्तव में, वास्तव में तेजी से जाना चाहते हैं! समय की देरी के बाद (जिसकी गणना हमें करनी चाहिए), हम V_b पर PWM पर स्विच करके ब्रेक लगाते हैं। यह वोल्टेज को लक्ष्य को ओवरशूट करने से रोकता है।

इस पद्धति के साथ, केवल PWM का उपयोग करने की तुलना में समय के एक अंश में V_a से V_b तक संधारित्र में वोल्टेज को बदलना संभव है। इस तरह आपको जगह मिलती है, बेबी!

चरण 9: कोड को समझें

कोड को समझें
कोड को समझें

एक तस्वीर एक हजार शब्दों के बराबर होती है, इसलिए आरेख डेटा और कोड में किए गए कार्यों को दिखाता है। बाएं से दाएं:

  • ग्राफिक्स डेटा PROGMEM (यानी फ्लैश मेमोरी) में बिंदुओं की सूची के रूप में संग्रहीत किया जाता है।
  • अनुवाद, स्केलिंग और रोटेशन संचालन के किसी भी संयोजन को एक एफाइन ट्रांसफॉर्मेशन मैट्रिक्स में जोड़ा जाता है। यह प्रत्येक एनीमेशन फ्रेम की शुरुआत में एक बार किया जाता है।
  • अंक ग्राफ़िक्स डेटा से एक-एक करके पढ़े जाते हैं और प्रत्येक को संग्रहीत परिवर्तन मैट्रिक्स द्वारा गुणा किया जाता है।
  • रूपांतरित बिंदुओं को एक कैंची एल्गोरिथ्म के माध्यम से खिलाया जाता है जो दृश्य क्षेत्र के बाहर किसी भी बिंदु को क्रॉप करता है।
  • RC विलंब लुकअप तालिका का उपयोग करते हुए, बिंदुओं को ड्राइविंग वोल्टेज और समय विलंब में परिवर्तित किया जाता है। RC विलंब लुकअप तालिका EEPROM में संग्रहीत है और कोड के कई रन के लिए पुन: उपयोग किया जा सकता है। स्टार्टअप पर, सटीकता के लिए RC लुकअप तालिका की जाँच की जाती है और किसी भी गलत मान को अपडेट किया जाता है। EEPROM का उपयोग मूल्यवान RAM मेमोरी को बचाता है।
  • ड्राइविंग वोल्टेज और देरी को फ्रेम बफर में निष्क्रिय फ्रेम में लिखा जाता है। फ़्रेम बफ़र में सक्रिय फ़्रेम और निष्क्रिय फ़्रेम के लिए स्थान होता है। एक बार पूरा फ्रेम लिखे जाने के बाद, निष्क्रिय फ्रेम सक्रिय हो जाता है।
  • एक इंटरप्ट सर्विस रूटीन लगातार सक्रिय फ्रेम बफर से वोल्टेज मूल्यों और देरी को पढ़कर तस्वीर को फिर से खींचता है। उन मूल्यों के आधार पर, यह आउटपुट पिन के कर्तव्य-चक्र को समायोजित करता है। टाइमर 1 का उपयोग समय की देरी को सटीकता के कुछ नैनोसेकंड तक मापने के लिए किया जाता है, जबकि टाइमर 2 का उपयोग पिन के कर्तव्य चक्र को नियंत्रित करने के लिए किया जाता है।
  • वोल्टेज में सबसे बड़े परिवर्तन वाला पिन हमेशा शून्य या 100% के कर्तव्य-चक्र के साथ "टर्बो चार्ज" होता है, जो सबसे तेज़ चार्ज या डिस्चार्ज समय प्रदान करता है। वोल्टेज में कम परिवर्तन वाला पिन पहले पिन के संक्रमण समय से मेल खाने के लिए चुने गए कर्तव्य चक्र से संचालित होता है-इस बार मिलान यह सुनिश्चित करने के लिए महत्वपूर्ण है कि रेखाएं ऑसिलोस्कोप पर सीधे खींची जाती हैं।

चरण 10: बड़ी गति के साथ, बड़ी जिम्मेदारी आती है।

चूँकि यह विधि PWM की तुलना में बहुत तेज़ है, तो इसका उपयोग क्यों नहीं करते analogWrite()? ठीक है, क्योंकि अधिकांश कार्यक्रमों के लिए सिर्फ पीडब्लूएम का उपयोग करना काफी अच्छा है और यह बहुत अधिक क्षमाशील है। हालाँकि, "टर्बो चार्जर" विधि को सावधानीपूर्वक कोडिंग की आवश्यकता होती है और यह केवल विशिष्ट मामलों के लिए उपयुक्त है:

  1. यह समय के प्रति अत्यंत संवेदनशील है। एक बार जब हम लक्ष्य वोल्टेज स्तर तक पहुंच जाते हैं, तो लक्ष्य वोल्टेज को ओवरशूट करने से बचने के लिए ड्राइविंग पिन को तुरंत नियमित पीडब्लूएम मोड में बदल दिया जाना चाहिए।
  2. इसके लिए RC स्थिरांक का ज्ञान आवश्यक है, इसलिए इन मानों को पहले ही दर्ज किया जाना चाहिए। गलत मानों के साथ, समय गलत होगा और वोल्टेज गलत होगा। नियमित पीडब्लूएम के साथ, इस बात की गारंटी है कि आप कुछ समय बाद सही वोल्टेज पर बस जाएंगे, भले ही आरसी स्थिरांक ज्ञात न हो।
  3. संधारित्र को चार्ज करने के लिए सटीक समय अंतराल की गणना करने के लिए लॉगरिदमिक समीकरणों की आवश्यकता होती है जो Arduino पर वास्तविक समय की गणना के लिए बहुत धीमी होती हैं। इन्हें प्रत्येक एनीमेशन फ्रेम से पहले पूर्व-गणना की जानी चाहिए और कहीं मेमोरी में कैश किया जाना चाहिए।
  4. इस पद्धति से निपटने वाले कार्यक्रमों को इस तथ्य से जूझना चाहिए कि देरी बहुत गैर-रैखिक हैं (वे वास्तव में, घातीय हैं)। Vcc या GND के पास लक्ष्य वोल्टेज मध्य बिंदु के पास वोल्टेज की तुलना में अधिक परिमाण के कई आदेशों तक पहुंचने में समय लेगा।

इन सीमाओं को पार करने के लिए, मेरा वेक्टर ग्राफिक्स कोड निम्नलिखित कार्य करता है:

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

सिफारिश की: