लोकप्रिय I2C प्रोटोकॉल दो या अधिक Arduino बोर्डों को संचार करने में सक्षम बनाता है। डिस्कवर करें कि उन्हें कैसे कनेक्ट करें और कोड करें।
जबकि एक एकल Arduino कई कार्यों को पूरा कर सकता है, कुछ परियोजनाओं को विभिन्न कार्यात्मकताओं को संभालने के लिए एक से अधिक बोर्डों के उपयोग की आवश्यकता हो सकती है। इसलिए, दो माइक्रोकंट्रोलर्स के बीच डेटा ट्रांसफर को सक्षम करने के लिए, CAN, SPI, I2C, या UART जैसे संचार प्रोटोकॉल को स्थापित किया जाना चाहिए।
इस गाइड में, हम I2C कैसे काम करते हैं, हार्डवेयर कनेक्शन और I2C मास्टर और स्लेव डिवाइस के रूप में दो Arduino बोर्ड स्थापित करने के लिए आवश्यक सॉफ़्टवेयर कार्यान्वयन की मूल बातें शामिल करेंगे।
I2C क्या है?
इंटर-इंटीग्रेटेड सर्किट (I2C) इलेक्ट्रॉनिक उपकरणों के बीच डेटा ट्रांसफर को सक्षम करने के लिए एम्बेडेड सिस्टम और माइक्रोकंट्रोलर्स में व्यापक रूप से उपयोग किया जाने वाला संचार प्रोटोकॉल है। SPI (सीरियल पेरिफेरल इंटरफ़ेस) के विपरीत, I2C आपको एक से अधिक मास्टर डिवाइस को सिंगल या मल्टीपल स्लेव डिवाइस के साथ बस से कनेक्ट करने की अनुमति देता है। यह पहली बार फिलिप्स द्वारा उपयोग किया गया था और इसे टू वायर इंटरफेस (TWI) संचार प्रोटोकॉल के रूप में भी जाना जाता है।
I2C संचार कैसे काम करता है?
I2C दो द्विदिश लाइनों का उपयोग करता है: डेटा स्थानांतरित करने और उपकरणों के बीच संचार को सिंक्रनाइज़ करने के लिए सीरियल डेटा (SDA) और सीरियल क्लॉक (SCL)। I2C बस से जुड़े प्रत्येक उपकरण का एक अनूठा पता होता है जो संचार के दौरान इसकी पहचान करता है। I2C प्रोटोकॉल कई डिवाइसों को एक ही बस साझा करने की अनुमति देता है, और प्रत्येक डिवाइस मास्टर या दास के रूप में कार्य कर सकता है।
संचार मास्टर डिवाइस द्वारा शुरू किया गया है, और दास उपकरणों के गलत पते से स्थानांतरण में त्रुटियां हो सकती हैं। पर हमारी गहन मार्गदर्शिका देखें UART, SPI और I2C सीरियल कम्युनिकेशन कैसे काम करते हैं आपको कुछ संदर्भ देने के लिए।
ध्यान देने योग्य I2C संचार का एक प्रमुख लाभ वह लचीलापन है जो यह बिजली प्रबंधन की बात करते समय प्रदान करता है। विभिन्न वोल्टेज स्तरों पर काम करने वाले उपकरण अभी भी वोल्टेज शिफ्टर्स की मदद से प्रभावी ढंग से संचार कर सकते हैं। इसका मतलब यह है कि 3.3V पर चलने वाले उपकरणों को 5V I2C बस से कनेक्ट करने के लिए वोल्टेज शिफ्टर्स की आवश्यकता होती है।
द वायर लाइब्रेरी
द वायर लाइब्रेरी एक अंतर्निहित Arduino लाइब्रेरी है जो I2C पर संचार करने के लिए कार्य प्रदान करती है। यह I2C संचार के लिए Arduino बोर्ड पर दो पिन-SDA और SCL- का उपयोग करता है।
Arduino Uno पर I2C पिन:
Arduino नैनो I2C पिन:
पुस्तकालय का उपयोग करने के लिए, आपको शामिल करना होगा वायर.एच आपके Arduino स्केच की शुरुआत में हेडर फ़ाइल।
#शामिल करना
वायर लाइब्रेरी I2C डिवाइस के साथ संचार आरंभ करने, डेटा भेजने और डेटा प्राप्त करने के लिए कार्य प्रदान करती है। आपको पता होना चाहिए कि कुछ महत्वपूर्ण कार्यों में शामिल हैं:
- वायर.शुरू (): I2C बस में शामिल होने और संचार आरंभ करने के लिए उपयोग किया जाता है।
- वायर.बीगिन ट्रांसमिशन (): गुलाम का पता निर्दिष्ट करने और प्रसारण शुरू करने के लिए उपयोग किया जाता है।
- वायर.राइट (): I2C डिवाइस को डेटा भेजने के लिए उपयोग किया जाता है।
- वायर.एंड ट्रांसमिशन (): ट्रांसमिशन को समाप्त करने और त्रुटियों की जांच करने के लिए उपयोग किया जाता है।
- वायर.रिक्वेस्टफ्रॉम (): I2C डिवाइस से डेटा का अनुरोध करने के लिए उपयोग किया जाता है।
- वायर.उपलब्ध (): I2C डिवाइस से पढ़ने के लिए डेटा उपलब्ध है या नहीं, यह जांचने के लिए उपयोग किया जाता है।
- वायर.रीड (): I2C डिवाइस से डेटा पढ़ने के लिए उपयोग किया जाता है।
उपयोग वायर.बीगिन ट्रांसमिशन () सेंसर का पता सेट करने के लिए फ़ंक्शन, जो तर्क के रूप में डाला गया है। उदाहरण के लिए, यदि सेंसर का पता है 0x68, आप उपयोग करेंगे:
तार.startTransmission(0x68);
Arduino I2C हार्डवेयर सेटअप
I2C का उपयोग करके दो Arduino बोर्डों को जोड़ने के लिए, आपको निम्नलिखित हार्डवेयर घटकों की आवश्यकता होगी:
- दो Arduino बोर्ड (मास्टर और गुलाम)
- ब्रेड बोर्ड
- जम्पर तार
- दो 4.7kΩ पुल-अप प्रतिरोधक
कनेक्ट करें एसडीए और एससीएल एक ब्रेडबोर्ड पर दोनों Arduino बोर्डों के पिन। के बीच पुल-अप प्रतिरोधों को कनेक्ट करें एसडीए और एससीएल पिन और 5वी ब्रेडबोर्ड पर पावर रेल। अंत में, जम्पर तारों का उपयोग करके दो ब्रेडबोर्ड को एक साथ जोड़ दें।
Arduino Uno सर्किट
Arduino नैनो सर्किट
Arduino बोर्ड को I2C मास्टर और स्लेव डिवाइस के रूप में सेट करना
उपयोग वायर.रिक्वेस्टफ्रॉम () उस स्लेव डिवाइस का पता निर्दिष्ट करने के लिए कार्य करें जिसके साथ हम संचार करना चाहते हैं। फिर प्रयोग करें वायर.रीड () गुलाम डिवाइस से डेटा प्राप्त करने के लिए कार्य करें।
मास्टर डिवाइस कोड:
#शामिल करना
खालीपनस्थापित करना(){
तार.शुरू(); // i2c बस में शामिल हों
धारावाहिक.शुरू(9600); // आउटपुट के लिए सीरियल शुरू करें
}
खालीपनडेटा प्राप्त करना(){
int यहाँ पता = 8;
int यहाँ बाइट टू रीड = 6;
तार.से अनुरोध(पता, बाइट्स टू रीड);
जबकि (तार.उपलब्ध()) {
चार डेटा = तार.पढ़ना();
धारावाहिक.छपाई(आंकड़े);
}
देरी(500);
}
खालीपनकुंडली(){
डेटा प्राप्त करना();
}
वायर.ऑन रिसीव () फ़ंक्शन का उपयोग यह निर्दिष्ट करने के लिए किया जाता है कि दास को मास्टर डिवाइस से डेटा प्राप्त होने पर क्या करना है। उपरोक्त कोड में, वायर.उपलब्ध () फ़ंक्शन जाँचता है कि क्या डेटा उपलब्ध है, और वायर.रीड () फ़ंक्शन मास्टर डिवाइस द्वारा भेजे गए डेटा को पढ़ता है।
गुलाम डिवाइस कोड:
#शामिल करना
खालीपनस्थापित करना(){
तार.शुरू(8); // पता 8 के साथ I2C बस में शामिल हों
तार.onReceive(प्राप्त घटना); // डेटा प्राप्त होने पर कॉल प्राप्त करें
}
खालीपनकुंडली(){
देरी(100);
}
खालीपनप्राप्त करें(int यहाँ बाइट्स){
तार.लिखना("नमस्ते "); // मास्टर द्वारा अपेक्षित 6 बाइट्स के संदेश के साथ प्रतिक्रिया दें
}
I2C का उपयोग करके डेटा भेजना और प्राप्त करना
इस उदाहरण में, आइए एक DHT11 तापमान संवेदक से तापमान को दास Arduino के साथ इंटरफेस करें और इसे मास्टर Arduino के सीरियल मॉनिटर पर प्रिंट करें।
तापमान माप को शामिल करने के लिए हमने पहले लिखे गए कोड को संशोधित करते हैं जिसे हम I2C बस में मास्टर बोर्ड को भेजेंगे। मास्टर बोर्ड तब हमारे द्वारा भेजे गए मान को पढ़ सकता है, फिर उसे सीरियल मॉनीटर पर प्रदर्शित कर सकता है।
मास्टर डिवाइस कोड:
#शामिल करना
खालीपनस्थापित करना(){
तार.शुरू();
धारावाहिक.शुरू(9600);
धारावाहिक.println("मास्टर प्रारंभ!");
}
खालीपनकुंडली(){
तार.से अनुरोध(8, 1); // गुलाम से तापमान डेटा का अनुरोध करें
अगर (तार.उपलब्ध()) {
बाइट तापमान = तार.पढ़ना(); // गुलाम से तापमान डेटा पढ़ें
धारावाहिक.छपाई("तापमान: ");
धारावाहिक.छपाई(तापमान);
धारावाहिक.println("डिग्री सेल्सियस");
}
देरी(2000); // फिर से तापमान का अनुरोध करने से पहले 2 सेकंड प्रतीक्षा करें
}
गुलाम डिवाइस कोड:
#शामिल करना
#शामिल करना#परिभाषित करना डीएचटीपिन 4 // पिन DHT सेंसर से जुड़ा है
#परिभाषित करना डीएचटीटाइप डीएचटी11 // डीएचटी सेंसर प्रकार
डीएचटी डीएचटी(डीएचटीपिन, डीएचटीटाइप);
बाइट तापमान;खालीपनस्थापित करना(){
तार.शुरू(8); // गुलाम का पता 8 है
तार.अनुरोध पर(रिक्वेस्टइवेंट);
डीएचटी।शुरू();
}खालीपनकुंडली(){
देरी(2000); // DHT के स्थिर होने के लिए 2 सेकंड प्रतीक्षा करें
तापमान = डीएचटी।तापमान पढ़ें(); // DHT सेंसर से तापमान पढ़ें
}
खालीपनrequestEvent(){
तार.लिखना(तापमान); // मास्टर को तापमान डेटा भेजें
}
आप अपने प्रोजेक्ट में जो भी सेंसर हो सकते हैं, उसके अनुरूप इस कोड को कस्टमाइज़ कर सकते हैं, या डिस्प्ले मॉड्यूल पर सेंसर मान भी प्रदर्शित कर सकते हैं अपना खुद का कमरा थर्मामीटर और आर्द्रता मीटर बनाएं.
Arduino पर I2C के साथ दास को संबोधित करना
ऐसी परियोजना में I2C बस में जोड़े गए घटकों के मूल्यों को पढ़ने के लिए, यह महत्वपूर्ण है कि आप कोडिंग करते समय सही दास पता शामिल करें। सौभाग्य से, Arduino एक स्कैनर लाइब्रेरी प्रदान करता है जो दास की पहचान करने की प्रक्रिया को सरल करता है पते, लंबी सेंसर डेटा शीट के माध्यम से झारना और ऑनलाइन भ्रमित करने की आवश्यकता को समाप्त करना प्रलेखन।
I2C बस में मौजूद किसी भी स्लेव डिवाइस के पते की पहचान करने के लिए निम्न कोड का उपयोग करें।
#शामिल करना
// I2C संचार के लिए वायर लाइब्रेरी शामिल करें खालीपनस्थापित करना(){
तार.शुरू(); // I2C संचार प्रारंभ करें
धारावाहिक.शुरू(9600); // 9600 की बॉड दर के साथ सीरियल संचार प्रारंभ करें
जबकि (!धारावाहिक); // सीरियल कनेक्शन स्थापित होने तक प्रतीक्षा करें
धारावाहिक.println("\nI2C स्कैनर"); // I2C स्कैनिंग की शुरुआत का संकेत देने वाला एक संदेश प्रिंट करें
}खालीपनकुंडली(){
बाइट त्रुटि, पता; // त्रुटियों और डिवाइस पतों को संग्रहीत करने के लिए चर घोषित करें
int यहाँ एनउपकरण; // पाए गए उपकरणों की संख्या को संग्रहीत करने के लिए एक चर घोषित करेंधारावाहिक.println("स्कैनिंग..."); // I2C स्कैनिंग की शुरुआत का संकेत देने वाला एक संदेश प्रिंट करें
एनडिवाइस = 0; // पाए गए उपकरणों की संख्या को 0 पर सेट करें
के लिए (पता = 1; पता < 127; पता++) { // सभी संभावित I2C पतों पर पुनरावृति करें
तार.startTransmission(पता); // वर्तमान पते पर प्रसारण प्रारंभ करें
त्रुटि = तार.endtransmission(); // ट्रांसमिशन समाप्त करें और किसी भी त्रुटि को स्टोर करेंअगर (त्रुटि == 0) { // अगर कोई त्रुटि नहीं मिली
धारावाहिक.छपाई("I2C डिवाइस 0x पते पर मिला"); // एक संदेश प्रिंट करें जो इंगित करता है कि डिवाइस पाया गया था
अगर (पता < 16) धारावाहिक.छपाई("0"); // यदि पता 16 से कम है, तो स्वरूपण उद्देश्यों के लिए एक अग्रणी 0 जोड़ें
धारावाहिक.छपाई(पता, हेक्स); // पते को हेक्साडेसिमल प्रारूप में प्रिंट करें
धारावाहिक.println(" !"); // एक संदेश प्रिंट करें जो इंगित करता है कि डिवाइस पाया गया था
एनडिवाइस++; // पाए गए उपकरणों की संख्या बढ़ाएँ
}
अन्यअगर (त्रुटि == 4) { // अगर कोई त्रुटि पाई गई
धारावाहिक.छपाई("पता 0x पर अज्ञात त्रुटि"); // त्रुटि मिलने का संकेत देने वाला संदेश प्रिंट करें
अगर (पता < 16) धारावाहिक.छपाई("0"); // यदि पता 16 से कम है, तो स्वरूपण उद्देश्यों के लिए एक अग्रणी 0 जोड़ें
धारावाहिक.println(पता, हेक्स); // पते को हेक्साडेसिमल प्रारूप में प्रिंट करें
}
}
अगर (एनडिवाइस == 0) { // यदि कोई उपकरण नहीं मिला
धारावाहिक.println("कोई I2C डिवाइस नहीं मिला\n"); // एक संदेश प्रिंट करें जो इंगित करता है कि कोई उपकरण नहीं मिला
}
अन्य { // यदि उपकरण पाए गए
धारावाहिक.println("हो गया\n"); // I2C स्कैनिंग के अंत का संकेत देने वाला एक संदेश प्रिंट करें
}
देरी(5000); // अगला स्कैन शुरू करने से पहले 5 सेकंड की देरी करें
}
आज ही अपने प्रोजेक्ट का विस्तार करें
I2C संचार प्रोटोकॉल का उपयोग करके दो Arduino बोर्डों को इंटरफैस करना जटिल कार्यों को प्राप्त करने का एक लचीला और कुशल तरीका प्रदान करता है जिसे एक बोर्ड द्वारा नियंत्रित नहीं किया जा सकता है। वायर लाइब्रेरी की मदद से, I2C का उपयोग करके दो बोर्डों के बीच संचार आसान हो गया है, जिससे आप अपनी परियोजना में और अधिक घटक जोड़ सकते हैं।