Satura rādītājs:

IO Expander ESP32, ESP8266 un Arduino: 24 soļi
IO Expander ESP32, ESP8266 un Arduino: 24 soļi

Video: IO Expander ESP32, ESP8266 un Arduino: 24 soļi

Video: IO Expander ESP32, ESP8266 un Arduino: 24 soļi
Video: Adding I/O with MCP23017 - Collin’s Lab Notes #adafruit #collinslabnotes 2024, Novembris
Anonim
Image
Image
Ievads
Ievads

Vai vēlaties paplašināt ESP32, ESP8266 vai Arduino IO? Un vai esat domājuši par iespēju izveidot 16 jaunus GPIO, kurus var kontrolēt, izmantojot I2C kopni? Nu šodien es jūs iepazīstināšu ar GPIO paplašinātāju MCP23016. Es arī parādīšu, kā sazināties ar mikrokontrolleri ar MCP23016. Es arī runāšu par programmas izveidi, kurā saziņai ar paplašinātāju izmantosim tikai 2 šī mikrokontrollera tapas. Mēs tos izmantosim, lai kontrolētu gaismas diodes un pogu.

1. darbība. Ievads

MCP23016 ierīce nodrošina 16 bitus GPIO paplašināšanai, izmantojot I2C kopni. Katru bitu var konfigurēt atsevišķi (ievadi vai izvadi).

MCP23016 sastāv no vairākiem 8 bitu iestatījumiem ievades, izvades un polaritātes izvēlei.

Paplašinātāji nodrošina vienkāršu risinājumu gadījumos, kad IO ir nepieciešami slēdžiem, sensoriem, pogām un gaismas diodēm.

2. darbība. Raksturlielumi

16 ieejas / izejas tapas (16 ieejas standarts)

Ātra I2C kopnes pulksteņa frekvence (0-400 kbits/s)

Trīs aparatūras adatu tapas ļauj izmantot līdz astoņām ierīcēm

Pārtraukt portu uzņemšanas ierakstītāju

Polaritātes maiņas reģistrs ievades porta datu polaritātes iestatīšanai

Savietojams ar lielāko daļu mikrokontrolleru

3. darbība. ESP01 var būt 128 GPIO

ESP01 var būt 128 GPIO!
ESP01 var būt 128 GPIO!

Piemērs, kas parāda šī paplašinātāja lielumu, ir tā izmantošana kopā ar ESP01, kuru var savienot līdz astoņiem paplašinātājiem tikai ar diviem IOS, sasniedzot 128 GPIO.

4. darbība: MCP23016

MCP23016
MCP23016

Šeit mums ir paplašinātāja shēma, kurā ir divas astoņu bitu grupas. Tas kopumā nodrošina 16 ostas. Papildus pārtraukšanas tapai tam ir CLK tapa, kas savieno kondensatoru un rezistoru, kas ir iekšēji savienoti loģiskajā portā. Tas ir pulksteņa veidošanai, izmantojot kristāla oscilatora ideju, kurai nepieciešams 1MHz pulkstenis. TP tapu izmanto pulksteņa mērīšanai. Tapas A0, A1 un A2 ir bināras adreses.

5. solis: pulkstenis

Pulkstenis
Pulkstenis
Pulkstenis
Pulkstenis

Tāpēc MCP23016 izmanto ārēju RC ķēdi, lai noteiktu iekšējā pulksteņa ātrumu. Lai ierīce darbotos pareizi, ir nepieciešams (parasti) 1 MHz iekšējais pulkstenis. Iekšējo pulksteni var izmērīt uz TP tapas. REXT un CEXT ieteicamās vērtības ir norādītas zemāk.

6. darbība: adrese

Lai definētu MCP23016 adresi, mēs izmantojam tapas A0, A1 un A2. Vienkārši atstājiet tos HIGH vai LOW, lai mainītu adresi.

Adrese tiks veidota šādi:

MCP_Address = 20 + (A0 A1 A2)

Ja A0 A1 A2 var iegūt HIGH / LOW vērtības, tas veido bināru skaitli no 0 līdz 7.

Piemēram:

A0> GND, A1> GND, A2> GND (nozīmē 000, tad 20 + 0 = 20)

Vai arī, A0> HIGH, A1> GND, A2> HIGH (tas nozīmē 101, tad 20 + 5 = 25)

7. solis: komandas

Komandas
Komandas

Zemāk ir tabula ar saziņas komandām. Izmantosim GP0 un GP1, kā arī IODIR0 un IODIR1.

8. darbība. Kategorijas:

GP0 / GP1 - datu portu reģistri

Ir divi reģistri, kas nodrošina piekļuvi abiem GPIO portiem.

Reģistra nolasījums nodrošina tapas statusu šajā ostā.

Bits = 1> HIGH Bit = 0> LOW

OLAT0 / OLAT1 - izvades LACTCH REĢISTRI

Ir divi reģistri, kas nodrošina piekļuvi abu portu izejas portiem.

IPOL0 / IPOL1 - ievades polaritātes reģistri

Šie reģistri ļauj lietotājam konfigurēt ievades porta datu (GP0 un GP1) polaritāti.

IODIR0 / IODIR1

Ir divi reģistri, kas kontrolē tapas režīmu. (Ievads vai izvads)

Bits = 1> IEVADES bits = 0> IZEJA

INTCAP0 / INTCAP1 - pārtraukt uztveršanas reģistrus

Tie ir reģistri, kuros ir porta vērtība, kas radīja pārtraukumu.

IOCON0 / IOCON1 - I / O paplašinātāja vadības reģistrs

Tas kontrolē MCP23016 funkcionalitāti.

Iestatīšanas bits 0 (IARES> Pārtraukt darbības izšķirtspēju) kontrolē GP porta kontaktu paraugu ņemšanas biežumu.

Bit0 = 0> (noklusējums) Maksimālais ostas darbības noteikšanas laiks ir 32 ms (zems enerģijas patēriņš)

Bit0 = 1> maksimālais aktivitātes noteikšanas laiks ostā ir 200usec (lielāks enerģijas patēriņš)

9. solis: saziņas struktūra

Komunikācijas struktūra
Komunikācijas struktūra

Šeit es parādīšu Wire klasi, kas ir I2C komunikācija mūsu kodolā Arduino, kas arī ļauj paplašinātājam strādāt ar Arduino Uno un Mega. Tomēr pēdējam jau ir vairāki IO. Šeit mēs risinām mikroshēmas adreses, piekļuves kontroli, kas ir reģistru kodi, kā arī datus.

10. solis: programma

Programma
Programma

Mūsu programma sastāv no saziņas ar ESP32 ar MCP23016, lai būtu vairāk GPIO, ko izmantot. Pēc tam mums būs poga un dažas gaismas diodes, kas savienotas ar MCP23016. Mēs tos visus kontrolēsim, izmantojot tikai I2C kopni. Tādējādi tiks izmantotas tikai divas ESP32 tapas. Tālāk redzamo attēla shēmu varat redzēt videoklipā.

11. darbība: ESP01

ESP01
ESP01

Šeit es parādīju ESP01 Pinout.

12. darbība: ESP01 uzstādīšana

Montāža ESP01
Montāža ESP01

Šajā piemērā GPIO0 ir pievienots SDA, bet GPIO2 - SCL. Mums ir arī releja dēlis, skaņas signāls un gaismas diode. Otrā ostā, GP1.0, mums ir vēl viens LED ar rezistoru.

13. darbība: NodeMCU ESP-12E

MezglsMCU ESP-12E
MezglsMCU ESP-12E

Šeit mums ir NodeMCU ESP-12E pinout.

14. darbība: NodeMCU ESP-12E montāža

Montāžas mezglsMCU ESP-12E
Montāžas mezglsMCU ESP-12E

Šajā gadījumā vienīgā atšķirība no pirmā piemēra ir tāda, ka SDA un SCL esat pievienojis D1 un D2.

15. solis: WiFi mezglsMCU-32S ESP-WROOM-32

WiFi mezglsMCU-32S ESP-WROOM-32
WiFi mezglsMCU-32S ESP-WROOM-32

Šeit ir WiFi mezgla pinoutMCU-32S ESP-WROOM-32 pinout.

16. solis: WiFi montāžas mezglsMCU-32S ESP-WROOM-32

WiFi montāžas mezglsMCU-32S ESP-WROOM-32
WiFi montāžas mezglsMCU-32S ESP-WROOM-32

Šoreiz galvenā atšķirība no pārējiem diviem piemēriem ir poga un trīs mirgojošās gaismas diodes. Šeit SDA ir savienots ar GPIO19, bet SCL - ar GPIO23.

17. darbība: bibliotēkas un mainīgie

Pirmkārt, mēs iekļausim Wire.h, kas ir atbildīgs par i2c komunikāciju, kā arī iestatīs MCP23016 i2c adresi. Es rādu vairākas komandas, pat dažas, kuras mēs neizmantojam šajā projektā.

#include // norādiet Wire.h bibliotēkas izmantošanu. // endereço I2C do MCP23016 #define MCPAddress 0x20 // COMMAND BYTE REĢISTRĒT ATTIECĪBAS: Tabula: Microchip MCP23016 - DS20090A // 1-3. tabula. PORTU REĢISTRS 1 #define OLAT0 0x02 // OUTPUT LATCH REEGISTER 0 #define OLAT1 0x03 // IZEJAS LATVIJAS REĢISTRS 1 #define IPOL0 0x04 // IEJAS POLARITĀTES PORTĀLA REĢISTRS 0 #define IPOL1 0x05 // IEJAS IENĀDE /I/O DIRECTION REGISTER 0 #define IODIR1 0x07 // I/O DIRECTION REGISTER 1 #define INTCAP0 0x08 // INTERRUPT CAPTURE REEGISTER 0 #define INTCAP1 0x09 // INTERRUPT CAPTURE REGISTER 1 #define IOC0 REĢISTRĀTS 0 #define IOCON1 0x0B // I/O PAPLAŠINĀTĀJA VADĪBAS REĢISTRS 1

18. darbība: iestatīšana

Šeit mums ir funkcijas četru dažādu veidu mikrokontrolleru inicializēšanai. Mēs arī pārbaudām frekvenci, iestatām GPIO un iestatām tapas. Cilpā mēs pārbaudām pogas statusu.

void setup () {Serial.begin (9600); kavēšanās (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekvence // konfigurācija vai GPIO0 como OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfigurācija GPIO1 como INPUT vai GP1.0 un 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); } // beigu cilpa

19. darbība. ConfigurePort

Šajā solī mēs konfigurējam GPIO tapu režīmu un identificējam portu režīmu.

// GPIO konfigurācija (GP0 vai GP1) // komo parametri passamos: // ports: GP0 vai GP1 // pielāgots: 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 ports, uint8_t custom) {if (custom == INPUT) {writeBlockData (ports, 0xFF); } cits if (custom == OUTPUT) {writeBlockData (ports, 0x00); } else {writeBlockData (ports, pielāgots); }}

20. solis: WriteBlockData & CheckButton

Šeit mēs nosūtām datus uz MCP23016 caur i2c kopni, pārbaudām pogas statusu un norādām nākamo soli, vienlaikus ņemot vērā nospiešanas stāvokli.

// envia dados para o MCP23016 através do barramento i2c // cmd: COMANDO (reģistrators) // dati: dados (0-255) void writeBlockData (uint8_t cmd, uint8_t data) {Wire.beginTransmission (MCPAddress); Wire.write (cmd); Wire.write (dati); Wire.endTransmission (); kavēšanās (10); }

// verifica se o botão foi pressionado // parametrs GP: GP0 vai 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); }}

21. darbība: ReadPin un ValueFromPin

Šeit mēs nodarbojamies ar konkrētas tapas nolasīšanu un bitu vērtības atgriešanu vēlamajā pozīcijā.

// 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 mikroshēmas 1 baita statussGP = Wire.read (); atgriezt vērtībuFromPin (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; }

22. darbība: ESP8266 programma

No šejienes mēs redzēsim, kā tika izveidota programma, kuru izmantojām ESP-01 un mezglā MCU ESP-12E, kas ļauj mums saprast, cik atšķirības starp tām ir minimālas.

Mēs mainīsim tikai i2c sakaru konstruktora līniju, kas ir Wire objekta sākuma metode.

Vienkārši atceliet rindu saskaņā ar plāksni, kuru mēs apkoposim.

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

Uzstādīt

Ņemiet vērā, ka celtnieks joprojām ir komentēts. Tāpēc izsauciet komentārus saskaņā ar savu dēli (ESP-01 vai nodeMCU ESP12-E).

void setup () {Serial.begin (9600); kavēšanās (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekvence // konfigurācija vai 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); }

Cilpa

Cilpā mēs mainām tapas ik pēc 1 sekundes. Tādējādi, kad GP0 pin0 ir ieslēgts, GP1 tapas ir izslēgtas. Kad GP1 pin0 ir ieslēgts, GP0 tapas ir izslēgtas.

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); kavēšanās (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); kavēšanās (1000); } // beigu cilpa

23. darbība: SVARĪGI

Izmantotie mainīgie un bibliotēka ir tādi paši kā programmā, ko izmantojām ESP32, kā arī metodes configurePort un writeBlockData.

24. darbība: faili

Lejupielādējiet failus:

PDF

INO (ESP8266)

INO (ESP32)

Ieteicams: