Kazalo:

IO Expander za ESP32, ESP8266 in Arduino: 24 korakov
IO Expander za ESP32, ESP8266 in Arduino: 24 korakov

Video: IO Expander za ESP32, ESP8266 in Arduino: 24 korakov

Video: IO Expander za ESP32, ESP8266 in Arduino: 24 korakov
Video: Adding I/O with MCP23017 - Collin’s Lab Notes #adafruit #collinslabnotes 2024, November
Anonim
Image
Image
Uvod
Uvod

Ali želite razširiti število IO -jev vašega ESP32, ESP8266 ali Arduino? Ali ste razmišljali o možnosti 16 novih GPIO -jev, ki jih je mogoče nadzorovati z vodilom I2C? No, danes vam bom predstavil razširjevalnik GPIO MCP23016. Pokazal vam bom tudi, kako komunicirati z mikrokrmilnikom z MCP23016. Govoril bom tudi o ustvarjanju programa, v katerem bomo za komunikacijo z razširjevalnikom uporabili le 2 zatiča tega mikrokrmilnika. Te bomo uporabili za nadzor LED in gumba.

1. korak: Uvod

Naprava MCP23016 ponuja 16 bitov za razširitev GPIO z vodilom I2C. Vsak bit je mogoče konfigurirati posamično (vhodni ali izhodni).

MCP23016 je sestavljen iz več 8-bitnih nastavitev za izbiro vhoda, izhoda in polarnosti.

Razširjevalniki med drugimi primeri ponujajo preprosto rešitev, kadar so IO potrebni za stikala, senzorje, gumbe in LED.

2. korak: Značilnosti

16 vhodnih / izhodnih zatičev (16 vhodnih standardov)

Hitra taktna frekvenca vodila I2C (0-400 kbit/s)

Trije strojni zatiči za naslov omogočajo uporabo do osmih naprav

Snemalnik prestrezanja vrat

Register za obračanje polaritete za nastavitev polarnosti podatkov vhodnih vrat

Združljiv z večino mikrokrmilnikov

Korak: ESP01 ima lahko 128 GPIO -jev

ESP01 ima lahko 128 GPIO -jev!
ESP01 ima lahko 128 GPIO -jev!

Primer, ki kaže obseg tega razširjevalnika, je njegova uporaba z ESP01, ki ga je mogoče povezati z do osmimi razširitvami s samo dvema IOS -oma in doseči 128 GPIO.

4. korak: MCP23016

MCP23016
MCP23016

Tukaj imamo shemo razširitelja, ki ima dve skupini po osem bitov. To pomeni skupaj 16 vrat. Poleg prekinitvenega zatiča ima pin CLK, ki povezuje kondenzator in upor, ki sta notranje povezana v logična vrata. To naj bi ustvarilo uro z idejo kristalnega oscilatorja, ki potrebuje uro 1MHz. Pin TP se uporablja za merjenje ure. Zatiči A0, A1 in A2 so binarni naslovi.

5. korak: URA

URA
URA
URA
URA

MCP23016 zato uporablja zunanje RC vezje za določanje hitrosti notranje ure. Za pravilno delovanje naprave je potrebna (običajno) notranja ura 1 MHz. Notranjo uro lahko merite na zatiču TP. Priporočene vrednosti za REXT in CEXT so prikazane spodaj.

6. korak: Naslov

Za določitev naslova MCP23016 uporabimo zatiče A0, A1 in A2. Za spremembo naslova jih pustite na HIGH ali LOW.

Naslov bo oblikovan na naslednji način:

Naslov MCP_20 = 20 + (A0 A1 A2)

Kjer lahko A0 A1 A2 sprejme vrednosti VISOKO / NIZKO, to tvori binarno število od 0 do 7.

Na primer:

A0> GND, A1> GND, A2> GND (pomeni 000, nato 20 + 0 = 20)

Sicer, A0> HIGH, A1> GND, A2> HIGH (pomeni 101, nato 20 + 5 = 25)

7. korak: Ukazi

Ukazi
Ukazi

Spodaj je tabela z ukazi za komunikacijo. Uporabimo GP0 in GP1 ter IODIR0 in IODIR1.

8. korak: Kategorije:

GP0 / GP1 - Registri podatkovnih vrat

Obstajata dva registra, ki omogočata dostop do dveh vrat GPIO.

Odčitavanje registra prikazuje stanje zatičev na teh vratih.

Bit = 1> HIGH Bit = 0> LOW

OLAT0 / OLAT1 - IZHODNI REGISTRI LACTCH

Obstajata dva registra, ki omogočata dostop do izhodnih vrat obeh vrat.

IPOL0 / IPOL1 - Registri vhodnih polaritet

Ti registri omogočajo uporabniku, da konfigurira polarnost podatkov vhodnih vrat (GP0 in GP1).

IODIR0 / IODIR1

Obstajata dva registra, ki upravljata način pin. (Vhod ali izhod)

Bit = 1> INPUT Bit = 0> OUTPUT

INTCAP0 / INTCAP1 - Registri zajemanja prekinitev

To so registri, ki vsebujejo vrednost vrat, ki so ustvarila prekinitev.

IOCON0 / IOCON1 - Register za nadzor razširitve V / I

Ta nadzoruje funkcionalnost MCP23016.

Nastavitveni bit 0 (IARES> Interrupt Activity Resolution) nadzoruje frekvenco vzorčenja nožic vrat GP.

Bit0 = 0> (privzeto) Najdaljši čas zaznavanja aktivnosti vrat je 32 ms (nizka poraba energije)

Bit0 = 1> največji čas zaznavanja aktivnosti na vratih je 200usec (večja poraba energije)

9. korak: Struktura komunikacije

Struktura za komunikacijo
Struktura za komunikacijo

Tukaj prikazujem razred Wire, ki je komunikacija I2C v našem jedru Arduino, ki omogoča razširjevalniku tudi delo z Arduino Uno in Mega. Vendar ima slednji že več IO. Tu obravnavamo naslove čipa, nadzor dostopa, ki so kode registrov, pa tudi podatke.

10. korak: Program

Program
Program

Naš program vključuje komuniciranje ESP32 z MCP23016, da bi lahko uporabljali več GPIO -jev. Nato bomo imeli gumb in nekaj LED priklopljenih na MCP23016. Vse jih bomo nadzorovali samo z vodilom I2C. Tako bosta uporabljena le dva zatiča ESP32. Slikovni krog si lahko ogledate spodaj v videu.

11. korak: ESP01

ESP01
ESP01

Tukaj prikazujem Pinout ESP01.

Korak: Namestitev ESP01

Montaža ESP01
Montaža ESP01

V tem primeru imamo GPIO0 priključen v SDA, GPIO2 pa v SCL. Imamo tudi relejno ploščo, zvočni signal in LED. Na drugih vratih, v GP1.0, imamo še eno LED z uporom.

Korak: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Tukaj imamo pinout NodeMCU ESP-12E.

Korak 14: Montaža vozliščaMCU ESP-12E

Montažno vozliščeMCU ESP-12E
Montažno vozliščeMCU ESP-12E

V tem primeru je edina razlika od prvega primera v tem, da ste priključili D1 in D2 v SDA oziroma SCL.

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

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

Tukaj je pinout WiFi NodeMCU-32S ESP-WROOM-32.

Korak: Node za namestitev WiFiMCU-32S ESP-WROOM-32

Node za namestitev WiFiMCU-32S ESP-WROOM-32
Node za namestitev WiFiMCU-32S ESP-WROOM-32

Tokrat je glavna razlika od drugih dveh primerov gumb in tri utripajoče LED. Tu je SDA priključen na GPIO19, SCL pa na GPIO23.

17. korak: Knjižnice in spremenljivke

Najprej bomo vključili Wire.h, ki je odgovoren za komunikacijo i2c, kot tudi nastavitev naslova i2c za MCP23016. Prikažem več ukazov, tudi nekaterih, ki jih v tem projektu ne uporabljamo.

#include // določite uporabo knjižnice Wire.h. // endereço I2C do MCP23016 #define MCPAddress 0x20 // RAZMERJA UKAZNEGA BAJTA ZA REGISTRACIJO: Tabela: 1-3 mikročipa MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // REGISTER PORT PODATKOV 0 #define D1 PORT REGISTR 1 #define OLAT0 0x02 // REGISTRAT IZHODNEGA ZAPORKA 0 #define OLAT1 0x03 // REGISTRAT IZHODNEGA ZAPAKA 1 #define IPOL0 0x04 // REGISTRAT VLOGA POLARNOSTI 0 #define IPOL1 0x05 // INPUT POLARITY PORT IGRE 1 /I/O REGISTRACIJA NAVODIL 0 #define IODIR1 0x07 // V/I DIRECTION REGISTER 1 #define INTCAP0 0x08 // REGRETER REGISTRACIJE UMETKOV 0 #define INTCAP1 0x09 // REGRATIRAJ REGISTAR UMETA 1 #define IOCON0 OxPAND I/ REGISTRACIJA 0 #define IOCON1 0x0B // V/I REGISTRATOR NADZORA RAZŠIRITVE 1

18. korak: Nastavitev

Tu imamo funkcije za inicializacijo štirih različnih tipov mikrokrmilnikov. Preverimo tudi frekvenco, nastavimo GPIO in nastavimo zatiče. V zanki preverimo stanje gumba.

void setup () {Serial.begin (9600); zamuda (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekvenca // konfiguracija o GPIO0 kot OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfiguracija o GPIO1 kot VHOD o GP1.0 ali skupni IZHOD preko GP1 configurePort (IODIR1, 0x01); // seta todos os pinos do GPIO0 ali LOW writeBlockData (GP0, B00000000); // določa, da so na voljo GPIO1 ali LOW writeBlockData (GP1, B00000000); } void loop () {// verifica e o botão GP foi pressionado checkButton (GP1); } // zaključna zanka

19. korak: ConfigurePort

V tem koraku konfiguriramo način zatičev GPIO in določimo način vrat.

// konfiguracija o GPIO (GP0 ali GP1) // parametro passamos: // vrata: GP0 ali GP1 // po meri: 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) // ex: 0x01 ou B00000001 ou 1: indica que apenas o GPX.0 trabalhará como entrada, o restando como saida void configurePort (uint8_t vrata, uint8_t po meri) {if (custom == INPUT) {writeBlockData (vrata, 0xFF); } else if (custom == OUTPUT) {writeBlockData (vrata, 0x00); } else {writeBlockData (vrata, po meri); }}

20. korak: WriteBlockData & CheckButton

Tu pošiljamo podatke na MCP23016 prek vodila i2c, preverjamo stanje gumba in označujemo naslednji korak, pri tem pa upoštevamo pogoj, da smo pritisnjeni ali ne.

// enva 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 (podatki); Wire.endTransmission (); zamuda (10); }

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

21. korak: ReadPin & ValueFromPin

Tu obravnavamo odčitavanje določenega zatiča in vrnitev bitne vrednosti v želeni položaj.

// 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 (naslov MCP); Wire.write (gp); Wire.endTransmission (); Wire.requestFrom (naslov MCP, 1); // ler do chip 1 byte statusGP = Wire.read (); vrnjena vrednostFromPin (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; }

Korak: Program ESP8266

Od tu bomo videli, kako je nastal program, ki smo ga uporabljali v ESP-01 in v vozlišču MCU ESP-12E, kar nam omogoča razumevanje, kako so razlike med njimi minimalne.

Spremenili bomo le vrstico komunikacijskega konstruktorja i2c, ki je začetna metoda predmeta Wire.

Samo komentirajte vrstico glede na ploščo, ki jo bomo sestavili.

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

Nastaviti

Upoštevajte, da je graditelj še vedno komentiran. Zato komentirajte glede na svojo ploščo (ESP-01 ali nodeMCU ESP12-E).

void setup () {Serial.begin (9600); zamuda (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekvenca // konfiguracija o GPIO0 kot OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfiguracija o GPIO1 kot OUTPUT (todos os pinos) configurePort (IODIR1, OUTPUT); // določa, da je do GPIO0 prišlo nizko writeBlockData (GP0, B00000000); // določa, da do GPIO1 ni LOW writeBlockData (GP1, B00000001); }

Zanka

V zanki vsake 1 sekundo preklapljamo nožice. Ko je pin0 GP0 vklopljen, so zatiči GP1 izklopljeni. Ko je pin0 GP1 vklopljen, so zatiči GP0 izklopljeni.

void loop () {// seta o pino 7 do GP0 glede na HIGH e os demais como LOW writeBlockData (GP0, B10000000); // določa, da so na voljo GPIO1 ali LOW writeBlockData (GP1, B00000000); zamuda (1000); // določa, da je do GPIO0 prišlo nizko writeBlockData (GP0, B00000000); // seta o pino 0 do GP1 kot HIGH e os demais como LOW writeBlockData (GP1, B00000001); zamuda (1000); } // zaključna zanka

23. korak: POMEMBNO

Uporabljene spremenljivke in knjižnica so enake kot pri programu, ki smo ga naredili za ESP32, pa tudi pri metodah configurePort in writeBlockData.

Korak: Datoteke

Prenesite datoteke:

PDF

INO (ESP8266)

INO (ESP32)

Priporočena: