INHOUDSOPGAWE:

IO Expander vir ESP32, ESP8266 en Arduino: 24 stappe
IO Expander vir ESP32, ESP8266 en Arduino: 24 stappe

Video: IO Expander vir ESP32, ESP8266 en Arduino: 24 stappe

Video: IO Expander vir ESP32, ESP8266 en Arduino: 24 stappe
Video: PCF8574 GPIO Extender - With Arduino and NodeMCU 2024, Julie
Anonim
Image
Image
Inleiding
Inleiding

Wil u die IO's van u ESP32, ESP8266 of Arduino uitbrei? En het u al gedink aan die moontlikheid van 16 nuwe GPIO's wat met die I2C -bus beheer kan word? Wel, vandag gaan ek u voorstel aan die GPIO -uitbreider MCP23016. Ek sal u ook wys hoe u 'n mikrobeheerder met die MCP23016 kan kommunikeer. Ek sal ook praat oor die skep van 'n program waar ons slegs 2 penne van hierdie mikrokontroleerder sal gebruik om met die uitbreider te kommunikeer. Ons gebruik dit om die LED's en die knoppie te beheer.

Stap 1: Inleiding

Die MCP23016 -toestel bied 16 bisse vir GPIO -uitbreiding met behulp van die I2C -bus. Elke bietjie kan afsonderlik gekonfigureer word (invoer of uitset).

Die MCP23016 bestaan uit veelvuldige 8-bis-instellings vir invoer-, uitvoer- en polariteitskeuse.

Die uitbreidings bied 'n eenvoudige oplossing as die IO's nodig is vir skakelaars, sensors, knoppies en LED's, onder andere voorbeelde.

Stap 2: Eienskappe

16 Invoer / Uitgang penne (16 ingang standaard)

Vinnige I2C-busklokfrekwensie (0-400 kbits/s)

Drie hardeware -adrespenne laat tot agt toestelle gebruik

Onderbreek Port Capture Recorder

Polariteitsomkeerregister om die polariteit van die invoerpoortdata in te stel

Versoenbaar met die meeste mikrobeheerders

Stap 3: ESP01 kan 128 GPIO's hê

ESP01 kan 128 GPIO's hê!
ESP01 kan 128 GPIO's hê!

'N Voorbeeld wat die omvang van hierdie uitbreiding aandui, is die gebruik daarvan met ESP01, wat met slegs twee IOS verbind kan word met tot agt uitbreidings en bereik 128 GPIO's.

Stap 4: MCP23016

MCP23016
MCP23016

Hier het ons die skema van die expander, wat twee groepe van agt bisse het. Dit sorg vir 'n totaal van 16 hawens. Benewens 'n onderbrekingspen, het dit ook die CLK -pen, wat die kapasitor en die weerstand verbind, wat intern verbind is in 'n logiese poort. Dit is om die klok te vorm, met die idee van 'n kristal ossillator, wat 'n klok van 1 MHz benodig. Die TP -pen word gebruik om die klok te meet. Spelde A0, A1 en A2 is binêre adresse.

Stap 5: KLOK

KLOK
KLOK
KLOK
KLOK

Die MCP23016 gebruik dus 'n eksterne RC -stroombaan om die spoed van die interne klok te bepaal. 'N Interne klok van 1 MHz word benodig (gewoonlik) om die toestel behoorlik te laat werk. Die interne klok kan op die TP -pen gemeet word. Die aanbevole waardes vir REXT en CEXT word hieronder getoon.

Stap 6: Adres

Om die adres van die MCP23016 te definieer, gebruik ons dan penne A0, A1 en A2. Laat hulle net op HOOG of LAAG vir die adresverandering.

Die adres sal soos volg gevorm word:

MCP_Address = 20 + (A0 A1 A2)

Waar A0 A1 A2 HIGH / LOW waardes kan neem, vorm dit 'n binêre getal van 0 tot 7.

Byvoorbeeld:

A0> GND, A1> GND, A2> GND (beteken 000, dan 20 + 0 = 20)

Of anders, A0> HOOG, A1> GND, A2> HOOG (beteken 101, dan 20 + 5 = 25)

Stap 7: bevele

Opdragte
Opdragte

Hieronder is 'n tabel met die opdragte vir kommunikasie. Kom ons gebruik GP0 en GP1, sowel as IODIR0 en IODIR1.

Stap 8: Kategorieë:

GP0 / GP1 - Data Port Registers

Daar is twee registers wat toegang tot die twee GPIO -poorte bied.

Die registerlesing gee die status van die penne op die poort.

Bit = 1> HOOG Bit = 0> LAAG

OLAT0 / OLAT1 - Uitvoer LACTCH REGISTRES

Daar is twee registers wat toegang bied tot die uitvoerpoort van die twee poorte.

IPOL0 / IPOL1 - Invoerpolariteitsregisters

Hierdie registers stel die gebruiker in staat om die polariteit van die invoerpoortdata (GP0 en GP1) op te stel.

IODIR0 / IODIR1

Daar is twee registers wat die penmodus beheer. (Invoer of uitvoer)

Bit = 1> INPUT Bit = 0> UITGANG

INTCAP0 / INTCAP1 - Onderbreek vangregisters

Dit is registers wat die waarde bevat van die poort wat die onderbreking gegenereer het.

IOCON0 / IOCON1 - I / O Expander Control Register

Dit beheer die funksionaliteit van die MCP23016.

Die stel van bits 0 (IARES> Onderbreking van aktiwiteitsresolusie) beheer die bemonsteringsfrekwensie van die GP -poortpenne.

Bit0 = 0> (standaard) Maksimum opsporingstyd vir poortaktiwiteit is 32 ms (lae kragverbruik)

Bit0 = 1> maksimum aktiwiteit opsporingstyd op die poort is 200 usec (hoër kragverbruik)

Stap 9: Struktuur vir kommunikasie

Struktuur vir kommunikasie
Struktuur vir kommunikasie

Ek wys hier die Wire -klas, wat die I2C -kommunikasie in ons kern -Arduino is, wat die expander ook in staat stel om met die Arduino Uno en Mega te werk. Laasgenoemde het egter reeds verskeie IO's. Ons behandel die adresse van die chip, die toegangsbeheer, wat die kodes van die registers is, sowel as die data.

Stap 10: Programmeer

Program
Program

Ons program bestaan uit die kommunikasie van die ESP32 met die MCP23016 om meer GPIO's te gebruik. Dan het ons 'n knoppie en 'n paar LED's wat aan die MCP23016 gekoppel is. Ons beheer almal met slegs die I2C -bus. Daar sal dus slegs twee ESP32 -penne gebruik word. U kan die prentkring hieronder in die video sien.

Stap 11: ESP01

ESP01
ESP01

Hier wys ek die Pinout van ESP01.

Stap 12: Montage van ESP01

Montage ESP01
Montage ESP01

In hierdie voorbeeld het ons die GPIO0 gekoppel in die SDA en die GPIO2 in die SCL. Ons het ook 'n aflosbord, 'n zoemer en 'n LED. Op die ander poort, in GP1.0, het ons nog een LED met 'n weerstand.

Stap 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Hier het ons die Pinout van die NodeMCU ESP-12E.

Stap 14: Monteer NodeMCU ESP-12E

Monteer NodeMCU ESP-12E
Monteer NodeMCU ESP-12E

In hierdie geval is die enigste verskil van die eerste voorbeeld dat u D1 en D2 in die SDA en SCL onderskeidelik verbind het.

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

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

Hier is die pinout van die WiFi NodeMCU-32S ESP-WROOM-32.

Stap 16: WiFi-monteringsknooppuntMCU-32S ESP-WROOM-32

WiFi-monteringsknoopMCU-32S ESP-WROOM-32
WiFi-monteringsknoopMCU-32S ESP-WROOM-32

Hierdie keer is die belangrikste verskil van die ander twee voorbeelde die knoppie en die drie knipperende LED's. Hier is die SDA gekoppel aan die GPIO19, terwyl die SCL aan die GPIO23 gekoppel is.

Stap 17: Biblioteke en veranderlikes

Eerstens sluit ons Wire.h in, wat verantwoordelik is vir i2c -kommunikasie, sowel as die instelling van die i2c -adres van MCP23016. Ek wys verskeie opdragte, selfs sommige wat ons nie in hierdie projek gebruik nie.

#include // spesifiseer die gebruik van die Wire.h -biblioteek. // 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 #define GP1 PORT REGISTER 1 #defineer OLAT0 0x02 // OUTPUT LATCH REGISTER 0 #define OLAT1 0x03 // OUTPUT LATCH REGISTER 1 #definieer IPOL0 0x04 // INPUT POLARITY PORT REGISTER 0 #definieer IPOL1 0x05 // INPUT POLARITY #INPUT 0 /I/O RIGTINGSREGISTER 0 #definieer IODIR1 0x07 // I/O RIGTINGSREGISTER 1 #definieer INTCAP0 0x08 // ONDERBREEK VASTE REGISTER 0 #definieer INTCAP1 0x09 // ONDERBREK KAPTUUR REGISTER 1 #definieer IOCON0 0x0A // REGISTREER 0 #definieer IOCON1 0x0B // I/O UITBREIDERBEHEER REGISTREER 1

Stap 18: Opstel

Hier het ons die funksies om vier verskillende tipes mikrobeheerders te initialiseer. Ons kyk ook na die frekwensie, stel die GPIO's op en stel die penne in. In die lus kyk ons na die status van die knoppie.

ongeldige opstelling () {Serial.begin (9600); vertraging (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekwensie // konfigurasie van GPIO0 as OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // configura o GPIO1 como INPUT o GP1.0 e como OUTPUT os outros GP1 configurePort (IODIR1, 0x01); // stel ons ook in staat om GPIO0 te skryf met LOW writeBlockData (GP0, B00000000); // stel ons ook in staat om GPIO1 as LOW writeBlockData (GP1, B00000000) te gebruik; } void loop () {// verifica e o botão GP foi pressionado checkButton (GP1); } // eindlus

Stap 19: ConfigurePort

In hierdie stap stel ons die modus van die GPIO -penne op en identifiseer die modus van die poorte.

// configura o GPIO (GP0 ou GP1) // como parametro passamos: // port: GP0 ou GP1 // custom: INPUT para todos as portas do GP trabalharem como entrada // OUTPUT para todos as portas do GP trabalharem como saida/ / aangepaste waarde van 0-255 aanduidings vir portas (1 = INVOER, 0 = UITGANG) // bv: 0x01 of B00000001 of 1: aanduiding van die GPX.0-ingang, of herstel van 'n ongeldige configurePort (uint8_t -poort, uint8_t -aangepaste) {if (custom == INPUT) {writeBlockData (poort, 0xFF); } anders as (custom == OUTPUT) {writeBlockData (poort, 0x00); } anders {writeBlockData (poort, pasgemaak); }}

Stap 20: WriteBlockData & CheckButton

Hier stuur ons data via die i2c -bus na die MCP23016, kyk na die status van die knoppie en dui die volgende stap aan, met inagneming van die toestand van druk of nie.

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

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

Stap 21: ReadPin & ValueFromPin

Ons gaan hier oor die lees van 'n spesifieke pen en die terugkeer van die bitwaarde na die gewenste posisie.

// 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 (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; }

Stap 22: ESP8266 -program

Van hier af sal ons sien hoe die program wat ons in ESP-01 en in die nodeMCU ESP-12E gebruik het, geskep is, waarmee ons kan verstaan hoe die verskille tussen hulle minimaal is.

Ons sal slegs die lyn van die i2c -kommunikasie -konstruktor verander, wat die beginmetode van die Wire -voorwerp is.

Los die lyn net op volgens die bord wat ons gaan saamstel.

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

Stel op

Let op dat die bouer steeds kommentaar lewer. Laat u kommentaar dus nie volgens u raad nie (ESP-01 of nodeMCU ESP12-E).

ongeldige opstelling () {Serial.begin (9600); vertraging (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekwensie // konfigurasie van GPIO0 as OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfigurasie van GPIO1 as OUTPUT (to os os pinos) configurePort (IODIR1, OUTPUT); // stel ons ook in staat om GPIO0 te skryf met LOW writeBlockData (GP0, B00000000); // stel ons ook in staat om GPIO1 as LOW writeBlockData (GP1, B00000001) te gebruik; }

Lus

In die lus verander ons die penne elke 1 sekonde. As pin0 van GP0 dus aan is, is die penne van GP1 af. As pin0 van GP1 aan is, is die GP0 -penne af.

void loop () {// seta o pino 7 do GP0 como HIGH e os demais como LOW writeBlockData (GP0, B10000000); // stel ons ook in staat om GPIO1 as LOW writeBlockData (GP1, B00000000) te gebruik; vertraging (1000); // stel ons ook in staat om GPIO0 te skryf met LOW writeBlockData (GP0, B00000000); // seta o pino 0 do GP1 como HIGH e os demais como LOW writeBlockData (GP1, B00000001); vertraging (1000); } // eindlus

Stap 23: BELANGRIK

Die veranderlikes en biblioteek wat gebruik word, is dieselfde as dié van die program wat ons vir ESP32 gedoen het, sowel as die configurePort- en writeBlockData -metodes.

Stap 24: lêers

Laai die lêers af:

PDF

INO (ESP8266)

INO (ESP32)

Aanbeveel: