इस व्यावहारिक और व्यापक परियोजना के साथ अपने आस-पास की दुनिया को मापना शुरू करें।

चाबी छीनना

  • रास्पबेरी पाई में एनालॉग इनपुट का अभाव है, लेकिन आप रिकॉर्डिंग, हेरफेर और नियंत्रण के लिए वास्तविक दुनिया से वोल्टेज को डिजिटल रूप में परिवर्तित करने के लिए बाहरी एडीसी जोड़ सकते हैं।
  • लोकप्रिय ADC विकल्पों में गति और सटीक ट्रेडऑफ़ के लिए MCP3004/MCP3008 या धीमी नमूना दर पर 16-बिट रीडिंग के लिए ADS111x शामिल हैं।
  • Adafruit का ADS1115 प्रोग्रामेबल गेन एम्पलीफायर (PGA) के साथ एक सरल विकल्प है जो आपको प्रोग्राम के दौरान छोटे वोल्टेज अंतर का पता लगाने और लाभ को समायोजित करने की अनुमति देता है। I2C का उपयोग करके इसे रास्पबेरी पाई के साथ जोड़ना सीधा है।

बॉक्स से बाहर, रास्पबेरी पाई में एनालॉग इनपुट का अभाव है। यह इसे Arduino जैसे माइक्रोकंट्रोलर-आधारित बोर्डों की तुलना में नुकसान में डालता है।

लेकिन निराश न हों: विचार करने के लिए बहुत सारे विकल्प हैं। रास्पबेरी पाई और एक बाहरी एडीसी के साथ उठें और काम करें।

इनपुट क्यों जोड़ें?

वास्तविक दुनिया घटनाओं से भरी है, यदि आपके पास सही सर्किटरी है, तो वोल्टेज का उपयोग करके आसानी से वर्णित किया जा सकता है। उन वोल्टेज को डिजिटल रूप में प्राप्त करें, और आप उन्हें रिकॉर्ड कर सकते हैं, उनमें हेरफेर कर सकते हैं, और अन्य मापदंडों और उपकरणों को नियंत्रित करने के लिए उनका उपयोग कर सकते हैं।

instagram viewer

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

एडीसी के लिए विकल्प

तो, शुरुआती लोगों के लिए कौन सा एडीसी सर्वोत्तम है?

सबसे लोकप्रिय और सीधे विकल्पों में से हैं एमसीपी3004 (और एमसीपी3008) माइक्रोचिप से चिप्स। आपको प्रत्येक 10 बिट के चार (या आठ) चैनल मिलेंगे, जो 200 केएसपीएस तक पढ़ सकते हैं। दूसरी ओर, टेक्सास इंस्ट्रूमेंट्स के ADS111x डिवाइस हैं, जो 860 एसपीएस पर 16 बिट्स पढ़ते हैं। तो, गति और परिशुद्धता (और, स्वाभाविक रूप से, कीमत) के बीच एक समझौता है।

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

यहां, हम Adafruit के ADS1115 के साथ इसे सरल रखेंगे।

प्रोग्रामेबल गेन एम्पलीफायर क्या है?

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

यहां लाभ यह है कि आप कार्यक्रम के बीच में ही लाभ को बदल सकते हैं। अन्य चिप्स, जैसे MCP3004, एक अलग दृष्टिकोण अपनाते हैं; वे एक अतिरिक्त पिन के साथ आते हैं, जिससे आप एक संदर्भ वोल्टेज की आपूर्ति कर सकते हैं।

मल्टीप्लेक्सिंग के बारे में क्या?

मल्टीप्लेक्सर (या मक्स) एक स्विच है जो आपको एक ही एडीसी का उपयोग करके कई इनपुट पढ़ने की सुविधा देता है। यदि आपकी एडीसी चिप कई इनपुट पिनों के साथ आती है, तो कुछ आंतरिक मल्टीप्लेक्सिंग चल रही है। ADS1115 का mux चार इनपुट की अनुमति देता है, जिसे आप आंतरिक रजिस्टरों के माध्यम से चुन सकते हैं।

रजिस्टरों से निपटना

ADS1115 ये विकल्प प्रदान करता है, और इसके अलावा कुछ और भी। आप मल्टीप्लेक्सर से निपट सकते हैं, लाभ को समायोजित कर सकते हैं, अंतर्निहित तुलनित्र को सक्रिय कर सकते हैं, नमूना दर को बदल सकते हैं, और डिवाइस को कुछ स्विच फ्लिप करके कम-पावर स्लीप मोड में डाल सकते हैं।

लेकिन वे स्विच कहां हैं? वे मेमोरी के बहुत छोटे टुकड़ों के रूप में पैकेज के अंदर हैं रजिस्टर. किसी दिए गए फीचर को सक्रिय करने के लिए, आपको संबंधित बिट को 0 के बजाय 1 पर सेट करना होगा।

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

उदाहरण के लिए, बिट्स 14 से 12 मल्टीप्लेक्सर को नियंत्रित करते हैं। इन तीन बिट्स का उपयोग करके, आप आठ कॉन्फ़िगरेशन में से चयन कर सकते हैं। आप यहां जो चाहते हैं वह "100" है, जो इनपुट शून्य और ग्राउंड के बीच का अंतर बताएगा। दूसरी ओर, बिट्स 7 से 5, नमूना दर को नियंत्रित करते हैं। यदि आप प्रति सेकंड अधिकतम 860 नमूने चाहते हैं, तो आप इन्हें "111" पर सेट कर सकते हैं।

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

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

इसे तार-तार करना

आप इस डिवाइस को सीधे ब्रेडबोर्ड में प्लग कर सकते हैं। सकारात्मक वोल्टेज इनपुट 2 और 5.5v के बीच कहीं भी स्वीकार करेगा, जिसका अर्थ है कि रास्पबेरी पाई पर 3.3v रेल अच्छी तरह से काम करेगी।

एसडीए और एससीएल इनपुट को आरपीआई पर समकक्षों से तार दें, और ग्राउंड और 3.3v के साथ भी यही काम करें। जमीन और वोल्टेज लाइनों के बीच एक पोटेंशियोमीटर प्राप्त करें, और मध्य लीड को एडीसी के पहले इनपुट में डालें। आपको आगे बढ़ने के लिए बस इतना ही चाहिए!

I2C से निपटना

विभिन्न एडीसी विभिन्न प्रोटोकॉल के माध्यम से काम करते हैं। हमारे ADS1115 के मामले में, हम I2C का उपयोग करने जा रहे हैं.

निम्नलिखित उदाहरण पायथन का उपयोग करके एडीसी के साथ बातचीत करेगा। लेकिन ऐसा करने से पहले, आपको इसे सेट अप करना होगा। रास्पबेरी पाई ओएस के हाल के संस्करणों ने इसे बहुत सरल बना दिया है। की ओर जाना प्राथमिकताएँ > रास्पबेरी पाई कॉन्फ़िगरेशन. फिर, से इंटरफेस टैब, स्विच I2C पर।

यह जाँचने के लिए कि सब कुछ काम कर रहा है, एक टर्मिनल खोलें और चलाएँ:

sudo i2cdetect -y 1

यह कमांड एक ग्रिड आउटपुट करेगा. यह मानते हुए कि सब कुछ काम कर रहा है, और आपने इसे सही ढंग से जोड़ा है, आपको ग्रिड में एक नया मान दिखाई देगा। यह आपके ADC का पता है. यहां ध्यान रखें कि यह एक हेक्साडेसिमल मान है, इसलिए आपको इसके साथ उपसर्ग लगाना होगा "0x" जब आप इसे नीचे दिए गए कोड में उपयोग करते हैं। यहाँ यह है 0x48:

एक बार जब आपके पास पता हो, तो आप I2C कमांड भेजने के लिए SMBus लाइब्रेरी का उपयोग कर सकते हैं। आप यहां दो तरीकों से निपटेंगे। पहला है राइट_वर्ड_डेटा(), जो तीन तर्कों को स्वीकार करता है: डिवाइस का पता, वह रजिस्टर जिस पर आप लिख रहे हैं, और वह मान जिसे आप लिखना चाहते हैं।

दूसरा है read_word_data(), जो केवल डिवाइस पता और रजिस्टर स्वीकार करता है। एडीसी लगातार वोल्टेज पढ़ेगा और परिणाम को रूपांतरण रजिस्टर में संग्रहीत करेगा। इस विधि से, आप उस रजिस्टर की सामग्री पुनः प्राप्त कर सकते हैं।

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

from smbus import SMBus
import time
addr = 0x48
bus = SMBus(1)

# set the registers for reading
CONFIGREG = 1
CONVERSIONREG = 0

# set the address register to point to the config register
# write to the config registers
bus.write_word_data(addr, CONFIGREG, (0b00000100 << 8 | 0b10000010))

# define the top of the range
TOP = 26300

whileTrue:
# read the register
b = bus.read_word_data(addr, CONVERSIONREG)

# swap the two bytes
b = ((b & 0xFF) << 8) | ((b >> 8) & 0xFF)

# subtract half the range to set ground to zero
b -= 0x8000

# divide the result by the range to give us a value between zero and one
b /= TOP

# cap at one
b = min(b, 1)

# bottom is zero
b = max(b, 0)

# two decimal places
b = round(b, 2)
print(b)
time.sleep(.01)

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

शोर से निपटना

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

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

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

कई संभावित अगले चरणों के साथ आगे बढ़ें

I2C के माध्यम से रीडिंग लेना बहुत सरल है और यही बात SPI जैसी अन्य विधियों के लिए भी काफी हद तक सच है। हालांकि ऐसा लग सकता है कि उपलब्ध एडीसी विकल्पों के बीच बड़े अंतर हैं, सच्चाई यह है कि एक बार जब आप उनमें से एक को काम में ले लेते हैं, तो ज्ञान को दूसरों पर लागू करना आसान हो जाता है।

तो, क्यों न चीजों को आगे बढ़ाया जाए? कई पोटेंशियोमीटर को एक साथ बांधें, या प्रकाश, ध्वनि या तापमान पढ़ने का प्रयास करें। आपके द्वारा अभी बनाए गए नियंत्रक का विस्तार करें, और एक रास्पबेरी पाई सेटअप बनाएं जो वास्तव में व्यावहारिक है!