- I2C संचार प्रोटोकॉल क्या है?
- I2C संचार कैसे काम करता है?
- I2C संचार का उपयोग कहां करें?
- Arduino में I2C
- अवयव आवश्यक
- सर्किट आरेख
- कार्य की व्याख्या
- Arduino में I2C प्रोग्रामिंग
- मास्टर Arduino प्रोग्रामिंग स्पष्टीकरण
- गुलाम Arduino प्रोग्रामिंग स्पष्टीकरण
हमारे पिछले ट्यूटोरियल में Arduino में SPI संचार के बारे में सीखा। आज हम एक और सीरियल कम्युनिकेशन प्रोटोकॉल: I2C (इंटर इंटीग्रेटेड सर्किट) के बारे में जानेंगे । I2C की तुलना SPI के साथ, I2C में केवल दो तार होते हैं जबकि SPI चार का उपयोग करता है और I2C में एकाधिक मास्टर और दास हो सकते हैं, जबकि SPI में केवल एक मास्टर और कई दास हो सकते हैं। तो एक परियोजना में एक से अधिक माइक्रोकंट्रोलर हैं जिन्हें स्वामी होने की आवश्यकता है, फिर I2C का उपयोग किया जाता है। I2C संचार आमतौर पर गायरोस्कोप, एक्सेलेरोमीटर, बैरोमीटर के दबाव सेंसर, एलईडी डिस्प्ले आदि के साथ संचार करने के लिए उपयोग किया जाता है।
इस Arduino I2C ट्यूटोरियल में हम दो Arduino बोर्डों के बीच I2C संचार का उपयोग करेंगे और पोटेंशियोमीटर का उपयोग करके एक दूसरे को (0 से 127) मान भेजेंगे। मानों को 16x2 एलसीडी पर प्रदर्शित किया जाएगा जो प्रत्येक Arduino से जुड़ा हुआ है। यहाँ एक Arduino मास्टर के रूप में कार्य करेगा और दूसरा एक दास के रूप में कार्य करेगा। तो आइए शुरुआत करते हैं I2C संचार के बारे में।
I2C संचार प्रोटोकॉल क्या है?
IIC शब्द " इंटर इंटीग्रेटेड सर्किट " के लिए है। इसे सामान्य रूप से I2C के रूप में निरूपित किया जाता है या I C या कुछ स्थानों पर 2-वायर इंटरफ़ेस प्रोटोकॉल (TWI) के रूप में भी स्क्वेर किया जाता है, लेकिन यह सभी का अर्थ समान है। I2C एक तुल्यकालिक संचार प्रोटोकॉल अर्थ है, दोनों डिवाइस जो सूचना साझा कर रहे हैं, उन्हें एक सामान्य घड़ी संकेत साझा करना होगा। इसमें जानकारी साझा करने के लिए केवल दो तार हैं जिनमें से एक का उपयोग मुर्गा सिग्नल के लिए किया जाता है और दूसरे का उपयोग डेटा भेजने और प्राप्त करने के लिए किया जाता है।
I2C संचार कैसे काम करता है?
I2C संचार पहली बार फिलिप्स द्वारा पेश किया गया था। जैसा कि पहले कहा गया है कि इसमें दो तार हैं, ये दो तार दो उपकरणों में जुड़े होंगे। यहाँ एक उपकरण को मास्टर और दूसरे उपकरण को दास कहा जाता है । संचार दो मास्टर और एक दास के बीच हमेशा होना चाहिए । I2C संचार का लाभ यह है कि एक से अधिक दास एक मास्टर से जुड़े हो सकते हैं।
संपूर्ण संचार इन दो तारों के माध्यम से होता है, सीरियल क्लॉक (एससीएल) और सीरियल डेटा (एसडीए)।
सीरियल क्लॉक (SCL): मास्टर द्वारा उत्पन्न घड़ी संकेत को दास के साथ साझा करता है
सीरियल डेटा (एसडीए): मास्टर और गुलाम के बीच और बाहर डेटा भेजता है।
किसी भी समय केवल मास्टर संचार शुरू करने में सक्षम होंगे। चूंकि बस में एक से अधिक दास हैं, इसलिए स्वामी को एक अलग पते का उपयोग करके प्रत्येक दास का उल्लेख करना होगा। जब केवल उस विशेष पते वाले दास को संबोधित किया जाता है, तो वह सूचना के साथ वापस आ जाएगा, जबकि बाकी लोग छोड़ देंगे। इस तरह हम एक ही बस का उपयोग कई उपकरणों के साथ संवाद करने के लिए कर सकते हैं।
I2C की वोल्टेज स्तरों पूर्वनिर्धारित नहीं कर रहे हैं । I2C संचार लचीला है, इसका मतलब है कि डिवाइस जो 5v वोल्ट द्वारा संचालित है, I2C के लिए 5v का उपयोग कर सकता है और 3.3v डिवाइस I2C संचार के लिए 3v का उपयोग कर सकता है। लेकिन क्या होगा अगर दो डिवाइस जो विभिन्न वोल्टेज पर चल रहे हैं, उन्हें I2C का उपयोग करके संवाद करने की आवश्यकता है? एक 5V I2C बस 3.3 डिवाइस के साथ नहीं जोड़ा जा सकता । इस मामले में दो I2C बसों के बीच वोल्टेज के स्तर से मेल खाने के लिए वोल्टेज शिफ्टर्स का उपयोग किया जाता है।
कुछ शर्तों के सेट होते हैं जो लेनदेन को फ्रेम करते हैं। ट्रांसमिशन की शुरूआत एसडीए के गिरते हुए किनारे से शुरू होती है, जिसे नीचे दिए गए आरेख में 'स्टार्ट' स्थिति के रूप में परिभाषित किया गया है, जहां मास्टर एसडीए को कम करते हुए एससीएल को छोड़ देता है।
जैसा कि नीचे दिए गए चित्र में दिखाया गया है, एसडीए का गिरता किनारा START स्थिति के लिए हार्डवेयर ट्रिगर है। इसके बाद एक ही बस में सभी उपकरण श्रवण मोड में चले जाते हैं।
उसी तरीके से, एसडीए के बढ़ते किनारे संचरण को रोकते हैं जो ऊपर आरेख में 'STOP' स्थिति के रूप में दिखाया गया है, जहां मास्टर SCL को छोड़ देता है और उच्च जाने के लिए SDA भी जारी करता है। इसलिए एसडीए की बढ़ती बढ़त ट्रांसमिशन को रोक देती है।
आर / डब्ल्यू बिट निम्नलिखित बाइट्स के संचरण की दिशा को इंगित करता है, अगर यह उच्च का मतलब है कि दास संचारित होगा और यदि यह कम है तो इसका मतलब है कि मास्टर संचारित होगा।
प्रत्येक घड़ी चक्र पर प्रत्येक बिट को प्रेषित किया जाता है, इसलिए एक बाइट प्रसारित करने के लिए 8 घड़ी चक्र लगते हैं। प्रत्येक बाइट के बाद या तो भेजा या प्राप्त किया, नौवें घड़ी चक्र ACK / NACK के लिए आयोजित किया जाता है (स्वीकार / स्वीकार नहीं)। यह एसीके बिट स्थिति के आधार पर दास या मास्टर द्वारा उत्पन्न होता है। ACK बिट के लिए, SDA को 9 वें क्लॉक चक्र पर मास्टर या दास द्वारा कम पर सेट किया जाता है। तो यह कम है क्योंकि इसे ACK अन्यथा NACK माना जाता है।
I2C संचार का उपयोग कहां करें?
I2C संचार का उपयोग केवल कम दूरी के संचार के लिए किया जाता है । यह निश्चित रूप से एक हद तक विश्वसनीय है क्योंकि इसमें स्मार्ट बनाने के लिए एक सिंक्रनाइज़ घड़ी पल्स है। यह प्रोटोकॉल मुख्य रूप से सेंसर या अन्य उपकरणों के साथ संचार करने के लिए उपयोग किया जाता है, जिसे किसी मास्टर को जानकारी भेजनी होती है। यह बहुत आसान है जब एक माइक्रोकंट्रोलर को केवल अन्य तारों का उपयोग करके कई अन्य गुलाम मॉड्यूल के साथ संवाद करना पड़ता है। यदि आप एक लंबी दूरी के संचार की तलाश कर रहे हैं, तो आपको RS232 की कोशिश करनी चाहिए और यदि आप अधिक विश्वसनीय संचार की तलाश कर रहे हैं, तो आपको SPI प्रोटोकॉल का प्रयास करना चाहिए।
Arduino में I2C
नीचे दी गई छवि Arduino UNO में मौजूद I2C पिंस को दिखाती है।
I2C रेखा | Arduino में पिन करें |
एसडीए | ए 4 |
एससीएल | A5 |
इससे पहले कि हम दो Arduino का उपयोग करके प्रोग्रामिंग I2C में शुरू करें। हमें Arduino IDE में प्रयुक्त वायर लाइब्रेरी के बारे में जानने की आवश्यकता है ।
पुस्तकालय
1. वायर.बीजिन (पता):
उपयोग: इस लाइब्रेरी का उपयोग I2C उपकरणों के साथ संचार करने के लिए किया जाता है। यह वायर लाइब्रेरी को आरंभ करता है और I2C बस में एक मास्टर या दास के रूप में शामिल होता है।
पता: 7-बिट स्लेव एड्रेस वैकल्पिक है और यदि पता निर्दिष्ट नहीं है, तो यह बस में एक मास्टर की तरह शामिल होता है।
2. वायर। ():
उपयोग: इस फ़ंक्शन का उपयोग एक बाइट को पढ़ने के लिए किया जाता है जो मास्टर या दास डिवाइस से प्राप्त किया गया था, जो या तो दास डिवाइस से एक मास्टर डिवाइस में अनुरोध () के बाद कॉल करने के लिए प्रेषित किया गया था या एक मास्टर से एक दास को प्रेषित किया गया था।
3. वायर.राइट ():
उपयोग: इस फ़ंक्शन का उपयोग दास या मास्टर डिवाइस पर डेटा लिखने के लिए किया जाता है।
स्लेव टू मास्टर: स्लेव एक मास्टर को डेटा लिखता है, जब वायर। RestestFrom () का उपयोग मास्टर में किया जाता है।
मास्टर टू स्लेव: एक मास्टर से स्लेव डिवाइस तक संचरण के लिए Wire.write () का उपयोग वायर -beginTransmission () और वायर.endTransmission () के बीच में कॉल के लिए किया जाता है ।
वायर.राइट () के रूप में लिखा जा सकता है:
- वायर। राइट (मूल्य)
मूल्य: एक बाइट के रूप में भेजने के लिए एक मूल्य।
- वायर.राइट (स्ट्रिंग):
स्ट्रिंग: बाइट्स की एक श्रृंखला के रूप में भेजने के लिए एक स्ट्रिंग।
- वायर.राइट (डेटा, लंबाई):
डेटा: बाइट्स के रूप में भेजने के लिए डेटा की एक सरणी
लंबाई: प्रेषित करने के लिए बाइट्स की संख्या।
4. वायर.beginTransmission (पता):
उपयोग: इस फ़ंक्शन का उपयोग दिए गए गुलाम पते के साथ I2C डिवाइस पर एक ट्रांसमिशन शुरू करने के लिए किया जाता है। इसके बाद, लेखन () फ़ंक्शन के साथ ट्रांसमिशन के लिए बाइट्स की कतार बनाएं और फिर एंडट्रांसमीशन () फ़ंक्शन को कॉल करके उन्हें प्रसारित करें । डिवाइस का 7-बिट पता प्रसारित किया जाता है।
5. वायर.endTransmission ();
उपयोग करें: इस फ़ंक्शन का उपयोग एक गुलाम डिवाइस के प्रसारण को समाप्त करने के लिए किया जाता है जो कि स्टार्टट्रांसमीशन () द्वारा शुरू किया गया था और बाइट्स को प्रसारित करता है जो वायर द्वारा लिखित थे ()।
6. वायर.ऑनस्प्रेस्ट ();
उपयोग करें: इस फ़ंक्शन को तब बुलाया जाता है जब एक मास्टर गुलाम डिवाइस से Wire.requestFrom () का उपयोग करके डेटा का अनुरोध करता है। यहां हम मास्टर को डेटा भेजने के लिए वायर.राइट () फ़ंक्शन को शामिल कर सकते हैं ।
7. वायर.ऑनर्सिव ();उपयोग: इस फ़ंक्शन को तब बुलाया जाता है जब एक गुलाम डिवाइस एक मास्टर से डेटा प्राप्त करता है। यहाँ हम Wire.read () शामिल कर सकते हैं ; कार्य मास्टर से भेजे गए डेटा को पढ़ने के लिए।
8. वायर.requestFrom (पता, मात्रा);
उपयोग: इस फ़ंक्शन का उपयोग मास्टर में दास डिवाइस से बाइट्स का अनुरोध करने के लिए किया जाता है। फ़ंक्शन वायर.read () का उपयोग दास डिवाइस से भेजे गए डेटा को पढ़ने के लिए किया जाता है।
पता: बाइट्स से अनुरोध करने के लिए डिवाइस का 7-बिट पता
मात्रा: अनुरोध करने के लिए बाइट्स की संख्या
अवयव आवश्यक
- Arduino Uno (2-Nos)
- 16X2 एलसीडी डिस्प्ले मॉड्यूल
- 10K पोटेंशियोमीटर (4-Nos)
- ब्रेड बोर्ड
- तारों को जोड़ना
सर्किट आरेख
कार्य की व्याख्या
यहाँ Arduino में I2C संचार का प्रदर्शन करने के लिए, हम दो Arduino UNO का उपयोग दो 16X2 LCD डिस्प्ले के साथ करते हैं, जो एक दूसरे से जुड़े हुए हैं और दो arentino में दो पोटेंशियोमीटर का उपयोग करते हैं, जो गुरु से दास और दास से अलग-थलग करने के लिए मास्टर (दास से दास) भेजने के मूल्यों (0 से 127) का निर्धारण करते हैं। शक्ति नापने का यंत्र।
हम पोटेंटियोमीटर का उपयोग करके arduino pin A0 से (0 से 5V) पर इनपुट एनालॉग वैल्यू लेते हैं और उन्हें एनालॉग से डिजिटल वैल्यू (0 से 1023) में परिवर्तित करते हैं। फिर ये ADC मान (0 से 127) में परिवर्तित हो जाते हैं क्योंकि हम I2C संचार के माध्यम से केवल 7-बिट डेटा भेज सकते हैं। I2C संचार दो तारों के माध्यम से होता है और दोनों arduino के A4 A4 और A5 पर।
स्लेव अरुडिनो के एलसीडी पर मूल्यों को मास्टर की ओर से पॉट को अलग करके और इसके विपरीत बदला जाएगा।
Arduino में I2C प्रोग्रामिंग
इस ट्यूटोरियल में मास्टर अर्डुइनो के लिए एक और गुलाम अरुडिनो के लिए दो कार्यक्रम हैं। इस परियोजना के अंत में प्रदर्शन वीडियो के साथ दोनों पक्षों के लिए पूर्ण कार्यक्रम दिए गए हैं ।
मास्टर Arduino प्रोग्रामिंग स्पष्टीकरण
1. सबसे पहले हमें एलसीडी कार्यों का उपयोग करने के लिए I2C संचार कार्यों और एलसीडी पुस्तकालय का उपयोग करने के लिए वायर लाइब्रेरी को शामिल करना होगा। 16x2 एलसीडी के लिए एलसीडी पिन भी परिभाषित करें। यहाँ Arduino के साथ एलसीडी को बदलने के बारे में अधिक जानें।
#शामिल
2. शून्य सेटअप में ()
- हम बौड रेट 9600 पर सीरियल कम्युनिकेशन शुरू करते हैं।
सीरियल.बेगिन (9600);
- अगला हम पिन पर I2C संचार शुरू करते हैं (A4, A5)
तार.बेगिन (); // पिन पर I2C संचार शुरू करता है (A4, A5)
- अगला हम 16X2 मोड में एलसीडी डिस्प्ले मॉड्यूल को इनिशियलाइज़ करते हैं और स्वागत संदेश प्रदर्शित करते हैं और पाँच सेकंड के बाद साफ़ करते हैं।
lcd.begin (16,2); // एलसीडी डिस्प्ले lcd.setCursor (0,0) को सम्मिलित करें; // सेट कर्सर को प्रदर्शन lcd.print ("सर्किट डाइजेस्ट") की पहली पंक्ति में ; // LCD lcd.setCursor (0,1) में प्रिंट CIRCUIT DIGEST ; // सेट कर्सर को प्रदर्शन lcd.print की दूसरी पंक्ति में ("I2C 2 ARDUINO"); // एलसीडी विलंब (5000) में प्रिंट I2C ARDUINO ; // 5 सेकंड के लिए विलंब lcd.clear (); // एलसीडी डिस्प्ले साफ़ करता है
3. शून्य लूप () में
- पहले हमें स्लेव से डेटा प्राप्त करने की आवश्यकता है ताकि हम स्लेव एड्रेस 8 के साथ requestFrom () का उपयोग करें और हम एक बाइट का अनुरोध करें
वायर.requestFrom (8,1);
प्राप्त मान को वायर.डर () का उपयोग करके पढ़ा जाता है
बाइट MasterReceive = Wire.read ();
- अगला हमें पिन A0 से संलग्न मास्टर arduino POT से एनालॉग मूल्य को पढ़ने की आवश्यकता है
int potvalue = analogRead (A0);
हम उस मूल्य को 0 से 127 तक एक बाइट के रूप में परिवर्तित करते हैं।
बाइट मास्टरसेंड = नक्शा (पॉटवेल्यू, 0,1023,0,127);
- आगे हमें उन परिवर्तित मूल्यों को भेजने की आवश्यकता है ताकि हम 8 पते के साथ दास आर्डिनो के साथ प्रसारण शुरू करें
वायर.beginTransmission (8); वायर.राइट (मास्टरसेंड); वायर.endTransmission ();
- आगे हम दास आर्डिनो से प्राप्त मूल्यों को 500 माइक्रोसेकंड की देरी से प्रदर्शित करते हैं और हम उन मूल्यों को लगातार प्राप्त करते हैं और प्रदर्शित करते हैं।
lcd.setCursor (0,0); // एलसीडी एलसीडी की लाइन एक पर कर्सर सेट करता है। "(" >> मास्टर << "); // प्रिंट >> मास्टर << एलसीडी lcd.setCursor (0,1) पर; // LCD lcd.print ("SlaveVal:") के लाइन दो पर कर्सर सेट करता है ; // प्रिंट्स SlaveVal: एलसीडी lcd.print (MasterReceive) में; // प्रिंट्स मास्टर मास्टर इन एलसीडी इन स्लेव सेरियल.प्रिंट्लन ("स्लेव से प्राप्त मास्टर"); // सीरियल मॉनीटर में प्रिंट्स Serial.println (MasterReceive); देरी (500); lcd.clear ();
गुलाम Arduino प्रोग्रामिंग स्पष्टीकरण
1. मास्टर के रूप में ही, सबसे पहले हमें एलसीडी कार्यों का उपयोग करने के लिए I2C संचार कार्यों और एलसीडी पुस्तकालय का उपयोग करने के लिए वायर लाइब्रेरी को शामिल करना होगा। 16x2 एलसीडी के लिए एलसीडी पिन भी परिभाषित करें।
#शामिल
2. शून्य सेटअप में ()
- हम बौड रेट 9600 पर सीरियल कम्युनिकेशन शुरू करते हैं।
सीरियल.बेगिन (9600);
- इसके बाद हम गुलाम पते के साथ पिन (A4, A5) पर I2C संचार शुरू करते हैं। 8. यहाँ दास पता निर्दिष्ट करना महत्वपूर्ण है।
तार ।begin (8);
आगे हमें फ़ंक्शन को कॉल करने की आवश्यकता है जब स्लेव को मास्टर से मूल्य प्राप्त होता है और जब मास्टर स्लेव से मूल्य का अनुरोध करता है
वायर.ऑनर्सिव (प्राप्त करें); वायर.ऑनएरपेस्ट (अनुरोध);
- अगला हम 16X2 मोड में एलसीडी डिस्प्ले मॉड्यूल को इनिशियलाइज़ करते हैं और स्वागत संदेश प्रदर्शित करते हैं और पाँच सेकंड के बाद साफ़ करते हैं।
lcd.begin (16,2); // एलसीडी डिस्प्ले lcd.setCursor (0,0) को सम्मिलित करें; // सेट कर्सर को प्रदर्शन lcd.print ("सर्किट डाइजेस्ट") की पहली पंक्ति में ; // LCD lcd.setCursor (0,1) में प्रिंट CIRCUIT DIGEST ; // सेट कर्सर को प्रदर्शन lcd.print की दूसरी पंक्ति में ("I2C 2 ARDUINO"); // एलसीडी विलंब (5000) में प्रिंट I2C ARDUINO ; // 5 सेकंड के लिए विलंब lcd.clear (); // एलसीडी डिस्प्ले साफ़ करता है
3. अगला हमारे पास अनुरोध फ़ंक्शन के लिए दो और एक ईवेंट प्राप्त करने के लिए है
अनुरोध के लिए घटना
जब मास्टर अनुरोध दास से इस फ़ंक्शन को निष्पादित करेगा। यह फ़ंक्शन स्लेव पॉट से इनपुट मूल्य लेता है और इसे 7-बिट के रूप में परिवर्तित करता है और उस मूल्य को मास्टर को भेजता है।
शून्य अनुरोध () { int potvalue = analogRead (A0); बाइट स्लेवसेंड = नक्शा (पॉटवेल्यू, 0,1023,0,127); वायर.राइट (स्लेवसेंड); }
प्राप्त घटना के लिए
जब मास्टर गुलाम को गुलाम के पते के साथ डेटा भेजता है (8) इस फ़ंक्शन को निष्पादित किया जाएगा। यह फ़ंक्शन मास्टर और स्टोर से प्राप्त मूल्य को टाइप बाइट के एक चर में पढ़ता है ।
शून्य receiveEvent (पूर्णांक howmany { SlaveReceived = Wire.read (); }
4. शून्य लूप () में:
हम एलसीडी डिस्प्ले मॉड्यूल में लगातार मास्टर से प्राप्त मूल्य प्रदर्शित करते हैं।
शून्य लूप (शून्य) { lcd.setCursor (0,0); // एलसीडी एलसीडी की लाइन एक पर कर्सर सेट करता है। (">> दास <<"); // प्रिंट्स >> गुलाम << LCD lcd.setCursor (0,1) पर; // LCD lcd.print ("MasterVal:") के लाइन दो पर कर्सर सेट करता है ; // प्रिंट्स मास्टरवैल: एलसीडी lcd.print (SlaveReceived) में; // मास्टर Serial.println से प्राप्त एलसीडी में प्रिंट SlaveReceived मान ("मास्टर से प्राप्त दास:"); // सीरियल मॉनिटर में प्रिंट सीरियल Serprint.println (SlaveReceived); देरी (500); lcd.clear (); }
तक एक साइड को नापने घूर्णन, तो आप एक तरफ एलसीडी पर अलग-अलग मान देख सकते हैं:
तो यह है कि Arduino में I2C संचार कैसे होता है, यहाँ हम दो Arduinos का उपयोग करते हैं न केवल डेटा भेजने के लिए, बल्कि I2C संचार का उपयोग करके डेटा प्राप्त कर रहे हैं। तो अब आप किसी भी I2C सेंसर को Arduino पर इंटरफ़ेस कर सकते हैं।
मास्टर और स्लेव अरुडिनो के लिए पूरा कोडिंग एक प्रदर्शन वीडियो के साथ नीचे दिया गया है