Բովանդակություն:

IO Expander- ը ESP32- ի, ESP8266- ի և Arduino- ի համար. 24 քայլ
IO Expander- ը ESP32- ի, ESP8266- ի և Arduino- ի համար. 24 քայլ

Video: IO Expander- ը ESP32- ի, ESP8266- ի և Arduino- ի համար. 24 քայլ

Video: IO Expander- ը ESP32- ի, ESP8266- ի և Arduino- ի համար. 24 քայլ
Video: ESP32 Tutorial 12 - WS2812 RGB Srip 4 Project with SunFounder's ESP32 IoT Learnig kit 2024, Հուլիսի
Anonim
Image
Image
Ներածություն
Ներածություն

Wouldանկանու՞մ եք ընդլայնել ձեր ESP32, ESP8266 կամ Arduino- ի IO- ները: Իսկ դուք մտածե՞լ եք 16 նոր GPIO- ների հնարավորության մասին, որոնք կարող են վերահսկվել I2C ավտոբուսի միջոցով: Դե, այսօր ես ձեզ կներկայացնեմ GPIO ընդլայնիչ MCP23016- ը: Բացի այդ, ես ձեզ ցույց կտամ, թե ինչպես կարելի է միկրոկոնտրոլեր հաղորդակցել MCP23016- ի հետ: Ես նաև կխոսեմ ծրագիր ստեղծելու մասին, որտեղ մենք կօգտագործենք այս միկրոկոնտրոլերի ընդամենը 2 կապում `ընդլայնողի հետ շփվելու համար: Մենք դրանք կօգտագործենք LED- ները և կոճակը վերահսկելու համար:

Քայլ 1: Ներածություն

MCP23016 սարքն ապահովում է 16 բիթ GPIO ընդլայնման համար `օգտագործելով I2C ավտոբուսը: Յուրաքանչյուր բիթ կարող է կազմաձևվել առանձին (մուտքագրում կամ ելք):

MCP23016- ը բաղկացած է բազմաթիվ 8-բիթանոց պարամետրերից `մուտքի, ելքի և բևեռայնության ընտրության համար:

Ընդարձակողները պարզ լուծում են տալիս, երբ այլ օրինակների դեպքում IO- ները անհրաժեշտ են անջատիչների, տվիչների, կոճակների և LED- ների համար:

Քայլ 2: Բնութագրերը

16 մուտքային / ելքային կապում (16 մուտքի ստանդարտ)

Արագ I2C ավտոբուսի ժամացույցի հաճախականություն (0-400 կբիթ/վրկ)

Ապարատային հասցեի երեք կապում թույլատրվում է օգտագործել մինչև ութ սարք

Ընդհատել նավահանգստի գրավման ձայնագրիչը

Բեւեռայնության հակադարձ ռեգիստր `մուտքային պորտի տվյալների բեւեռայնությունը սահմանելու համար

Համատեղելի է միկրոկոնտրոլերների մեծամասնության հետ

Քայլ 3: ESP01- ը կարող է ունենալ 128 GPIO:

ESP01- ը կարող է ունենալ 128 GPIO
ESP01- ը կարող է ունենալ 128 GPIO

Օրինակ, որը ցույց է տալիս այս ընդլայնիչի մեծությունը, դրա օգտագործումն է ESP01- ով, որը կարող է միացվել մինչև ութ ընդլայնիչին `ընդամենը երկու IOS- ով` հասնելով 128 GPIO- ի:

Քայլ 4: MCP23016

MCP23016
MCP23016

Այստեղ մենք ունենք ընդլայնողի սխեման, որն ունի ութ բիթանոց երկու խումբ: Սա կազմում է ընդհանուր առմամբ 16 նավահանգիստ: Բացի ընդհատման քորոցից, այն ունի CLK քորոց, որը միացնում է կոնդենսատորն ու ռեզիստորը, որոնք ներքինորեն կապված են տրամաբանական նավահանգստում: Սա պետք է ձևավորի ժամացույց ՝ օգտագործելով բյուրեղային տատանման գաղափարը, որին անհրաժեշտ է 1 ՄՀց ժամացույց: TP կապը օգտագործվում է ժամացույցը չափելու համար: A0, A1 և A2 կապերը երկուական հասցեներ են:

Քայլ 5: CLԱՄԱՈՅ

CLԱՄԱՈՅ
CLԱՄԱՈՅ
CLԱՄԱՈՅ
CLԱՄԱՈՅ

Հետևաբար, MCP23016- ը օգտագործում է արտաքին RC միացում `ներքին ժամացույցի արագությունը որոշելու համար: Սարքի ճիշտ աշխատանքի համար պահանջվում է (սովորաբար) 1 ՄՀց ներքին ժամացույց: Ներքին ժամացույցը կարելի է չափել TP կապում: REXT- ի և CEXT- ի համար առաջարկվող արժեքները ներկայացված են ստորև:

Քայլ 6: Հասցե

MCP23016 հասցեն որոշելու համար մենք օգտագործում ենք A0, A1 և A2 կապում: Պարզապես դրանք թողեք HIGH կամ LOW հասցեների փոփոխության համար:

Հասցեն կձևավորվի հետևյալ կերպ.

MCP_ Հասցե = 20+ (A0 A1 A2)

Այն դեպքում, երբ A0 A1 A2- ը կարող է վերցնել HIGH / LOW արժեքներ, սա 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 երկու նավահանգիստներին:

Գրանցիչի ընթերցումը ապահովում է այդ նավահանգստի կապերի կարգավիճակը:

Bit = 1> HIGH Bit = 0> LOW

OLAT0 / OLAT1 - ելքային LACTCH REGISTERS

Կան երկու գրանցամատյաններ, որոնք ապահովում են մուտքը երկու նավահանգիստների ելքային նավահանգիստներին:

IPOL0 / IPOL1 - մուտքային բևեռայնության գրանցամատյաններ

Այս գրանցամատյանները թույլ են տալիս օգտագործողին կարգավորել մուտքային պորտի տվյալների բևեռականությունը (GP0 և GP1):

IODIR0 / IODIR1

Կան երկու գրանցամատյաններ, որոնք վերահսկում են քորոցային ռեժիմը: (Մուտք կամ ելք)

Բիթ = 1> Մուտք Bit = 0> Ելք

INTCAP0 / INTCAP1 - Ընդհատել գրանցման գրանցամատյանները

Սրանք գրանցամատյաններ են, որոնք պարունակում են այն պորտի արժեքը, որն առաջացրել է ընդհատումը:

IOCON0 / IOCON1 - I / O Expander Control Register

Սա վերահսկում է MCP23016- ի ֆունկցիոնալությունը:

0 բիթ (IARES> ընդհատել գործունեության լուծում) կարգավորումը վերահսկում է GP պորտի կապում նմուշառման հաճախականությունը:

Bit0 = 0> (կանխադրված) Պորտի գործունեության հայտնաբերման առավելագույն ժամանակը 32 մ է (ցածր էներգիայի սպառում)

Bit0 = 1> նավահանգստում գործունեության հայտնաբերման առավելագույն ժամանակը 200usec է (ավելի մեծ էներգիայի սպառում)

Քայլ 9. Հաղորդակցության կառուցվածքը

Հաղորդակցության կառուցվածքը
Հաղորդակցության կառուցվածքը

Ես այստեղ ցույց եմ տալիս Wire դասը, որը մեր հիմնական Arduino- ի I2C հաղորդակցությունն է, որը նաև թույլ է տալիս ընդլայնողին աշխատել Arduino Uno- ի և Mega- ի հետ: Այնուամենայնիվ, վերջինս արդեն ունի մի քանի IO: Մենք այստեղ զբաղվում ենք չիպի հասցեներով, մուտքի վերահսկմամբ, որոնք գրանցամատյանների կոդերն են, ինչպես նաև տվյալները:

Քայլ 10: րագիր

Ծրագիրը
Ծրագիրը

Մեր ծրագիրը բաղկացած է ESP32- ի MCP23016- ի հետ հաղորդակցվելուց `ավելի շատ GPIO- ներ օգտագործելու համար: Այնուհետև մենք կունենանք կոճակ և մի քանի LED լուսարձակներ `միացված MCP23016- ին: Մենք վերահսկելու ենք դրանք բոլորը ՝ օգտագործելով միայն I2C ավտոբուսը: Այսպիսով, կօգտագործվի միայն երկու ESP32 կապում: Տեսանյութում կարող եք տեսնել ստորև նկարված սխեման:

Քայլ 11: ESP01

ESP01
ESP01

Այստեղ ես ցույց եմ տալիս ESP01- ի Pinout- ը:

Քայլ 12: Տեղադրեք ESP01

Մոնտաժ ESP01
Մոնտաժ ESP01

Այս օրինակում մենք ունենք GPIO0- ը միացված SDA- ում, իսկ GPIO2- ը `SCL- ում: Մենք ունենք նաև ռելեի տախտակ, ազդանշան և LED: Մյուս նավահանգստում, GP1.0- ում, մենք ունենք ևս մեկ LED `դիմադրիչով:

Քայլ 13 ՝ NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Այստեղ մենք ունենք NodeMCU ESP-12E- ի Pinout- ը:

Քայլ 14. NodeMCU ESP-12E տեղադրում

Մոնտաժ NodeMCU ESP-12E
Մոնտաժ NodeMCU ESP-12E

Այս դեպքում միակ տարբերությունը առաջին օրինակից այն է, որ դուք համապատասխանաբար միացրել եք D1 և D2 SDA- ին և SCL- ին:

Քայլ 15. WiFi NodeMCU-32S ESP-WROOM-32

WiFi NodeMCU-32S ESP-WROOM-32
WiFi NodeMCU-32S ESP-WROOM-32

Ահա WiFi NodeMCU-32S ESP-WROOM-32- ի Pinout- ը:

Քայլ 16. WiFi տեղադրման հանգույց MCU-32S ESP-WROOM-32

WiFi տեղադրման հանգույց MCU-32S ESP-WROOM-32
WiFi տեղադրման հանգույց MCU-32S ESP-WROOM-32

Այս անգամ մյուս երկու օրինակներից հիմնական տարբերությունը կոճակն է, և թարթող երեք LED- ները: Այստեղ SDA- ն միացված է GPIO19- ին, իսկ SCL- ը ՝ GPIO23- ին:

Քայլ 17: Գրադարաններ և փոփոխականներ

Նախ, մենք կներառենք Wire.h- ն, որը պատասխանատու է i2c հաղորդակցության համար, ինչպես նաև MCP23016- ի i2c հասցեն սահմանելու համար: Ես ցույց եմ տալիս մի քանի հրամաններ, նույնիսկ որոշները, որոնք մենք չենք օգտագործում այս նախագծում:

#include // նշեք Wire.h գրադարանի օգտագործումը: // endereço I2C do MCP23016 #define MCPAddress 0x20 // ԳՐԱՆՎԵԼ ՀԱՐԱԲԵՐՈԹՅՈՆԸ ՊԱՏՎԻՐ. Աղյուսակ. 1-3 Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x0 // DATA PORT 0X0 // DATA PORT ՊՈՐՏԻ ԳՐԱՆՈՄ 1 #սահմանել OLAT0 0x02 // Ելք LATCH REGISTER 0 #սահմանել OLAT1 0x03 // OUTPUT LATCH REGISTER 1 #սահմանել IPOL0 0x04 // INPUT POLARITY PORT REGISTER 0 #define IPOL1 0x05 // INPTER 0 0 /I/O DIRECTION REGISTER 0 #սահմանել IODIR1 0x07 // I/O DIRECTION REGISTER 1 #սահմանել INTCAP0 0x08 // INTERRUPT CAPTURE REGISTER 0 #define INTCAP1 0x09 // INTERRUPT CAPTURE REGISTER 1 #IGO ԳՐԱՆISՎԵԼ 0 #սահմանել IOCON1 0x0B // I/O EXPANDER CONTROL REGISTER 1

Քայլ 18: Կարգավորում

Այստեղ մենք ունենք չորս տարբեր տեսակի միկրոկառավարիչների նախաստորագրման գործառույթներ: Մենք նաև ստուգում ենք հաճախականությունը, կարգավորում ենք GPIO- ները և տեղադրում կապում: Loop- ում մենք ստուգում ենք կոճակի կարգավիճակը:

void setup () {Serial.begin (9600); ուշացում (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frequencia // configura o GPIO0 como OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // կազմաձևում GPIO1 մուտքով կամ GP1.0 և ելքով GP1- ից դուրս GP1 configurePort (IODIR1, 0x01); // seta todos os pinos do GPIO0 comO LOW writeBlockData (GP0, B00000000); // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000000); } void loop () {// verifica e o botão GP foi pressionado checkButton (GP1); } // ավարտի հանգույց

Քայլ 19: ConfigurePort

Այս քայլում մենք կարգավորում ենք GPIO կապումների ռեժիմը և որոշում նավահանգիստների ռեժիմը:

// configura o GPIO (GP0 ou GP1) // como parametro passamos: // port: GP0 ou GP1 // custom: INPUT para todos as portas do GP trabalharem como entrada // OUTPUT para todos as portas do GP trabalharem como saida/ / custom um valor de 0-255 indicando o modo das portas (1 = INPUT, 0 = OUTPUT) // օր. uint8_t նավահանգիստ, uint8_t մաքսային) {if (custom == INPUT) {writeBlockData (port, 0xFF); } else if (custom == OUTPUT) {writeBlockData (նավահանգիստ, 0x00); } else {writeBlockData (նավահանգիստ, հարմարեցված); }}

Քայլ 20: WriteBlockData & CheckButton

Այստեղ մենք տվյալներ ենք ուղարկում MCP23016 i2c ավտոբուսի միջոցով, ստուգում ենք կոճակի կարգավիճակը և նշում հաջորդ քայլը ՝ հաշվի առնելով սեղմված կամ չսեղմված լինելու վիճակը:

// envia dados para o MCP23016 através do barramento i2c // cmd: COMANDO (registrador) // data: dados (0-255) void writeBlockData (uint8_t cmd, uint8_t data) {Wire.beginTransmission (MCPAddress); Wire.write (cmd); Wire.write (տվյալներ); Wire.endTransmission (); ուշացում (10); }

// verifica se o botão foi pressionado // parametro GP: GP0 ou GP1 void checkButton (uint8_t GP) {// faz a leitura do pino 0 no GP fornecido uint8_t btn = readPin (0, GP); // se botão pressionado, սահմանել HIGH որպես portas GP0 if (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa todas em estado LOW else {writeBlockData (GP0, B00000000); }}

Քայլ 21. ReadPin & ValueFromPin

Այստեղ մենք զբաղվում ենք որոշակի քորոցի ընթերցմամբ և բիթային արժեքի ցանկալի դիրքի վերադարձով:

// 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 կարգավիճակ GP = 0; Wire.beginTransmission (MCPAddress); Wire.write (gp); Wire.endTransmission (); Մետաղալար. Խնդրում ենք (MCPA հասցե, 1); // ler do chip 1 բայթ statusGP = Wire.read (); վերադարձի արժեքըFromPin (pin, statusGP); } // 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) {return (statusGP & (0x0001 << քորոց]) == 0? 0: 1; }

Քայլ 22. ESP8266 ծրագիր

Այստեղից մենք կտեսնենք, թե ինչպես է ստեղծվել այն ծրագիրը, որը մենք օգտագործել էինք ESP-01- ում և nCMUU ESP-12E- ում, ինչը թույլ է տալիս հասկանալ, թե որքանով են դրանց միջև եղած տարբերությունները նվազագույն:

Մենք միայն կփոխենք i2c կապի կոնստրուկտորի գիծը, որը Wire օբյեկտի սկզբնական մեթոդն է:

Պարզապես մեկնաբանեք տողը ըստ ափսեի, որը մենք պատրաստվում ենք կազմել:

// Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01

Կարգավորում

Ուշադրություն դարձրեք, որ շինարարը դեռ մեկնաբանված է: Հետևաբար, մի մեկնաբանեք ըստ ձեր տախտակի (ESP-01 կամ nodeMCU ESP12-E):

void setup () {Serial.begin (9600); ուշացում (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frequencia // configura o GPIO0 como OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // կոնֆիգուրացիա GPIO1- ից դուրս OUTPUT (todos os pinos) configurePort (IODIR1, OUTPUT); // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000001); }

Օղակ

Օղակի մեջ մենք փոխում ենք կապում յուրաքանչյուր 1 վայրկյան: Այսպիսով, երբ GP0- ի pin0- ը միացված է, GP1- ի կապումներն անջատված են: Երբ GP1- ի pin0- ը միացված է, GP0- ի կապումներն անջատված են:

void loop () {// seta o pino 7 do GP0 como HIGH and osoais como LOW writeBlockData (GP0, B10000000); // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000000); ուշացում (1000); // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta o pino 0 GP1- ով բարձր և ցածր ժամանակներում LOW writeBlockData (GP1, B00000001); ուշացում (1000); } // ավարտի հանգույց

Քայլ 23. ԿԱՐԵՎՈՐ

Օգտագործված փոփոխականներն ու գրադարանը նույնն են, ինչ մենք արել ենք ESP32 ծրագրի համար, ինչպես նաև configurePort և writeBlockData մեթոդները:

Քայլ 24: Ֆայլեր

Ներբեռնեք ֆայլերը.

PDF

INO (ESP8266)

INO (ESP32)

Խորհուրդ ենք տալիս: