Turinys:

„IO Expander“, skirtas ESP32, ESP8266 ir „Arduino“: 24 žingsniai
„IO Expander“, skirtas ESP32, ESP8266 ir „Arduino“: 24 žingsniai

Video: „IO Expander“, skirtas ESP32, ESP8266 ir „Arduino“: 24 žingsniai

Video: „IO Expander“, skirtas ESP32, ESP8266 ir „Arduino“: 24 žingsniai
Video: ATtiny85 IR Remote Control for Room Automation, smallest Arduino 2024, Lapkritis
Anonim
Image
Image
Įvadas
Įvadas

Ar norėtumėte išplėsti savo ESP32, ESP8266 ar „Arduino“IO? O ar pagalvojote apie galimybę sukurti 16 naujų GPIO, kuriuos galima valdyti naudojant I2C magistralę? Na, šiandien aš jums pristatysiu GPIO plėtiklį MCP23016. Taip pat parodysiu, kaip bendrauti su mikrovaldikliu su MCP23016. Taip pat kalbėsiu apie programos sukūrimą, kur bendraudami su plėtikliu naudosime tik 2 šio mikrovaldiklio kaiščius. Mes juos naudosime šviesos diodams ir mygtukui valdyti.

1 žingsnis: Įvadas

MCP23016 įrenginyje yra 16 bitų GPIO išplėtimui naudojant I2C magistralę. Kiekvieną bitą galima konfigūruoti atskirai (įvestis arba išvestis).

MCP23016 sudaro keli 8 bitų įvesties, išvesties ir poliškumo nustatymai.

Plėtikliai suteikia paprastą sprendimą, kai, be kitų pavyzdžių, reikalingi jungikliai, jutikliai, mygtukai ir šviesos diodai.

2 žingsnis: charakteristikos

16 įvesties / išvesties kaiščių (16 įvesties standartų)

Greitas I2C magistralės laikrodžio dažnis (0–400 kbits/s)

Trys aparatinės įrangos adresų kaiščiai leidžia naudoti iki aštuonių įrenginių

Nutraukti prievado fiksavimo įrašymo įrenginį

Poliškumo keitimo registras, skirtas įvesties prievado duomenų poliškumui nustatyti

Suderinamas su dauguma mikrovaldiklių

3 žingsnis: ESP01 gali turėti 128 GPIO

ESP01 gali turėti 128 GPIO!
ESP01 gali turėti 128 GPIO!

Pavyzdys, parodantis šio plėtiklio dydį, yra jo naudojimas su ESP01, kurį galima prijungti iki aštuonių plėtiklių tik dviem IOS, pasiekiant 128 GPIO.

4 žingsnis: MCP23016

MCP23016
MCP23016

Čia mes turime plėtiklio, kuriame yra dvi aštuonių bitų grupės, schemą. Tai iš viso sudaro 16 uostų. Be pertraukimo kaiščio, jis turi CLK kaištį, jungiantį kondensatorių ir rezistorių, kurie yra iš vidaus prijungti prie loginio prievado. Tai yra laikrodžio formavimas, naudojant kristalų osciliatoriaus idėją, kuriai reikia 1MHz laikrodžio. TP kaištis naudojamas laikrodžiui matuoti. Smeigtukai A0, A1 ir A2 yra dvejetainiai adresai.

5 veiksmas: laikrodis

LAIKRODIS
LAIKRODIS
LAIKRODIS
LAIKRODIS

Todėl MCP23016 naudoja išorinę RC grandinę vidinio laikrodžio greičiui nustatyti. Norint, kad įrenginys tinkamai veiktų, reikalingas 1 MHz vidinis laikrodis (paprastai). Vidinį laikrodį galima išmatuoti ant TP kaiščio. Rekomenduojamos REXT ir CEXT vertės pateiktos žemiau.

6 žingsnis: adresas

Norėdami apibrėžti MCP23016 adresą, mes naudojame kaiščius A0, A1 ir A2. Tiesiog palikite juos HIGH arba LOW, kad pakeistumėte adresą.

Adresas bus suformuotas taip:

MCP_Address = 20 + (A0 A1 A2)

Kai A0 A1 A2 gali turėti HIGH / LOW reikšmes, tai sudaro dvejetainį skaičių nuo 0 iki 7.

Pavyzdžiui:

A0> GND, A1> GND, A2> GND (reiškia 000, tada 20 + 0 = 20)

Arba, A0> HIGH, A1> GND, A2> HIGH (reiškia 101, tada 20 + 5 = 25)

7 žingsnis: komandos

Komandos
Komandos

Žemiau yra lentelė su bendravimo komandomis. Naudokime GP0 ir GP1, taip pat IODIR0 ir IODIR1.

8 žingsnis: Kategorijos:

GP0 / GP1 - duomenų prievadų registrai

Yra du registrai, suteikiantys prieigą prie dviejų GPIO prievadų.

Registro rodmenys pateikia to prievado kaiščių būseną.

Bit = 1> HIGH Bit = 0> LOW

OLAT0 / OLAT1 - išvesties LACTCH REGISTRAI

Yra du registrai, suteikiantys prieigą prie abiejų prievadų išvesties prievadų.

IPOL0 / IPOL1 - įvesties poliškumo registrai

Šie registrai leidžia vartotojui konfigūruoti įvesties prievado duomenų (GP0 ir GP1) poliškumą.

IODIR0 / IODIR1

Yra du registrai, valdantys kaiščio režimą. (Įvestis arba išvestis)

Bitas = 1> Įvesties bitas = 0> IŠVESTIS

INTCAP0 / INTCAP1 - pertraukimo fiksavimo registrai

Tai registrai, kuriuose yra prievado, kuris sukėlė pertrauką, vertė.

IOCON0 / IOCON1 - I / O plėtiklio valdymo registras

Tai valdo MCP23016 funkcionalumą.

Nustatymo bitas 0 (IARES> Interrupt Activity Resolution) kontroliuoja GP prievado kaiščių atrankos dažnį.

Bit0 = 0> (numatytasis) Maksimalus uosto veiklos aptikimo laikas yra 32 ms (mažos energijos sąnaudos)

Bit0 = 1> maksimalus aktyvumo aptikimo laikas uoste yra 200usec (didesnis energijos suvartojimas)

9 žingsnis: Bendravimo struktūra

Bendravimo struktūra
Bendravimo struktūra

Čia rodau „Wire“klasę, kuri yra „I2C“komunikacija mūsų pagrindiniame „Arduino“, kuri taip pat leidžia plėtikliui dirbti su „Arduino Uno“ir „Mega“. Tačiau pastarasis jau turi keletą IO. Čia mes sprendžiame lusto adresus, prieigos kontrolę, kurie yra registrų kodai, taip pat duomenis.

10 žingsnis: programa

Programa
Programa

Mūsų programą sudaro ryšys su ESP32 su MCP23016, kad būtų galima naudoti daugiau GPIO. Tada prie MCP23016 prijungsime mygtuką ir kai kuriuos šviesos diodus. Mes juos visus valdysime naudodami tik I2C magistralę. Taigi bus naudojami tik du ESP32 kaiščiai. Vaizdo įraše galite pamatyti žemiau esančią vaizdo grandinę.

11 veiksmas: ESP01

ESP01
ESP01

Čia rodau ESP01 „Pinout“.

12 žingsnis: ESP01 montavimas

Montavimas ESP01
Montavimas ESP01

Šiame pavyzdyje GPIO0 prijungtas prie SDA, o GPIO2 - į SCL. Mes taip pat turime relės plokštę, signalizatorių ir šviesos diodą. Kitame prievade, GP1.0, turime dar vieną šviesos diodą su rezistoriumi.

13 veiksmas: „NodeMCU ESP-12E“

NodeMCU ESP-12E
NodeMCU ESP-12E

Čia mes turime „NodeMCU ESP-12E“kištuką.

14 žingsnis: „NodeMCU ESP-12E“montavimas

Montavimo mazgasMCU ESP-12E
Montavimo mazgasMCU ESP-12E

Šiuo atveju vienintelis skirtumas nuo pirmojo pavyzdžio yra tas, kad prijungėte D1 ir D2 atitinkamai SDA ir SCL.

15 veiksmas: „WiFi NodeMCU-32S ESP-WROOM-32“

„WiFi“mazgasMCU-32S ESP-WROOM-32
„WiFi“mazgasMCU-32S ESP-WROOM-32

Štai „WiFi NodeMCU-32S ESP-WROOM-32“kontaktas.

16 veiksmas: „WiFi“montavimo mazgasMCU-32S ESP-WROOM-32

„WiFi“montavimo mazgasMCU-32S ESP-WROOM-32
„WiFi“montavimo mazgasMCU-32S ESP-WROOM-32

Šį kartą pagrindinis skirtumas nuo kitų dviejų pavyzdžių yra mygtukas ir trys mirksintys šviesos diodai. Čia SDA prijungta prie GPIO19, o SCL - prie GPIO23.

17 žingsnis: bibliotekos ir kintamieji

Pirma, mes įtraukiame „Wire.h“, kuris yra atsakingas už „i2c“ryšį, taip pat nustatome „MCP23016“i2c adresą. Rodau keletą komandų, net kai kurių nenaudojame šiame projekte.

#include // nurodyti Wire.h bibliotekos naudojimą. // 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 UOSTO REGISTRAS 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 POL /I/O NUORODOS REGISTRAS 0 #define IODIR1 0x07 // Įvesties/išvesties krypties registras 1 #define INTCAP0 0x08 // PERJUNGIMO ĮGYVENDINIMO REGISTRAS 0 #define INTCAP1 0x09 // PERJUNGIMO GAMYBOS REGISTRAS 1 #define IOC0 REGISTRAS 0 #define IOCON1 0x0B // I/O EXPANDER CONTROL REGISTER 1

18 veiksmas: sąranka

Čia turime keturių skirtingų tipų mikrovaldiklių inicijavimo funkcijas. Mes taip pat tikriname dažnį, nustatome GPIO ir nustatome kaiščius. Cikle mes patikriname mygtuko būseną.

void setup () {Serial.begin (9600); vėlavimas (1000); Viela.pradėti (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // dažnis // konfigūracija arba GPIO0 como OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfigūracija arba GPIO1 como INPUT arba GP1.0 ir 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 com LOW writeBlockData (GP1, B00000000); } void loop () {// verifica and o botão GP foi pressionado checkButton (GP1); } // pabaigos kilpa

19 veiksmas: „ConfigurePort“

Šiame žingsnyje mes sukonfigūruojame GPIO kaiščių režimą ir nustatome prievadų režimą.

// GPIO konfigūracija (GP0 arba GP1) // bendri parametrai passamos: // prievadas: GP0 arba GP1 // pasirinktinis: INPUT kaip tod 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) // pvz: 0x01 ou B00000001 ou 1: indica que apenas o GPX.0 trabalhará como entrada, o restando como saida void configurePort (uint8_t prievadas, uint8_t pasirinktinis) {if (custom == INPUT) {writeBlockData (prievadas, 0xFF); } else if (custom == OUTPUT) {writeBlockData (prievadas, 0x00); } else {writeBlockData (prievadas, pasirinktinis); }}

20 veiksmas: „WriteBlockData“ir „CheckButton“

Čia mes siunčiame duomenis į MCP23016 per „i2c“magistralę, patikriname mygtuko būseną ir nurodome kitą žingsnį, atsižvelgdami į paspaudimo ar ne.

// envia dados para o MCP23016 através do barramento i2c // cmd: COMANDO (registratorius) // duomenys: dados (0-255) void writeBlockData (uint8_t cmd, uint8_t data) {Wire.beginTransmission (MCPAddress); Wire.write (cmd); Wire.write (duomenys); Wire.endTransmission (); vėlavimas (10); }

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

21 veiksmas: „ReadPin“ir „ValueFromPin“

Čia mes sprendžiame konkretaus kaiščio nuskaitymą ir bitų vertės grąžinimą į norimą padėtį.

// 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 chip 1 byte statusGP = Wire.read (); return valueFromPin (kaištis, 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 << smeigtukas)) == 0? 0: 1; }

22 žingsnis: ESP8266 programa

Iš čia pamatysime, kaip buvo sukurta programa, kurią naudojome ESP-01 ir mazge MCU ESP-12E, o tai leidžia suprasti, kaip skirtumai tarp jų yra minimalūs.

Mes modifikuosime tik „i2c“ryšio konstruktoriaus liniją, kuri yra „Wire“objekto pradžios metodas.

Tiesiog nekomentuokite eilutės pagal plokštelę, kurią ketiname sudaryti.

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

Sąranka

Atkreipkite dėmesį, kad statybininkas vis dar komentuojamas. Todėl nekomentuokite pagal savo lentą (ESP-01 arba nodeMCU ESP12-E).

void setup () {Serial.begin (9600); vėlavimas (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // dažnis // konfigūracija arba GPIO0 como OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfigūruoti arba 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 com LOW writeBlockData (GP1, B00000001); }

Kilpa

Kilpoje mes keičiame kaiščius kas 1 sekundę. Taigi, kai įjungtas GP0 pin0, GP1 kaiščiai yra išjungti. Kai GP1 pin0 įjungtas, GP0 kaiščiai yra išjungti.

void loop () {// seta o pino 7 do GP0 como HIGH e os demais como LOW writeBlockData (GP0, B10000000); // seta todos os pinos do GPIO1 com LOW writeBlockData (GP1, B00000000); vėlavimas (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); vėlavimas (1000); } // pabaigos kilpa

23 žingsnis: SVARBU

Naudoti kintamieji ir biblioteka yra tokie patys kaip programos, kurią atlikome ESP32, taip pat metodai configurePort ir writeBlockData.

24 žingsnis: failai

Atsisiųskite failus:

PDF

INO (ESP8266)

INO (ESP32)

Rekomenduojamas: