Sisukord:

IO Expander ESP32, ESP8266 ja Arduino jaoks: 24 sammu
IO Expander ESP32, ESP8266 ja Arduino jaoks: 24 sammu

Video: IO Expander ESP32, ESP8266 ja Arduino jaoks: 24 sammu

Video: IO Expander ESP32, ESP8266 ja Arduino jaoks: 24 sammu
Video: LDmicro 14: ЖК-дисплей I2C и часы реального времени DS3231 (программирование лестничной схемы ПЛК микроконтроллера с помощью LDmicro) 2024, November
Anonim
Image
Image
Sissejuhatus
Sissejuhatus

Kas soovite laiendada oma ESP32, ESP8266 või Arduino IO -sid? Ja kas olete mõelnud 16 uue GPIO võimalusele, mida saab I2C bussi abil juhtida? Täna tutvustan teile GPIO laiendit MCP23016. Samuti näitan teile, kuidas mikrokontrollerit MCP23016 -ga suhelda. Räägin ka programmi loomisest, kus kasutame laiendajaga suhtlemiseks ainult kahte selle mikrokontrolleri kontakti. Kasutame neid LED -ide ja nupu juhtimiseks.

Samm 1: Sissejuhatus

Seade MCP23016 pakub 16 bitti GPIO laiendamiseks, kasutades I2C siini. Iga bitti saab konfigureerida individuaalselt (sisend või väljund).

MCP23016 sisaldab mitut 8-bitist seadet sisendi, väljundi ja polaarsuse valimiseks.

Laiendajad pakuvad lihtsat lahendust, kui IO -sid on vaja näiteks lülitite, andurite, nuppude ja LED -ide jaoks.

2. etapp: omadused

16 sisend- / väljundnõela (16 sisendstandardit)

Kiire I2C siini taktsagedus (0–400 kbit/s)

Kolm riistvara aadressi tihvti võimaldavad kasutada kuni kaheksat seadet

Katkesta pordi jäädvustaja

Polaarsuse pöördregister sisendpordi andmete polaarsuse seadistamiseks

Ühildub enamiku mikrokontrolleritega

Samm: ESP01 -l võib olla 128 GPIO -d

ESP01 -l võib olla 128 GPIO -d!
ESP01 -l võib olla 128 GPIO -d!

Selle laiendi suurust näitab näiteks selle kasutamine koos ESP01 -ga, mida saab ühendada kuni kaheksa laiendiga ainult kahe IOS -iga, ulatudes 128 GPIO -ni.

4. samm: MCP23016

MCP23016
MCP23016

Siin on meil laiendaja skeem, millel on kaks kaheksa bitist rühma. See teeb kokku 16 sadamat. Lisaks katkestusnõelale on sellel CLK -tihvt, mis ühendab kondensaatori ja takisti, mis on sisemiselt ühendatud loogikapordiga. Selle eesmärk on moodustada kell, kasutades kristallostsillaatori ideed, mis vajab 1MHz kella. TP tihvti kasutatakse kella mõõtmiseks. Tihvtid A0, A1 ja A2 on binaaraadressid.

5. samm: KELL

KELL
KELL
KELL
KELL

Seetõttu kasutab MCP23016 sisemise kella kiiruse määramiseks välist RC -ahelat. Seadme nõuetekohaseks toimimiseks on vaja (tavaliselt) 1 MHz sisemist kella. Sisemist kella saab mõõta TP -tihvti pealt. REXT ja CEXT soovitatud väärtused on toodud allpool.

6. samm: aadress

MCP23016 aadressi määratlemiseks kasutame seejärel tihvte A0, A1 ja A2. Jätke need aadressi muutmiseks lihtsalt HIGH või LOW.

Aadress moodustatakse järgmiselt:

MCP_aadress = 20 + (A0 A1 A2)

Kui A0 A1 A2 võib võtta HIGH / LOW väärtusi, moodustab see kahendarvu vahemikus 0 kuni 7.

Näiteks:

A0> GND, A1> GND, A2> GND (tähendab 000, siis 20 + 0 = 20)

Või muidu, A0> HIGH, A1> GND, A2> HIGH (tähendab 101, siis 20 + 5 = 25)

Samm 7: käsud

Käsud
Käsud

Allpool on tabel suhtluskäskudega. Kasutame GP0 ja GP1, samuti IODIR0 ja IODIR1.

8. samm: kategooriad:

GP0 / GP1 - andmepordiregistrid

On kaks registrit, mis võimaldavad juurdepääsu kahele GPIO -pordile.

Registri näit annab selle pordi tihvtide oleku.

Bitt = 1> HIGH Bit = 0> LOW

OLAT0 / OLAT1 - väljundi LACTCH REGISTERS

On kaks registrit, mis võimaldavad juurdepääsu kahe pordi väljundportidele.

IPOL0 / IPOL1 - sisendpolaarsusregistrid

Need registrid võimaldavad kasutajal konfigureerida sisendpordi andmete (GP0 ja GP1) polaarsust.

IODIR0 / IODIR1

Pin -režiimi kontrollivad kaks registrit. (Sisend või väljund)

Bitt = 1> SISENDBIT = 0> VÄLJUND

INTCAP0 / INTCAP1 - jäädvustusregistrite katkestamine

Need on registrid, mis sisaldavad katkestuse tekitanud pordi väärtust.

IOCON0 / IOCON1 - I / O Expander Control Register

See juhib MCP23016 funktsionaalsust.

Seadistusbitt 0 (IARES> Katkestustegevuse eraldusvõime) juhib GP -pordi tihvtide diskreetimissagedust.

Bit0 = 0> (vaikimisi) Maksimaalne porditegevuse tuvastamise aeg on 32 ms (väike energiatarve)

Bit0 = 1> maksimaalne aktiivsuse tuvastamise aeg pordis on 200usec (suurem energiatarve)

9. samm: kommunikatsiooni struktuur

Suhtluse struktuur
Suhtluse struktuur

Näitan siin Wire klassi, mis on meie tuumiku Arduino I2C side, mis võimaldab ka laiendajal töötada koos Arduino Uno ja Mega. Viimasel on aga juba mitu IO -d. Siin käsitleme kiibi aadresse, juurdepääsu kontrolli, mis on registrite koodid, samuti andmeid.

10. samm: programm

Programm
Programm

Meie programm koosneb ESP32 suhtlemisest MCP23016 -ga, et kasutada rohkem GPIO -sid. Seejärel on meil nupp ja mõned LED -id ühendatud MCP23016 -ga. Me kontrollime neid kõiki ainult I2C siiniga. Seega kasutatakse ainult kahte ESP32 tihvti. Allpool olevat pildiahelat näete videost.

Samm: ESP01

ESP01
ESP01

Siin näitan ESP01 Pinouti.

12. samm: ESP01 paigaldamine

Paigaldus ESP01
Paigaldus ESP01

Selles näites on meil GPIO0 ühendatud SDA -ga ja GPIO2 SCL -iga. Meil on ka releeplaat, summer ja LED. Teises pordis, GP1.0, on meil veel üks takisti LED.

Samm 13: NodeMCU ESP-12E

SõlmMCU ESP-12E
SõlmMCU ESP-12E

Siin on meil NodeMCU ESP-12E pinout.

14. samm: sõlmeMCU ESP-12E paigaldamine

PaigaldussõlmMCU ESP-12E
PaigaldussõlmMCU ESP-12E

Sel juhul on ainus erinevus esimesest näitest see, et olete ühendanud D1 ja D2 vastavalt SDA -s ja SCL -is.

Samm 15: WiFi-sõlmMCU-32S ESP-WROOM-32

WiFi-sõlmMCU-32S ESP-WROOM-32
WiFi-sõlmMCU-32S ESP-WROOM-32

Siin on WiFi sõlme pinoutMCU-32S ESP-WROOM-32.

16. samm: WiFi-ühendussõlmMCU-32S ESP-WROOM-32

WiFi paigaldussõlmMCU-32S ESP-WROOM-32
WiFi paigaldussõlmMCU-32S ESP-WROOM-32

Seekord on peamine erinevus kahest muust näitest nupp ja kolm vilkuvat LED -i. Siin on SDA ühendatud GPIO19 -ga, SCL aga GPIO23 -ga.

17. samm: raamatukogud ja muutujad

Esiteks kaasame Wire.h, kes vastutab i2c -side eest, ja määrame ka MCP23016 i2c -aadressi. Näitan mitmeid käske, isegi mõnda, mida me selles projektis ei kasuta.

#include // määrake Wire.h kogu kasutamine. // endereço I2C do MCP23016 #define MCPAddress 0x20 // COMMAND BYTE to REGISTER SUHTED: Tabel: 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 #definine /I/O SUUNASREGISTREERIMINE 0 #define IODIR1 0x07 // I/O SUUNA REGISTREERIMINE 1 #define INTCAP0 0x08 // KATKEMISE VÕTMISE REGISTREERIMINE 0 #define INTCAP1 0x09 // KATKEMISVÕTLUSREGISTREERIMINE 1 #defineeritud IOC REGISTER 0 #define IOCON1 0x0B // I/O EXPANDER CONTROL REGISTER 1

18. samm: seadistamine

Siin on meil funktsioonid nelja erineva tüüpi mikrokontrolleri lähtestamiseks. Samuti kontrollime sagedust, seadistame GPIO -d ja seadistame tihvtid. Loopis kontrollime nupu olekut.

void setup () {Serial.begin (9600); viivitus (1000); Traat.algus (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // sagedus // konfiguratsioon või GPIO0 como OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfiguratsioon GPIO1 como INPUT või GP1.0 ja 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); } // lõpptsükkel

Samm 19: ConfigurePort

Selles etapis konfigureerime GPIO tihvtide režiimi ja tuvastame portide režiimi.

// GPIO konfiguratsioon (GP0 või GP1) // muud parameetrid passamos: // port: GP0 või GP1 // kohandatud: 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) // nt: 0x01 ou B00000001 ou 1: indica que apenas o GPX.0 trabalhará como entrada, või restando como saida void configurePort (uint8_t port, uint8_t custom) {if (custom == INPUT) {writeBlockData (port, 0xFF); } else if (custom == VÄLJUND) {writeBlockData (port, 0x00); } else {writeBlockData (port, kohandatud); }}

Samm 20: WriteBlockData & CheckButton

Siin saadame andmed iCP -siini kaudu MCP23016 -le, kontrollime nupu olekut ja näitame järgmist sammu, võttes samal ajal arvesse vajutamise või mitte.

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

// verifica se o botão foi pressionado // parameeter GP: GP0 või GP1 void checkButton (uint8_t GP) {// faz a leitura do pino 0 no GP fornecido uint8_t btn = readPin (0, GP); // see 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. samm: ReadPin ja ValueFromPin

Siin käsitleme konkreetse tihvti lugemist ja biti väärtuse tagastamist soovitud asendisse.

// 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 kiip 1 bait olekGP = Wire.read (); return valueFromPin (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. samm: programm ESP8266

Siit näeme, kuidas loodi programm, mida kasutasime ESP-01-s ja sõlmes MCU ESP-12E, mis võimaldab meil mõista, kuidas erinevused nende vahel on minimaalsed.

Muudame ainult i2c kommunikatsioonikonstruktori rida, mis on Wire -objekti algusmeetod.

Lihtsalt tühistage rida vastavalt plaadile, mille me koostame.

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

Seadistamine

Pange tähele, et ehitajat kommenteeritakse endiselt. Seetõttu tühistage kommentaar vastavalt oma plaadile (ESP-01 või nodeMCU ESP12-E).

void setup () {Serial.begin (9600); viivitus (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // sagedus // konfiguratsioon või GPIO0 como OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfiguratsioon või 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

Tsüklis vahetame tihvte iga 1 sekundi järel. Seega, kui GP0 pin0 on sisse lülitatud, on GP1 tihvtid välja lülitatud. Kui GP1 pin0 on sisse lülitatud, on GP0 tihvtid välja lülitatud.

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); viivitus (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); viivitus (1000); } // lõpptsükkel

23. samm: TÄHTIS

Kasutatavad muutujad ja teek on samad, mis programmis, mida tegime ESP32 puhul, samuti meetodid configurePort ja writeBlockData.

24. samm: failid

Laadige failid alla:

PDF

INO (ESP8266)

INO (ESP32)

Soovitan: