Përmbajtje:

IO Expander për ESP32, ESP8266 dhe Arduino: 24 hapa
IO Expander për ESP32, ESP8266 dhe Arduino: 24 hapa

Video: IO Expander për ESP32, ESP8266 dhe Arduino: 24 hapa

Video: IO Expander për ESP32, ESP8266 dhe Arduino: 24 hapa
Video: Управление 32 сервомоторами с помощью PCA9685 и Arduino: V3 2024, Nëntor
Anonim
Image
Image
Prezantimi
Prezantimi

Dëshironi të zgjeroni IO -të e ESP32, ESP8266 ose Arduino tuaj? Dhe a keni menduar për mundësinë e 16 GPIO -ve të reja që mund të kontrollohen duke përdorur autobusin I2C? Epo sot, unë do t'ju prezantoj me zgjeruesin GPIO MCP23016. Gjithashtu, unë do t'ju tregoj se si të komunikoni një mikrokontrollues me MCP23016. Do të flas gjithashtu për krijimin e një programi ku do të përdorim vetëm 2 kunja të këtij mikrokontrolluesi për të komunikuar me zgjeruesin. Ne do t'i përdorim këto për të kontrolluar LED dhe butonin.

Hapi 1: Hyrje

Pajisja MCP23016 siguron 16 bit për zgjerimin e GPIO duke përdorur autobusin I2C. Çdo bit mund të konfigurohet individualisht (hyrje ose dalje).

MCP23016 përbëhet nga cilësime të shumta 8-bit për përzgjedhjen e hyrjes, daljes dhe polaritetit.

Zgjeruesit japin një zgjidhje të thjeshtë kur IO -të janë të nevojshme për ndërprerës, sensorë, butona dhe LED, ndër shembuj të tjerë.

Hapi 2: Karakteristikat

16 kunja hyrëse / dalëse (16 standarde hyrëse)

Frekuenca e orës së shpejtë të autobusit I2C (0-400 kbits/s)

Tre kunjat e adresave të harduerit lejojnë përdorimin e deri në tetë pajisje

Ndërprit regjistruesin e kapjes së portit

Regjistri përmbysës i polaritetit për vendosjen e polaritetit të të dhënave të portës hyrëse

E pajtueshme me shumicën e mikrokontrolluesve

Hapi 3: ESP01 Mund të ketë 128 GPIO

ESP01 Mund të ketë 128 GPIO!
ESP01 Mund të ketë 128 GPIO!

Një shembull që tregon madhësinë e këtij zgjeruesi është përdorimi i tij me ESP01, i cili mund të lidhet me deri në tetë zgjerues me vetëm dy IOS, duke arritur 128 GPIO.

Hapi 4: MCP23016

MCP23016
MCP23016

Këtu, kemi skemën e zgjeruesit, e cila ka dy grupe me tetë bit. Kjo bën gjithsej 16 porte. Përveç një kunj ndërprerjeje, ajo ka pinin CLK, i cili lidh kondensatorin dhe rezistencën, të cilat janë të lidhura brenda në një portë logjike. Kjo është për të formuar orën, duke përdorur idenë e një oshilatori kristal, i cili ka nevojë për orë 1MHz. Kodi TP përdoret për të matur orën. Kunjat A0, A1 dhe A2 janë adresa binare.

Hapi 5: ORA

ORA
ORA
ORA
ORA

Prandaj MCP23016 përdor një qark të jashtëm RC për të përcaktuar shpejtësinë e Orës së brendshme. Kërkohet një orë e brendshme prej 1 MHz (zakonisht) që pajisja të funksionojë siç duhet. Ora e brendshme mund të matet në kunjin TP. Vlerat e rekomanduara për REXT dhe CEXT janë treguar më poshtë.

Hapi 6: Adresa

Për të përcaktuar adresën e MCP23016, atëherë ne përdorim kunjat A0, A1 dhe A2. Thjesht lërini në HIGH ose LOW për ndryshimin e adresës.

Adresa do të formohet si më poshtë:

MCP_Adresa = 20 + (A0 A1 A2)

Aty ku A0 A1 A2 mund të marrë vlera HIGH / LOW, ky formon një numër binar nga 0 në 7.

Për shembull:

A0> GND, A1> GND, A2> GND (do të thotë 000, pastaj 20 + 0 = 20)

Ose ndryshe, A0> LART, A1> GND, A2> LART (do të thotë 101, pastaj 20 + 5 = 25)

Hapi 7: Komandat

Komandat
Komandat

Më poshtë është një tabelë me komandat për komunikim. Le të përdorim GP0 dhe GP1, si dhe IODIR0 dhe IODIR1.

Hapi 8: Kategoritë:

GP0 / GP1 - Regjistrat e Portit të të Dhënave

Ekzistojnë dy regjistra që sigurojnë qasje në dy portat GPIO.

Leximi i regjistrit siguron statusin e kunjave në atë port.

Bit = 1> Bit i lartë = 0> I POSHT

OLAT0 / OLAT1 - REGJISTRAT E PRODUKTEVE TAC LACTCH

Ekzistojnë dy regjistra që sigurojnë qasje në portet dalëse të dy porteve.

IPOL0 / IPOL1 - Regjistrat e polaritetit hyrës

Këta regjistra i lejojnë përdoruesit të konfigurojë polaritetin e të dhënave të portës hyrëse (GP0 dhe GP1).

IODIR0 / IODIR1

Ekzistojnë dy regjistra që kontrollojnë modalitetin pin. (Hyrja ose Dalja)

Bit = 1> HYRJE Bit = 0> dalje

INTCAP0 / INTCAP1 - Regjistrat e kapjes së ndërprerjeve

Këto janë regjistra që përmbajnë vlerën e portit që krijoi ndërprerjen.

IOCON0 / IOCON1 - Regjistri i Kontrollit të Zgjerimit I / O

Kjo kontrollon funksionalitetin e MCP23016.

Vendosja e bitit 0 (IARES> Interrupt Activity Resolution) kontrollon frekuencën e marrjes së mostrave të kunjave të portës GP.

Bit0 = 0> (parazgjedhje) Koha maksimale e zbulimit të aktivitetit të portit është 32ms (konsum i ulët i energjisë)

Bit0 = 1> koha maksimale e zbulimit të aktivitetit në port është 200usec (konsum më i lartë i energjisë)

Hapi 9: Struktura për Komunikim

Struktura për komunikim
Struktura për komunikim

Unë tregoj këtu klasën Wire, e cila është komunikimi I2C në thelbin tonë Arduino, i cili gjithashtu lejon që zgjeruesi të punojë me Arduino Uno dhe Mega. Sidoqoftë, kjo e fundit tashmë ka disa IO. Ne këtu merremi me adresat e çipit, kontrollin e qasjes, të cilat janë kodet e regjistrave, si dhe të dhënat.

Hapi 10: Programi

Program
Program

Programi ynë konsiston në komunikimin e ESP32 me MCP23016 për të pasur më shumë GPIO për t'u përdorur. Pastaj do të kemi një buton dhe disa LED të lidhur me MCP23016. Ne do t'i kontrollojmë të gjithë duke përdorur vetëm autobusin I2C. Kështu, do të përdoren vetëm dy kunja ESP32. Ju mund ta shihni qarkun e figurës më poshtë në video.

Hapi 11: ESP01

ESP01
ESP01

Këtu, unë tregoj Pinout e ESP01.

Hapi 12: Montimi i ESP01

Montimi ESP01
Montimi ESP01

Në këtë shembull, ne kemi GPIO0 të lidhur në SDA, dhe GPIO2 të lidhur në SCL. Ne gjithashtu kemi një tabelë stafetë, një zile dhe një LED. Në portin tjetër, në GP1.0, ne kemi një LED më shumë me një rezistencë.

Hapi 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Këtu, ne kemi Pinout të NodeMCU ESP-12E.

Hapi 14: Montimi i NyjesMCU ESP-12E

Nyja e montimitMCU ESP-12E
Nyja e montimitMCU ESP-12E

Në këtë rast, ndryshimi i vetëm nga shembulli i parë është se ju keni lidhur D1 dhe D2 në SDA dhe SCL, respektivisht.

Hapi 15: WiFi NodeMCU-32S ESP-WROOM-32

WiFi NyjeMCU-32S ESP-WROOM-32
WiFi NyjeMCU-32S ESP-WROOM-32

Këtu është Pinout i WiFi NodeMCU-32S ESP-WROOM-32.

Hapi 16: Nyja e Montimit të WiFiMCU-32S ESP-WROOM-32

Nyje Montimi WiFiMCU-32S ESP-WROOM-32
Nyje Montimi WiFiMCU-32S ESP-WROOM-32

Këtë herë, ndryshimi kryesor nga dy shembujt e tjerë është butoni, dhe tre LED -të që pulsojnë. Këtu, SDA është e lidhur me GPIO19, ndërsa SCL është e lidhur me GPIO23.

Hapi 17: Bibliotekat dhe variablat

Së pari, ne do të përfshijmë Wire.h, e cila është përgjegjëse për komunikimin i2c, si dhe vendosjen e adresës i2c të MCP23016. Unë tregoj disa komanda, madje disa që nuk i përdorim në këtë projekt.

#include // specifikoni përdorimin e bibliotekës Wire.h. // endereço I2C do MCP23016 #define MCPAddress 0x20 // KOMANDO BYTE P RR REGJISTRIMIN E LIDHJES: Tabela: 1-3 e Mikroçipit MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x0 // DATA PORT 0X0 // DATA POR 0 0 REGJISTRI I PORTIT 1 #përcaktoni OLAT0 0x02 // REGJISTRI I NDRYSHIMIT TUT LART 0 #përcaktoni OLAT1 0x03 // REGJISTRI I NDRYSHIMIT TUT NDRYSHME 1 #përcaktoni IPOL0 0x04 // INPUT POLARITETI I PORTIT REGJISTRI 0 #definoni IPOL1 0x05 // INTERPORT 010 /I/O REGJISTRI I DREJTIMIT 0 #përcakto IODIR1 0x07 // I/O REGJISTRI I DREJTIMIT 1 #përcakto INTCAP0 0x08 // REGJISTRI I INTERRUPTIMIT TAP KAPITURVE REGJISTRI 0 #përcakto IOCON1 0x0B // REGJISTRI I KONTROLLIT T/I/O EXPANDER 1

Hapi 18: Konfigurimi

Këtu kemi funksionet për të inicializuar katër lloje të ndryshme të mikrokontrolluesve. Ne gjithashtu kontrollojmë frekuencën, vendosim GPIO -të dhe vendosim kunjat. Në Loop, ne kontrollojmë statusin e butonit.

void setup () {Serial.begin (9600); vonesa (1000); Tela.filloj (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekuencat // konfigurimi ose GPIO0 jashtë OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfigurimi i GPIO1 como HYRJA ose GP1.0 dhe komo OUTPUT jashtë GP1 configurePort (IODIR1, 0x01); // seta todos os pinos për GPIO0 ose LOW writeBlockData (GP0, B00000000); // seta todos os pinos për GPIO1 ose LOW writeBlockData (GP1, B00000000); } void loop () {// verifikimi e o botoo GP foi pressionado checkButton (GP1); } // lak përfundimi

Hapi 19: Konfiguro Portën

Në këtë hap, ne konfigurojmë mënyrën e kunjave GPIO dhe identifikojmë mënyrën e porteve.

// konfigurimi i GPIO (GP0 ose GP1) // parametrat e kalimit: // porta: GP0 ou GP1 // me porosi: HYRJE për të gjithë portat si GP të trabalharem como entrada // OUTPUT para të gjitha gjërave si porta të GP trabalharem como saida/ / me porosi nga 0-255 tregues për modalitetin e portave (1 = HYRJA, 0 = DALJA) // psh: 0x01 ose B00000001 ose 1: tregues të apenave në GPX.0 trabalhará como entrada, ose restando como saida void configurePort (uint8_t port, uint8_t me porosi) {if (custom == INPUT) {writeBlockData (port, 0xFF); } else if (me porosi == OUTPUT) {writeBlockData (port, 0x00); } else {writeBlockData (port, me porosi); }}

Hapi 20: ShkruaniBlockData & CheckButton

Këtu, ne i dërgojmë të dhënat MCP23016 përmes autobusit i2c, kontrollojmë statusin e butonit dhe tregojmë hapin tjetër duke marrë parasysh gjendjen e shtypjes ose jo.

// 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); Tela.shkruaj (cmd); Wire.write (të dhënat); Wire.endTransmission (); vonesa (10); }

// verifikimi se o botoo foi pressionado // parametro GP: GP0 ose GP1 void checkButton (uint8_t GP) {// faz a leitura do pino 0 jo GP për mosveprim uint8_t btn = readPin (0, GP); // se botoo pressionado, e vendosur për HIGH si porta GP0 nëse (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa todas em estado LOW else {writeBlockData (GP0, B00000000); }}

Hapi 21: ReadPin & ValueFromPin

Ne këtu merremi me leximin e një kunji të veçantë, dhe kthimin e vlerës së bitit në pozicionin e dëshiruar.

// 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.beginTransmission (MCPAddress); Wire.write (gp); Wire.endTransmission (); Tela. KërkohetNga (MCPAdresa, 1); // ler do chip 1 bajt statusGP = Wire.read (); ktheni vlerënFromPin (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 << pin]) == 0? 0: 1; }

Hapi 22: Programi ESP8266

Nga këtu, ne do të shohim se si u krijua programi që kemi përdorur në ESP-01 dhe në nyjenMCU ESP-12E, i cili na lejon të kuptojmë se si ndryshimet midis tyre janë minimale.

Ne vetëm do të modifikojmë linjën e konstruktorit të komunikimit i2c, e cila është metoda fillestare e objektit Wire.

Thjesht mos komentoni vijën sipas pllakës që do të përpilojmë.

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

Konfigurimi

Vini re se ndërtuesi është ende i komentuar. Prandaj, mos komentoni sipas tabelës tuaj (ESP-01 ose nyjaMCU ESP12-E).

void setup () {Serial.begin (9600); vonesa (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekuencat // konfigurimi ose GPIO0 jashtë OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfigurimi i GPIO1 jashtë OUTPUT (todos os pinos) configurePort (IODIR1, OUTPUT); // seta todos os pinos për GPIO0 ose LOW writeBlockData (GP0, B00000000); // seta todos os pinos për GPIO1 ose LOW writeBlockData (GP1, B00000001); }

Lak

Në lak, ne i ndërrojmë kunjat çdo 1 sekondë. Kështu, kur pin0 e GP0 është aktiv, kunjat e GP1 janë të fikur. Kur pin0 i GP1 është i ndezur, kunjat GP0 janë joaktivë.

void loop () {// seta ose pino 7 deri GP0 në lartësi dhe në kohë të ulët LOW writeBlockData (GP0, B10000000); // seta todos os pinos për GPIO1 ose LOW writeBlockData (GP1, B00000000); vonesa (1000); // seta todos os pinos për GPIO0 ose LOW writeBlockData (GP0, B00000000); // vendosni për pino 0 deri në GP1 të lartë dhe në kohë të ulët LOW writeBlockData (GP1, B00000001); vonesa (1000); } // lak përfundimi

Hapi 23: E RORTNDSISHME

Variablat dhe biblioteka e përdorur janë të njëjta me ato të programit që kemi bërë për ESP32, si dhe metodat e konfigurimitPort dhe writeBlockData.

Hapi 24: Skedarët

Shkarkoni skedarët:

PDF

INO (ESP8266)

INO (ESP32)

Recommended: