विषयसूची:

ESP32, ESP8266, और Arduino के लिए IO विस्तारक: 24 चरण
ESP32, ESP8266, और Arduino के लिए IO विस्तारक: 24 चरण

वीडियो: ESP32, ESP8266, और Arduino के लिए IO विस्तारक: 24 चरण

वीडियो: ESP32, ESP8266, और Arduino के लिए IO विस्तारक: 24 चरण
वीडियो: Review PZEM-004T with Arduino ESP32 ESP8266 Python & Raspberry Pi : PDAControl 2024, जुलाई
Anonim
Image
Image
परिचय
परिचय

क्या आप अपने ESP32, ESP8266, या Arduino के IO का विस्तार करना चाहेंगे? और क्या आपने 16 नए GPIO की संभावना के बारे में सोचा है जिन्हें I2C बस का उपयोग करके नियंत्रित किया जा सकता है? खैर, आज मैं आपको GPIO विस्तारक MCP23016 से परिचित कराने जा रहा हूँ। साथ ही, मैं आपको दिखाऊंगा कि MCP23016 के साथ एक माइक्रोकंट्रोलर को कैसे संवाद करना है। मैं एक प्रोग्राम बनाने के बारे में भी बात करूंगा जहां हम विस्तारक के साथ संचार करने के लिए इस माइक्रोकंट्रोलर के केवल 2 पिन का उपयोग करेंगे। हम इनका उपयोग एलईडी और बटन को नियंत्रित करने के लिए करेंगे।

चरण 1: परिचय

MCP23016 डिवाइस I2C बस का उपयोग करके GPIO विस्तार के लिए 16 बिट प्रदान करता है। प्रत्येक बिट को व्यक्तिगत रूप से कॉन्फ़िगर किया जा सकता है (इनपुट या आउटपुट)।

MCP23016 में इनपुट, आउटपुट और पोलरिटी चयन के लिए कई 8-बिट सेटिंग्स शामिल हैं।

अन्य उदाहरणों के साथ, स्विच, सेंसर, बटन और एलईडी के लिए आईओ की आवश्यकता होने पर विस्तारक एक सरल समाधान प्रदान करते हैं।

चरण 2: विशेषताएं

16 इनपुट / आउटपुट पिन (16 इनपुट मानक)

तेज़ I2C बस घड़ी आवृत्ति (0-400 kbit/s)

तीन हार्डवेयर पता पिन अधिकतम आठ उपकरणों के उपयोग की अनुमति देते हैं

इंटरप्ट पोर्ट कैप्चर रिकॉर्डर

इनपुट पोर्ट डेटा की ध्रुवीयता निर्धारित करने के लिए पोलारिटी रिवर्सिंग रजिस्टर

अधिकांश माइक्रोकंट्रोलर के साथ संगत

चरण 3: ESP01 में 128 GPIO हो सकते हैं

ESP01 में 128 GPIO हो सकते हैं!
ESP01 में 128 GPIO हो सकते हैं!

एक उदाहरण जो इस विस्तारक के परिमाण को दर्शाता है, वह है ESP01 के साथ इसका उपयोग, जिसे केवल दो IOS के साथ आठ विस्तारकों से जोड़ा जा सकता है, जो 128 GPIO तक पहुंच सकता है।

चरण 4: MCP23016

एमसीपी२३०१६
एमसीपी२३०१६

यहां, हमारे पास विस्तारक का योजनाबद्ध है, जिसमें आठ बिट्स के दो समूह हैं। यह कुल 16 बंदरगाहों के लिए बनाता है। एक इंटरप्ट पिन के अलावा, इसमें सीएलके पिन होता है, जो कैपेसिटर और रेसिस्टर को जोड़ता है, जो एक लॉजिक पोर्ट में आंतरिक रूप से जुड़े होते हैं। यह एक क्रिस्टल थरथरानवाला के विचार का उपयोग करके घड़ी बनाने के लिए है, जिसे 1 मेगाहर्ट्ज घड़ी की आवश्यकता होती है। टीपी पिन का उपयोग घड़ी को मापने के लिए किया जाता है। पिन A0, A1 और A2 बाइनरी एड्रेस हैं।

चरण 5: घड़ी

घड़ी
घड़ी
घड़ी
घड़ी

इसलिए MCP23016 आंतरिक घड़ी की गति निर्धारित करने के लिए बाहरी RC सर्किट का उपयोग करता है। डिवाइस को ठीक से काम करने के लिए (आमतौर पर) 1 मेगाहर्ट्ज की आंतरिक घड़ी की आवश्यकता होती है। आंतरिक घड़ी को टीपी पिन पर मापा जा सकता है। REXT और CEXT के लिए अनुशंसित मान नीचे दिखाए गए हैं।

चरण 6: पता

MCP23016 के पते को परिभाषित करने के लिए, हम तब पिन A0, A1 और A2 का उपयोग करते हैं। पता बदलने के लिए बस उन्हें उच्च या निम्न पर छोड़ दें।

पता इस प्रकार बनाया जाएगा:

एमसीपी_पता = 20 + (ए0 ए1 ए2)

जहाँ A0 A1 A2 उच्च / निम्न मान ले सकता है, यह 0 से 7 तक एक द्विआधारी संख्या बनाता है।

उदाहरण के लिए:

A0> GND, A1> GND, A2> GND (मतलब 000, तो 20 + 0 = 20)

वरना, A0> High, A1> GND, A2> High (मतलब 101, फिर 20 + 5 = 25)

चरण 7: आदेश

आदेश
आदेश

नीचे संचार के लिए आदेशों के साथ एक तालिका है। आइए GP0 और GP1, साथ ही IODIR0 और IODIR1 का उपयोग करें।

चरण 8: श्रेणियाँ:

GP0 / GP1 - डेटा पोर्ट रजिस्टर

दो रजिस्टर हैं जो दो GPIO पोर्ट तक पहुंच प्रदान करते हैं।

रजिस्टर रीडिंग उस पोर्ट पर पिन की स्थिति प्रदान करता है।

बिट = 1> उच्च बिट = 0> कम

OLAT0 / OLAT1 - आउटपुट LACTCH रजिस्टर

दो रजिस्टर हैं जो दो बंदरगाहों के आउटपुट पोर्ट तक पहुंच प्रदान करते हैं।

IPOL0 / IPOL1 - इनपुट पोलारिटी रजिस्टर

ये रजिस्टर उपयोगकर्ता को इनपुट पोर्ट डेटा (GP0 और GP1) की ध्रुवीयता को कॉन्फ़िगर करने की अनुमति देते हैं।

IODIR0 / IODIR1

दो रजिस्टर हैं जो पिन मोड को नियंत्रित करते हैं। (इनपुट या आउटपुट)

बिट = 1> इनपुट बिट = 0> आउटपुट

INTCAP0 / INTCAP1 - इंटरप्ट कैप्चर रजिस्टर

ये रजिस्टर हैं जिनमें उस पोर्ट का मान होता है जो इंटरप्ट उत्पन्न करता है।

IOCON0 / IOCON1 - I / O विस्तारक नियंत्रण रजिस्टर

यह MCP23016 की कार्यक्षमता को नियंत्रित करता है।

बिट 0 (IARES> इंटरप्ट एक्टिविटी रेजोल्यूशन) सेट करना GP पोर्ट पिन की सैंपलिंग फ्रीक्वेंसी को नियंत्रित करता है।

बिट0 = 0> (डिफ़ॉल्ट) अधिकतम पोर्ट गतिविधि का पता लगाने का समय 32ms है (कम बिजली की खपत)

Bit0 = 1> पोर्ट पर अधिकतम गतिविधि का पता लगाने का समय 200usec (उच्च-शक्ति की खपत) है

चरण 9: संचार के लिए संरचना

संचार के लिए संरचना
संचार के लिए संरचना

मैं यहां वायर क्लास दिखाता हूं, जो हमारे कोर Arduino में I2C संचार है, जो विस्तारक को Arduino Uno और Mega के साथ काम करने की भी अनुमति देता है। हालाँकि, बाद वाले के पास पहले से ही कई IO हैं। हम यहां चिप के पते, अभिगम नियंत्रण, जो कि रजिस्टरों के कोड हैं, साथ ही डेटा के साथ सौदा करते हैं।

चरण 10: कार्यक्रम

कार्यक्रम
कार्यक्रम

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

चरण 11: ESP01

ईएसपी01
ईएसपी01

यहाँ, मैं ESP01 का पिनआउट दिखाता हूँ।

चरण 12: बढ़ते ESP01

बढ़ते ESP01
बढ़ते ESP01

इस उदाहरण में, हमारे पास GPIO0 SDA में जुड़ा है, और GPIO2 SCL में जुड़ा है। हमारे पास एक रिले बोर्ड, एक बजर और एक एलईडी भी है। दूसरे पोर्ट पर, GP1.0 में, हमारे पास एक प्रतिरोधक के साथ एक और LED है।

चरण 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

यहां, हमारे पास NodeMCU ESP-12E का पिनआउट है।

चरण 14: बढ़ते NodeMCU ESP-12E

बढ़ते NodeMCU ESP-12E
बढ़ते NodeMCU ESP-12E

इस मामले में, पहले उदाहरण से एकमात्र अंतर यह है कि आपने क्रमशः SDA और SCL में D1 और D2 को कनेक्ट किया है।

चरण 15: वाईफाई NodeMCU-32S ESP-WROOM-32

वाईफाई NodeMCU-32S ESP-WROOM-32
वाईफाई NodeMCU-32S ESP-WROOM-32

वाईफाई NodeMCU-32S ESP-WROOM-32 का पिनआउट यहां दिया गया है।

चरण 16: वाईफाई माउंटिंग NodeMCU-32S ESP-WROOM-32

वाईफाई माउंटिंग NodeMCU-32S ESP-WROOM-32
वाईफाई माउंटिंग NodeMCU-32S ESP-WROOM-32

इस बार, अन्य दो उदाहरणों से मुख्य अंतर बटन और तीन ब्लिंकिंग एलईडी हैं। यहां, SDA GPIO19 से जुड़ा है, जबकि SCL GPIO23 से जुड़ा है।

चरण 17: पुस्तकालय और चर

सबसे पहले, हम Wire.h को शामिल करेंगे, जो i2c संचार के लिए जिम्मेदार है, साथ ही साथ MCP23016 का i2c पता सेट करेगा। मैं कई कमांड दिखाता हूं, यहां तक कि कुछ जो हम इस प्रोजेक्ट में उपयोग नहीं करते हैं।

#शामिल करें // Wire.h लाइब्रेरी का उपयोग निर्दिष्ट करें। // endereço I2C do MCP23016 #define MCPAड्रेस 0x20 // कमांड बाइट टू रजिस्टर रिलेशन: टेबल: 1-3 माइक्रोचिप MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // डेटा पोर्ट रजिस्टर 0x01 // डेटा GP1 परिभाषित करें पोर्ट रजिस्टर 1 # परिभाषित करें OLAT0 0x02 // आउटपुट कुंडी रजिस्टर 0 # परिभाषित करें OLAT1 0x03 // आउटपुट कुंडी रजिस्टर 1 # परिभाषित करें IPOL0 0x04 // इनपुट पोलरिटी पोर्ट रजिस्टर 0 # परिभाषित करें IPOL1 0x06 / // इनपुट पोलारिटी पोर्ट IODIR0 परिभाषित करें / I/O दिशा रजिस्टर 0 # परिभाषित करें IODIR1 0x07 // I/O दिशा रजिस्टर 1 # परिभाषित करें INTCAP0 0x08 // इंटरप्ट कैप्चर रजिस्टर 0 # परिभाषित करें INTCAP1 0x09 // इंटरप्ट कैप्चर रजिस्टर 1 # परिभाषित करें IOCON0 0x0A // नियंत्रण रजिस्टर 0 # परिभाषित करें IOCON1 0x0B // I/O विस्तारक नियंत्रण रजिस्टर 1

चरण 18: सेटअप

यहां हमारे पास चार अलग-अलग प्रकार के माइक्रोकंट्रोलर को इनिशियलाइज़ करने का कार्य है। हम आवृत्ति की भी जांच करते हैं, जीपीआईओ सेट करते हैं, और पिन सेट करते हैं। लूप में, हम बटन की स्थिति की जांच करते हैं।

शून्य सेटअप () {Serial.begin (९६००); देरी (1000); वायर.बेगिन(१९, २३); //ESP32 // Wire.begin(D2, D1); //nodemcu ESP8266 // Wire.begin(); //arduino // Wire.begin(0, 2);//ESP-01 Wire.setClock(200000); // आवृत्ति // कॉन्फ़िगरेशन या GPIO0 कोमो OUTPUT (todos os pinos) कॉन्फ़िगरपोर्ट (IODIR0, OUTPUT); // कॉन्फिगुरा या GPIO1 कॉमो इनपुट या GP1.0 और कॉमो OUTPUT ओएस आउट्रोस GP1 कॉन्फिगरपोर्ट (IODIR1, 0x01); // सेटा टोडोस ओएस पिनोस जीपीआईओ0 कोमो लो राइटब्लॉकडाटा (जीपी0, बी00000000) करते हैं; // सेटा टोडोस ओएस पिनोस जीपीआईओ 1 कोमो लो राइटब्लॉकडाटा (जीपी 1, बी 00000000); } शून्य लूप () {//verifica e o botão GP foi pressionado checkButton(GP1); } // अंत लूप

चरण 19: पोर्ट कॉन्फ़िगर करें

इस चरण में, हम GPIO पिन के मोड को कॉन्फ़िगर करते हैं और पोर्ट के मोड की पहचान करते हैं।

// कॉन्फ़िगरेशन या GPIO (GP0 या GP1) // कोमो पैरामेट्रो पासामोस: // पोर्ट: GP0 या GP1 // कस्टम: INPUT पैरा टोडोस के रूप में पोर्ट्स जीपी ट्रैबलहरेम कोमो एंटरडा / कस्टम उम वेलोर डी 0-255 संकेतक ओ मोडो दास पोर्टस (1 = इनपुट, 0 = आउटपुट) // पूर्व: 0x01 या बी 00000001 कहां 1: इंडिका क्यू एपेनस ओ जीपीएक्स.0 ट्रैबलहारा कोमो एंटरडा, ओ रेस्टैंडो कोमो कहाएक शून्य कॉन्फ़िगरपोर्ट(uint8_t पोर्ट, uint8_t कस्टम) {अगर (कस्टम == INPUT) {लिखेंब्लॉकडाटा (पोर्ट, 0xFF); } और अगर (कस्टम == आउटपुट) {लिखेंब्लॉकडाटा (पोर्ट, 0x00); } और {लिखेंब्लॉकडाटा (पोर्ट, कस्टम); } }

चरण 20: WriteBlockData और CheckButton

यहां, हम i2c बस के माध्यम से MCP23016 को डेटा भेजते हैं, बटन की स्थिति की जांच करते हैं, और दबाए जाने या न होने की स्थिति को ध्यान में रखते हुए अगले चरण का संकेत देते हैं।

// एनविया डैडोस पैरा ओ एमसीपी२३०१६ एट्रावेस डू बैरामेंटो i2c//cmd: COMANDO (रजिस्ट्रार) // डेटा: डैडोस (०-२५५) शून्य राइटब्लॉकडाटा (uint8_t cmd, uint8_t डेटा) { Wire.beginTransmission (MCPAddress); वायर.राइट (सेमीडी); वायर.राइट (डेटा); वायर.एंडट्रांसमिशन (); देरी(10); }

// सत्यापन से ओ बोटाओ फोई प्रेसेशनैडो // पैरामेट्रो जीपी: जीपी 0 या जीपी 1 शून्य चेकबटन (uint8_t जीपी) {//फैज ए लेइटुरा डू पिनो 0 नो जीपी फॉरनेसिडो uint8_t बीटीएन = रीडपिन (0, जीपी); // से बोटाओ प्रेसेशनैडो, सेटा पैरा हाई जैसे पोर्टस जीपी0 अगर (बीटीएन) {लिखेंब्लॉकडाटा (जीपी0, बी११११११११); } // कासो कॉन्ट्रारियो डीक्सा टोडास एम एस्टाडो लो एल्स {राइटब्लॉकडाटा (जीपी0, बी 00000000); } }

चरण 21: रीडपिन और वैल्यूफ्रॉमपिन

हम यहां एक विशिष्ट पिन के पढ़ने और वांछित स्थिति में बिट मान की वापसी के साथ सौदा करते हैं।

//faz a leitura de um pino específico//pin: pino desejado (0-7) //gp: GP0 ou GP1 //retorno: 0 ou 1 uint8_t readPin(uint8_t pin, uint8_t gp) { uint8_t statusGP = 0; वायर.बेगिनट्रांसमिशन (एमसीपीएड्रेस); वायर.राइट (जीपी); वायर.एंडट्रांसमिशन (); Wire.requestFrom (एमसीपीए पता, 1); // लेर डू चिप 1 बाइट स्टेटसजीपी = वायर.रीड (); वापसी मूल्यफ्रॉमपिन (पिन, स्टेटसजीपी); } // retorna o valor do bit na posição desejada //pin: posição do bit (0-7) //statusGP: valor lido do GP (0-255) uint8_t valueFromPin(uint8_t pin, uint8_t statusGP) { वापसी (statusGP & (0x0001 << पिन)) == 0? 0: 1; }

चरण 22: ESP8266 कार्यक्रम

यहां से, हम देखेंगे कि हमने ईएसपी -01 और नोडएमसीयू ईएसपी -12 ई में जिस प्रोग्राम का उपयोग किया था, वह कैसे बनाया गया था, जो हमें यह समझने की अनुमति देता है कि उनके बीच अंतर कैसे न्यूनतम है।

हम केवल i2c संचार कंस्ट्रक्टर की लाइन को संशोधित करेंगे, जो कि वायर ऑब्जेक्ट की शुरुआत विधि है।

जिस प्लेट को हम कंपाइल करने जा रहे हैं, उसके अनुसार लाइन को अनकम्मेंट करें।

// वायर.बेगिन (डी 2, डी 1); //nodemcu ESP8266// Wire.begin(0, 2); //ईएसपी-01

सेट अप

ध्यान दें कि बिल्डर अभी भी टिप्पणी कर रहा है। इसलिए, आपके बोर्ड (ESP-01 या nodeMCU ESP12-E) के अनुसार असम्बद्धता।

शून्य सेटअप () {Serial.begin (९६००); देरी (1000); // वायर.बेगिन (डी 2, डी 1); //nodemcu ESP8266 // Wire.begin(0, 2); // ईएसपी -01 वायर.सेटक्लॉक (200000); // आवृत्ति // कॉन्फ़िगरेशन या GPIO0 कोमो OUTPUT (todos os pinos) कॉन्फ़िगरपोर्ट (IODIR0, OUTPUT); // कॉन्फ़िगरेशन या GPIO1 कोमो OUTPUT (todos os pinos) कॉन्फ़िगरपोर्ट (IODIR1, OUTPUT); // सेटा टोडोस ओएस पिनोस जीपीआईओ0 कोमो लो राइटब्लॉकडाटा (जीपी0, बी00000000) करते हैं; // सेटा टोडोस ओएस पिनोस जीपीआईओ 1 कोमो लो राइटब्लॉकडाटा (जीपी 1, बी 00000001); }

कुंडली

लूप में, हम हर 1 सेकंड में पिन स्विच करते हैं। इस प्रकार, जब GP0 का पिन0 चालू होता है, तो GP1 के पिन बंद हो जाते हैं। जब GP1 का पिन0 चालू होता है, तो GP0 पिन बंद हो जाते हैं।

शून्य लूप () {//सेट ओ पिनो 7 जीपी0 कोमो हाई ई ओएस डेमाइस कॉमो लो राइटब्लॉकडाटा (जीपी0, बी10000000); // सेटा टोडोस ओएस पिनोस जीपीआईओ 1 कोमो लो राइटब्लॉकडाटा (जीपी 1, बी 00000000); देरी (1000); // सेटा टोडोस ओएस पिनोस जीपीआईओ0 कोमो लो राइटब्लॉकडाटा (जीपी0, बी00000000) करते हैं; // सेट ओ पिनो ० डू जीपी१ कोमो हाई ई ओएस डेमिस कोमो लो राइटब्लॉकडाटा (जीपी१, बी००००००१); देरी (1000); } // अंत लूप

चरण 23: महत्वपूर्ण

उपयोग किए गए चर और पुस्तकालय वही हैं जो हमने ईएसपी 32 के लिए किए गए प्रोग्राम के साथ-साथ कॉन्फ़िगरपोर्ट और राइटब्लॉकडेटा विधियों के लिए किए थे।

चरण 24: फ़ाइलें

फ़ाइलें डाउनलोड करें:

पीडीएफ

आईएनओ (ईएसपी8266)

आईएनओ (ईएसपी32)

सिफारिश की: