Sisällysluettelo:

IO Expander ESP32, ESP8266 ja Arduino: 24 vaihetta
IO Expander ESP32, ESP8266 ja Arduino: 24 vaihetta

Video: IO Expander ESP32, ESP8266 ja Arduino: 24 vaihetta

Video: IO Expander ESP32, ESP8266 ja Arduino: 24 vaihetta
Video: Adding I/O with MCP23017 - Collin’s Lab Notes #adafruit #collinslabnotes 2024, Heinäkuu
Anonim
Image
Image
Johdanto
Johdanto

Haluatko laajentaa ESP32: n, ESP8266: n tai Arduinon IO: ita? Oletko ajatellut mahdollisuutta 16 uudelle GPIO: lle, joita voidaan ohjata I2C -väylän avulla? Tänään esittelen sinulle GPIO -laajennuksen MCP23016. Näytän myös, kuinka voit kommunikoida mikro -ohjaimen kanssa MCP23016: n kanssa. Puhun myös sellaisen ohjelman luomisesta, jossa käytämme vain kahta tämän mikro -ohjaimen nastaa kommunikoidaksesi laajentimen kanssa. Käytämme niitä LEDien ja painikkeen ohjaamiseen.

Vaihe 1: Johdanto

MCP23016 -laite tarjoaa 16 bittiä GPIO -laajennukseen I2C -väylän avulla. Jokainen bitti voidaan konfiguroida erikseen (tulo tai lähtö).

MCP23016 sisältää useita 8-bittisiä asetuksia tulo-, lähtö- ja napaisuusvalintaa varten.

Laajennukset tarjoavat yksinkertaisen ratkaisun, kun IO: ita tarvitaan muun muassa kytkimiin, antureihin, painikkeisiin ja LED -valoihin.

Vaihe 2: Ominaisuudet

16 tulo- / lähtönastausta (16 tulovakioa)

Nopea I2C-väylän kellotaajuus (0-400 kt/s)

Kolme laitteisto -osoitetappia mahdollistaa jopa kahdeksan laitteen käytön

Keskeytä Port Capture Recorder

Napaisuuden kääntörekisteri syöttöporttitietojen napaisuuden asettamiseksi

Yhteensopiva useimpien mikro -ohjaimien kanssa

Vaihe 3: ESP01: llä voi olla 128 GPIO: ta

ESP01 voi sisältää 128 GPIO: ta!
ESP01 voi sisältää 128 GPIO: ta!

Esimerkki tämän laajennuksen suuruudesta on sen käyttö ESP01: n kanssa, joka voidaan liittää enintään kahdeksaan laajennukseen vain kahdella IOS: lla, saavuttaen 128 GPIO: ta.

Vaihe 4: MCP23016

MCP23016
MCP23016

Tässä meillä on kaavamainen laajennin, jossa on kaksi kahdeksan bitin ryhmää. Tämä tarkoittaa yhteensä 16 porttia. Keskeytystapin lisäksi siinä on CLK -nasta, joka yhdistää kondensaattorin ja vastuksen, jotka on kytketty sisäisesti logiikkaporttiin. Tämä muodostaa kellon käyttämällä kideoskillaattoria, joka tarvitsee 1 MHz: n kellon. TP -tappia käytetään kellon mittaamiseen. Nastat A0, A1 ja A2 ovat binääriosoitteita.

Vaihe 5: KELLO

KELLO
KELLO
KELLO
KELLO

MCP23016 käyttää siksi ulkoista RC -piiriä sisäisen kellon nopeuden määrittämiseen. Laitteen toimimiseksi vaaditaan (yleensä) 1 MHz: n sisäinen kello. Sisäinen kello voidaan mitata TP -tapista. REXT: n ja CEXT: n suositellut arvot on esitetty alla.

Vaihe 6: Osoite

MCP23016: n osoitteen määrittämiseen käytämme sitten nastoja A0, A1 ja A2. Jätä ne vain HIGH tai LOW osoitteeseen.

Osoite muodostetaan seuraavasti:

MCP_osoite = 20 + (A0 A1 A2)

Jos A0 A1 A2 voi ottaa HIGH / LOW -arvoja, tämä muodostaa binääriluvun 0-7.

Esimerkiksi:

A0> GND, A1> GND, A2> GND (tarkoittaa 000, sitten 20 + 0 = 20)

Tai muuten, A0> HIGH, A1> GND, A2> HIGH (tarkoittaa 101, sitten 20 + 5 = 25)

Vaihe 7: Komennot

Komennot
Komennot

Alla on taulukko kommunikointikomennoilla. Käytetään GP0 ja GP1 sekä IODIR0 ja IODIR1.

Vaihe 8: Luokat:

GP0 / GP1 - Dataportin rekisterit

On olemassa kaksi rekisteriä, jotka tarjoavat pääsyn kahteen GPIO -porttiin.

Rekisterin lukema näyttää kyseisen portin nastojen tilan.

Bitti = 1> HIGH Bit = 0> LOW

OLAT0 / OLAT1 - LACTCH -lähtörekisterit

On olemassa kaksi rekisteriä, jotka tarjoavat pääsyn kahden portin lähtöportteihin.

IPOL0 / IPOL1 - Tulojen napaisuusrekisterit

Näiden rekisterien avulla käyttäjä voi määrittää tuloporttitietojen (GP0 ja GP1) napaisuuden.

IODIR0 / IODIR1

Pin -tilaa ohjaavat kaksi rekisteriä. (Tulo tai lähtö)

Bitti = 1> TULOBitti = 0> LÄHTÖ

INTCAP0 / INTCAP1 - Keskeytä sieppausrekisterit

Nämä ovat rekistereitä, jotka sisältävät keskeytyksen tuottaneen portin arvon.

IOCON0 / IOCON1 - I / O Expander Control Register

Tämä ohjaa MCP23016 -laitteen toimintaa.

Asetusbitti 0 (IARES> Keskeytyksen toiminnan tarkkuus) ohjaa GP -portin nastojen näytteenottotaajuutta.

Bit0 = 0> (oletus) Portin aktiivisuuden enimmäisaika on 32 ms (alhainen virrankulutus)

Bit0 = 1> portin aktiivisuuden havaitsemisaika on 200 s (suurempi virrankulutus)

Vaihe 9: Viestinnän rakenne

Viestinnän rakenne
Viestinnän rakenne

Näytän tässä Wire -luokan, joka on Arduinon ytimen I2C -viestintä, joka mahdollistaa myös laajennuksen työskentelyn Arduino Unon ja Megan kanssa. Jälkimmäisellä on kuitenkin jo useita IO: ita. Käsittelemme täällä sirun osoitteita, kulunvalvontaa, jotka ovat rekisterien koodeja, sekä tietoja.

Vaihe 10: Ohjelmoi

Ohjelmoida
Ohjelmoida

Ohjelmamme koostuu ESP32: n kommunikoimisesta MCP23016: n kanssa, jotta käytettävissä olisi enemmän GPIO: ita. Meillä on sitten painike ja jotkut LEDit kytketty MCP23016: een. Hallitsemme niitä kaikkia vain I2C -väylän avulla. Näin ollen käytetään vain kahta ESP32 -nastaa. Näet alla olevan kuvapiirin videosta.

Vaihe 11: ESP01

ESP01
ESP01

Tässä näytän ESP01: n Pinoutin.

Vaihe 12: ESP01: n asennus

Asennus ESP01
Asennus ESP01

Tässä esimerkissä GPIO0 on kytketty SDA: han ja GPIO2 SCL: ään. Meillä on myös relelevy, summeri ja LED. Toisessa portissa, GP1.0, meillä on vielä yksi LED, jossa on vastus.

Vaihe 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Tässä meillä on NodeMCU ESP-12E: n Pinout.

Vaihe 14: NodeMCU ESP-12E: n asennus

AsennussolkuMCU ESP-12E
AsennussolkuMCU ESP-12E

Tässä tapauksessa ainoa ero ensimmäiseen esimerkkiin on, että olet liittänyt D1 ja D2 SDA- ja SCL -järjestelmiin.

Vaihe 15: WiFi-solmuMCU-32S ESP-WROOM-32

WiFi-solmuMCU-32S ESP-WROOM-32
WiFi-solmuMCU-32S ESP-WROOM-32

Tässä on WiFi-solmun pinoutMCU-32S ESP-WROOM-32.

Vaihe 16: WiFi-asennussolmuMCU-32S ESP-WROOM-32

WiFi-asennussolmuMCU-32S ESP-WROOM-32
WiFi-asennussolmuMCU-32S ESP-WROOM-32

Tällä kertaa tärkein ero muihin kahteen esimerkkiin on painike ja kolme vilkkuvaa LEDiä. Tässä SDA on kytketty GPIO19: een, kun taas SCL on kytketty GPIO23: een.

Vaihe 17: Kirjastot ja muuttujat

Ensinnäkin sisällytämme Wire.h: n, joka vastaa i2c -viestinnästä, ja asetamme MCP23016: n i2c -osoitteen. Näytän useita komentoja, jopa joitain, joita emme käytä tässä projektissa.

#include // määritä Wire.h -kirjaston käyttö. // endereço I2C do MCP23016 #define MCPAddress 0x20 // COMMAND BYTE to REGISTER RELATIONSHIP: Table: 1-3 of Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // DATA PORT REGISTER 0 #0 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 POLP /I/O -SUUNTAREGISTERI 0 #define IODIR1 0x07 // I/O DIRECTION REGISTER 1 #define INTCAP0 0x08 // INTERRUPT CAPTURE REGISTER 0 #define INTCAP1 0x09 // INTERRUPT CAPTURE REGISTER 1 #define IOC0 REGISTER 0 #define IOCON1 0x0B // I/O EXPANDER CONTROL REGISTER 1

Vaihe 18: Asennus

Tässä meillä on toiminnot neljän eri tyyppisen mikro -ohjaimen alustamiseen. Tarkistamme myös taajuuden, asetamme GPIO: t ja asetamme nastat. Silmukassa tarkistamme painikkeen tilan.

void setup () {Serial.begin (9600); viive (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // taajuus // kokoonpano tai GPIO0 como OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // configura o GPIO1 como INPUT o GP1.0 e como OUTPUT os outros 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); } // lopetuslenkki

Vaihe 19: ConfigurePort

Tässä vaiheessa määritämme GPIO -nastojen tilan ja tunnistamme porttien tilan.

// konfigurointi GPIO (GP0 tai GP1) // como parametro passamos: // portti: GP0 ou GP1 // custom: INPUT for todas as portas do GP trabalharem como entrada // OUTPUT for todos as portas do GP trabalharem como saida/ / custom um valor de 0-255 indicando o modo das portas (1 = INPUT, 0 = OUTPUT) // esim: 0x01 tai B00000001 ou 1: indica que apenas o GPX.0 trabalhará como entrada, o restando como saida void configurePort (uint8_t -portti, uint8_t mukautettu) {if (custom == INPUT) {writeBlockData (portti, 0xFF); } else if (custom == LÄHTÖ) {writeBlockData (portti, 0x00); } else {writeBlockData (portti, mukautettu); }}

Vaihe 20: WriteBlockData & CheckButton

Täällä lähetämme tietoja MCP23016: een i2c -väylän kautta, tarkistamme painikkeen tilan ja osoitamme seuraavan vaiheen ottaen samalla huomioon sen, onko sitä painettu vai ei.

// envia dados para o MCP23016 através do barramento i2c // cmd: COMANDO (rekisteröijä) // data: dados (0-255) void writeBlockData (uint8_t cmd, uint8_t data) {Wire.beginTransmission (MCPAddress); Wire.write (cmd); Wire.write (data); Wire.endTransmission (); viive (10); }

// verifica se o botão foi pressionado // parametri GP: GP0 tai 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, set para HIGH as portas GP0 if (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa todas em estado LOW else {writeBlockData (GP0, B00000000); }}

Vaihe 21: ReadPin & ValueFromPin

Käsittelemme tässä tietyn nastan lukemista ja bittiarvon palauttamista haluttuun kohtaan.

// 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 (); Wire.requestFrom (MCPAddress, 1); // ler do siru 1 tavu statusGP = Wire.read (); return valueFromPin (pin, statusGP); } // retorna o valor do bit na posição desejada // pin: posição bit (0-7) // statusGP: valor lido do GP (0-255) uint8_t valueFromPin (uint8_t pin, uint8_t statusGP) {return (statusGP & (0x0001 << nasta)) == 0? 0: 1; }

Vaihe 22: ESP8266 -ohjelma

Täältä näemme, kuinka ESP-01: ssä ja solmun MCU ESP-12E: ssä käyttämämme ohjelma luotiin, joten voimme ymmärtää, kuinka erot niiden välillä ovat vähäiset.

Muokkaamme vain i2c -viestintäkonstruktorin riviä, joka on Wire -objektin alkutapa.

Poista kommentti vain rivistä sen levyn mukaan, jonka aiomme koota.

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

Perustaa

Huomaa, että rakentajaa kommentoidaan edelleen. Älä siis kommentoi korttisi mukaan (ESP-01 tai nodeMCU ESP12-E).

void setup () {Serial.begin (9600); viive (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // taajuus // kokoonpano tai 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); }

Silmukka

Silmukassa vaihdamme tapit 1 sekunnin välein. Näin ollen, kun GP0: n nasta 0 on päällä, GP1: n nastat ovat pois päältä. Kun GP1: n pin0 on päällä, GP0 -nastat ovat pois päältä.

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); viive (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); viive (1000); } // lopetuslenkki

Vaihe 23: TÄRKEÄÄ

Käytetyt muuttujat ja kirjasto ovat samat kuin ohjelmassa, jota teimme ESP32: lle, samoin kuin configurePort- ja writeBlockData -menetelmät.

Vaihe 24: Tiedostot

Lataa tiedostot:

PDF

INO (ESP8266)

INO (ESP32)

Suositeltava: