Talaan ng mga Nilalaman:

IO Expander para sa ESP32, ESP8266, at Arduino: 24 Hakbang
IO Expander para sa ESP32, ESP8266, at Arduino: 24 Hakbang

Video: IO Expander para sa ESP32, ESP8266, at Arduino: 24 Hakbang

Video: IO Expander para sa ESP32, ESP8266, at Arduino: 24 Hakbang
Video: LDmicro 14: I2C LCD & DS3231 Real-Time Clock (Microcontroller PLC Ladder Programming with LDmicro) 2024, Nobyembre
Anonim
Image
Image
Panimula
Panimula

Nais mo bang palawakin ang mga IO ng iyong ESP32, ESP8266, o Arduino? At naisip mo ba ang posibilidad ng 16 na bagong GPIO na maaaring makontrol gamit ang I2C bus? Sa ngayon, ipapakilala ko sa iyo ang GPIO expander MCP23016. Gayundin, ipapakita ko sa iyo kung paano makipag-usap sa isang microcontroller sa MCP23016. Pag-uusapan ko rin ang tungkol sa paglikha ng isang programa kung saan gagamitin lamang namin ang 2 mga pin ng microcontroller na ito upang makipag-usap sa expander. Gagamitin namin ito para sa pagkontrol sa mga LED at ang pindutan.

Hakbang 1: Panimula

Ang aparato ng MCP23016 ay nagbibigay ng 16 na piraso para sa pagpapalawak ng GPIO gamit ang I2C bus. Ang bawat bit ay maaaring mai-configure nang paisa-isa (input o output).

Ang MCP23016 ay binubuo ng maraming mga setting ng 8-bit para sa pagpili ng input, output, at polarity.

Ang mga nagpapalawak ay nagbibigay ng isang simpleng solusyon kapag kinakailangan ang mga IO para sa mga switch, sensor, pindutan, at LED, bukod sa iba pang mga halimbawa.

Hakbang 2: Mga Katangian

16 Mga input / Output na pin (16 na pamantayan sa pag-input)

Mabilis na dalas ng orasan ng I2C bus (0-400 kbits / s)

Pinapayagan ng tatlong pin ng address ng hardware ang paggamit ng hanggang walong mga aparato

Makagambala sa Recorder ng Port Capture

Ang rehistro ng pag-reverse ng polarity para sa pagtatakda ng polarity ng data ng input port

Mga katugmang sa karamihan ng mga microcontroller

Hakbang 3: Ang ESP01 ay Maaaring Magkaroon ng 128 GPIO

Ang ESP01 ay Maaaring Magkaroon ng 128 GPIO!
Ang ESP01 ay Maaaring Magkaroon ng 128 GPIO!

Ang isang halimbawa na nagpapakita ng laki ng expander na ito ay ang paggamit nito sa ESP01, na maaaring konektado hanggang sa walong mga nagpalawak na may lamang dalawang IOS, na umaabot sa 128 GPIO.

Hakbang 4: MCP23016

MCP23016
MCP23016

Dito, mayroon tayong iskema ng expander, na mayroong dalawang pangkat na walong piraso. Ginagawa ito para sa isang kabuuang 16 port. Bilang karagdagan sa isang nakakagambala na pin, mayroon itong CLK pin, na kumokonekta sa kapasitor at risistor, na koneksyon sa loob sa isang port ng lohika. Ito ay upang mabuo ang orasan, gamit ang ideya ng isang kristal oscillator, na nangangailangan ng 1MHz na orasan. Ginagamit ang TP pin upang sukatin ang orasan. Ang mga pin na A0, A1, at A2 ay mga binary address.

Hakbang 5: CLOCK

CLOCK
CLOCK
CLOCK
CLOCK

Samakatuwid ang MCP23016 ay gumagamit ng isang panlabas na RC circuit upang matukoy ang bilis ng panloob na Clock. Ang isang panloob na orasan na 1 MHz ay kinakailangan (karaniwang) upang gumana nang maayos ang aparato. Maaaring sukatin ang panloob na orasan sa TP pin. Ang mga inirekumendang halaga para sa REXT at CEXT ay ipinapakita sa ibaba.

Hakbang 6: Address

Upang tukuyin ang address ng MCP23016, pagkatapos ay gumagamit kami ng mga pin na A0, A1, at A2. Iwanan lamang ang mga ito sa TAAS o Mababa para sa pagbabago ng address.

Ang address ay mabubuo tulad ng sumusunod:

MCP_Address = 20 + (A0 A1 A2)

Kung saan ang A0 A1 A2 ay maaaring tumagal ng TAAS / Mababang halaga, bumubuo ito ng isang binary na numero mula 0 hanggang 7.

Halimbawa:

A0> GND, A1> GND, A2> GND (nangangahulugang 000, pagkatapos ay 20 + 0 = 20)

Kung hindi, A0> TAAS, A1> GND, A2> TAAS (ibig sabihin 101, pagkatapos 20 + 5 = 25)

Hakbang 7: Mga Utos

Utos
Utos

Nasa ibaba ang isang talahanayan na may mga utos para sa komunikasyon. Gumamit tayo ng GP0 at GP1, pati na rin sa IODIR0 at IODIR1.

Hakbang 8: Mga Kategorya:

GP0 / GP1 - Mga Rehistro sa Port ng Data

Mayroong dalawang rehistro na nagbibigay ng pag-access sa dalawang port ng GPIO.

Ang pagbasa ng rehistro ay nagbibigay ng katayuan ng mga pin sa port na iyon.

Bit = 1> MATAAS Bit = 0> Mababa

OLAT0 / OLAT1 - Mga Output na LACTCH REGISTERS

Mayroong dalawang rehistro na nagbibigay ng pag-access sa mga output port ng dalawang port.

IPOL0 / IPOL1 - Mga Pagrehistro ng Polarity ng Input

Pinapayagan ng mga rehistro na ito ang gumagamit na mai-configure ang polarity ng data ng input port (GP0 at GP1).

IODIR0 / IODIR1

Mayroong dalawang mga rehistro na kumokontrol sa mode ng pin. (Input o Output)

Bit = 1> INPUT Bit = 0> OUTPUT

INTCAP0 / INTCAP1 - Makagambala sa Mga Rehistro ng Capture

Ito ang mga rehistro na naglalaman ng halaga ng port na nakabuo ng makagambala.

IOCON0 / IOCON1 - I / O Rehistro ng Expander Control

Kinokontrol nito ang pagpapaandar ng MCP23016.

Ang pagtatakda ng bit 0 (IARES> Pag-abala sa Paglutas ng Aktibidad) ay kumokontrol sa dalas ng pag-sample ng mga GP port pin.

Bit0 = 0> (default) Ang maximum na oras ng pagtuklas ng aktibidad ng port ay 32ms (konsumo sa mababang lakas)

Bit0 = 1> maximum na oras ng pagtuklas ng aktibidad sa port ay 200usec (pagkonsumo ng mas mataas na kuryente)

Hakbang 9: Istraktura para sa Komunikasyon

Istraktura para sa Komunikasyon
Istraktura para sa Komunikasyon

Ipinapakita ko rito ang klase ng Wire, na kung saan ay ang komunikasyon ng I2C sa aming pangunahing Arduino, na nagpapahintulot din sa expander na gumana sa Arduino Uno at Mega. Gayunpaman, ang huli ay mayroon nang maraming mga IO. Nakikipag-usap kami dito sa mga address ng maliit na tilad, ang kontrol sa pag-access, na kung saan ay ang mga code ng mga pagrehistro, pati na rin ang data.

Hakbang 10: Programa

Programa
Programa

Ang aming programa ay binubuo ng pakikipag-usap sa ESP32 sa MCP23016 upang magkaroon ng maraming mga GPIO na magagamit. Magkakaroon kami pagkatapos ng isang pindutan at ilang mga LED na konektado sa MCP23016. Kinokontrol namin ang lahat sa kanila gamit lamang ang I2C bus. Sa gayon, dalawang mga pin ng ESP32 lamang ang gagamitin. Maaari mong makita ang larawan circuit sa ibaba sa video.

Hakbang 11: ESP01

ESP01
ESP01

Dito, ipinapakita ko ang Pinout ng ESP01.

Hakbang 12: Pag-mount ng ESP01

Pag-mount ng ESP01
Pag-mount ng ESP01

Sa halimbawang ito, mayroon kaming koneksyon na GPIO0 sa SDA, at ang GPIO2 ay konektado sa SCL. Mayroon din kaming isang relay board, isang buzzer, at isang LED. Sa kabilang port, sa GP1.0, mayroon kaming isa pang LED na may isang risistor.

Hakbang 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Dito, mayroon kaming Pinout ng NodeMCU ESP-12E.

Hakbang 14: Pag-mount NodeMCU ESP-12E

Pag-mount NodeMCU ESP-12E
Pag-mount NodeMCU ESP-12E

Sa kasong ito, ang pagkakaiba lamang mula sa unang halimbawa ay na konektado mo ang D1 at D2 sa SDA at SCL, ayon sa pagkakabanggit.

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

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

Narito ang Pinout ng WiFi NodeMCU-32S ESP-WROOM-32.

Hakbang 16: WiFi Mounting NodeMCU-32S ESP-WROOM-32

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

Sa oras na ito, ang pangunahing pagkakaiba mula sa iba pang dalawang halimbawa ay ang pindutan, at ang tatlong mga blinking LED. Dito, ang SDA ay konektado sa GPIO19, habang ang SCL ay konektado sa GPIO23.

Hakbang 17: Mga Aklatan at Variable

Una, isasama namin ang Wire.h, na responsable para sa komunikasyon ng i2c, pati na rin ang pagtatakda ng i2c address ng MCP23016. Nagpakita ako ng maraming mga utos, kahit na ang ilan na hindi namin ginagamit sa proyektong ito.

# isama // tukuyin ang paggamit ng Wire.h library. // endereço I2C do MCP23016 #define MCPAddress 0x20 // CommAND BYTE TO REGISTER RELATIONSHIP: Talahanayan: 1-3 ng Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // DATA PORT REGISTER 0 #define GP1 0x PORT REGISTER 1 #define OLAT0 0x02 // OUTPUT LATCH REGISTER 0 #define OLAT1 0x03 // OUTPUT LATCH REGISTER 1 #define IPOL0 0x04 // INPUT POLARITY PORT REGISTER 0 #define IPOL1 0x05 // INPUT POLARITY 0 / I / O DIRECTION REGISTER 0 #define IODIR1 0x07 // I / O DIRECTION REGISTER 1 #define INTCAP0 0x08 // INTERRUPT CAPTURE REGISTER 0 #define INTCAP1 0x09 // INTERRUPT CAPTURE REGISTER 1 #define IOCON0 0x0A REGISTER 0 #define IOCON1 0x0B // I / O EXPANDER CONTROL REGISTER 1

Hakbang 18: Pag-setup

Narito mayroon kaming mga pagpapaandar upang simulan ang apat na magkakaibang uri ng mga microcontroller. Sinusuri din namin ang dalas, i-set up ang mga GPIO, at itatakda ang mga pin. Sa Loop, sinusuri namin ang katayuan ng pindutan.

void setup () {Serial.begin (9600); pagkaantala (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); // configura o GPIO1 como INPUT o GP1.0 at como OUTPUT sa labas ng 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 check Button (GP1); } // end loop

Hakbang 19: I-configure ang Port

Sa hakbang na ito, iko-configure namin ang mode ng mga GPIO pin at kilalanin ang mode ng mga port.

// configura o GPIO (GP0 ou GP1) // como parametro passamos: // port: GP0 ou GP1 // custom: INPUT para sa mga todos bilang mga porta na gagawin ng GP trabalharem como entrada // OUTPUT para sa mga todos bilang mga port do GP trabalharem como saida / / custom um valor de 0-255 indikasyon o modo das portas (1 = INPUT, 0 = OUTPUT) // hal: 0x01 ou B00000001 ou 1: indica que apenas o GPX.0 trabalhará como entrada, o restando como saida void configurePort (uint8_t port, uint8_t pasadyang) {kung (pasadyang == INPUT) {writeBlockData (port, 0xFF); } iba pa kung (pasadyang == OUTPUT) {writeBlockData (port, 0x00); } iba pa {writeBlockData (port, pasadyang); }}

Hakbang 20: WriteBlockData & Check Button

Dito, nagpapadala kami ng data sa MCP23016 sa pamamagitan ng i2c bus, suriin ang katayuan ng pindutan, at ipahiwatig ang susunod na hakbang habang isinasaalang-alang ang kalagayan ng pagpindot o hindi.

// 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 (data); Wire.endTransmission (); antala (10); }

// verifica se o botão foi pressionado // parametro GP: GP0 ou GP1 void check Button (uint8_t GP) {// faz a leitura do pino 0 no GP fornecido uint8_t btn = readPin (0, GP); // se botão pressionado, seta para HIGH as portas GP0 if (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa todas em estado LOW else {writeBlockData (GP0, B00000000); }}

Hakbang 21: ReadPin & ValueFromPin

Nakikipag-usap kami dito sa pagbabasa ng isang tukoy na pin, at ang pagbabalik ng halaga ng bit sa nais na posisyon.

// 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. Magsulat (gp); Wire.endTransmission (); Wire.requestFrom (MCPAddress, 1); // ler do chip 1 byte statusGP = Wire.read (); return halagaFromPin (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; }

Hakbang 22: Programa ng ESP8266

Mula dito, makikita natin kung paano nilikha ang program na ginamit namin sa ESP-01 at sa nodeMCU ESP-12E, na nagbibigay-daan sa amin upang maunawaan kung paano ang kaunting pagkakaiba sa pagitan ng mga ito.

Babaguhin lamang namin ang linya ng i2c tagapagtayo ng komunikasyon, na kung saan ay ang panimulang pamamaraan ng object ng Wire.

I-compress lang ang linya alinsunod sa plato na aming isusulat.

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

Pag-set up

Pansinin na ang tagabuo ay nagkomento pa rin. Samakatuwid, hindi pagkakasundo ayon sa iyong board (ESP-01 o nodeMCU ESP12-E).

void setup () {Serial.begin (9600); pagkaantala (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); // configura o GPIO1 como 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); }

Loop

Sa loop, pinalilipat namin ang mga pin bawat 1 segundo. Kaya, kapag naka-on ang pin0 ng GP0, naka-off ang mga pin ng GP1. Kapag naka-on ang pin0 ng GP1, naka-off ang mga GP0 pin.

void loop () {// seta o pino 7 do GP0 como HIGH e os demais como LOW writeBlockData (GP0, B10000000); // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000000); pagkaantala (1000); // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta o pino 0 do GP1 como HIGH e os demais como LOW writeBlockData (GP1, B00000001); pagkaantala (1000); } // end loop

Hakbang 23: MAHALAGA

Ang mga variable at ginamit na silid-aklatan ay kapareho ng sa program na ginawa namin para sa ESP32, pati na rin ang mga pamamaraan ng configurePort at writeBlockData.

Hakbang 24: Mga File

I-download ang mga file:

PDF

INO (ESP8266)

INO (ESP32)

Inirerekumendang: