Indholdsfortegnelse:

IO Expander til ESP32, ESP8266 og Arduino: 24 trin
IO Expander til ESP32, ESP8266 og Arduino: 24 trin

Video: IO Expander til ESP32, ESP8266 og Arduino: 24 trin

Video: IO Expander til ESP32, ESP8266 og Arduino: 24 trin
Video: #264 PlatformIO for Arduino, ESP8266, and ESP32 Tutorial 2024, November
Anonim
Image
Image
Introduktion
Introduktion

Vil du gerne udvide IO'erne for din ESP32, ESP8266 eller Arduino? Og har du tænkt på muligheden for 16 nye GPIO'er, der kan styres ved hjælp af I2C -bussen? Nå i dag vil jeg præsentere dig for GPIO -ekspander MCP23016. Jeg viser dig også, hvordan du kommunikerer en mikrokontroller med MCP23016. Jeg vil også tale om at oprette et program, hvor vi kun bruger 2 pins af denne mikrokontroller til at kommunikere med ekspanderen. Vi bruger disse til at styre lysdioderne og knappen.

Trin 1: Introduktion

MCP23016 -enheden giver 16 bits til GPIO -udvidelse ved hjælp af I2C -bussen. Hver bit kan konfigureres individuelt (input eller output).

MCP23016 består af flere 8-bit indstillinger til input, output og polaritetsvalg.

Udviderne giver en enkel løsning, når IO'erne er nødvendige for kontakter, sensorer, knapper og lysdioder, blandt andre eksempler.

Trin 2: Karakteristika

16 input / output pins (16 input standard)

Hurtig I2C busurfrekvens (0-400 kbits/s)

Tre hardware -adresse -pins gør det muligt at bruge op til otte enheder

Afbryd Port Capture Recorder

Polaritetsomvendt register til indstilling af polariteten af inputportdataene

Kompatibel med de fleste mikrokontrollere

Trin 3: ESP01 kan have 128 GPIO'er

ESP01 kan have 128 GPIO'er!
ESP01 kan have 128 GPIO'er!

Et eksempel, der viser størrelsen på denne ekspander, er dens anvendelse med ESP01, som kan tilsluttes op til otte udvidere med kun to IOS og når 128 GPIO'er.

Trin 4: MCP23016

MCP23016
MCP23016

Her har vi skematikken over ekspanderen, som har to grupper på otte bits. Dette giver i alt 16 havne. Ud over en afbrydelsesstift har den CLK -stiften, som forbinder kondensatoren og modstanden, som er internt forbundet i en logisk port. Dette er for at danne uret ved hjælp af ideen om en krystaloscillator, som har brug for 1MHz ur. TP -stiften bruges til at måle uret. Stifterne A0, A1 og A2 er binære adresser.

Trin 5: UR

UR
UR
UR
UR

MCP23016 bruger derfor et eksternt RC -kredsløb til at bestemme hastigheden på det interne ur. Et internt ur på 1 MHz er påkrævet (normalt) for at enheden fungerer korrekt. Det interne ur kan måles på TP -stiften. De anbefalede værdier for REXT og CEXT er vist nedenfor.

Trin 6: Adresse

For at definere adressen på MCP23016 bruger vi derefter benene A0, A1 og A2. Bare lad dem stå på HIGH eller LOW for adresseændringen.

Adressen dannes således:

MCP_Address = 20 + (A0 A1 A2)

Hvor A0 A1 A2 kan tage HIGH / LOW værdier, danner dette et binært tal fra 0 til 7.

For eksempel:

A0> GND, A1> GND, A2> GND (betyder 000, derefter 20 + 0 = 20)

Ellers, A0> HØJ, A1> GND, A2> HØJ (betyder 101, derefter 20 + 5 = 25)

Trin 7: Kommandoer

Kommandoer
Kommandoer

Nedenfor er en tabel med kommandoer til kommunikation. Lad os bruge GP0 og GP1, samt IODIR0 og IODIR1.

Trin 8: Kategorier:

GP0 / GP1 - Dataportregistre

Der er to registre, der giver adgang til de to GPIO -porte.

Registerlæsningen giver status for benene på den pågældende port.

Bit = 1> HIGH Bit = 0> LAV

OLAT0 / OLAT1 - Output LACTCH REGISTRE

Der er to registre, der giver adgang til outputporte på de to porte.

IPOL0 / IPOL1 - Inputpolaritetsregistre

Disse registre giver brugeren mulighed for at konfigurere polariteten af inputportdataene (GP0 og GP1).

IODIR0 / IODIR1

Der er to registre, der styrer pin -tilstanden. (Input eller Output)

Bit = 1> INPUT Bit = 0> OUTPUT

INTCAP0 / INTCAP1 - Afbryd registreringsregistre

Disse er registre, der indeholder værdien af den port, der genererede afbrydelsen.

IOCON0 / IOCON1 - I / O Expander Control Register

Dette styrer funktionaliteten af MCP23016.

Indstillingsbit 0 (IARES> Afbryd aktivitetsopløsning) styrer samplingsfrekvensen for GP -portstifterne.

Bit0 = 0> (standard) Maksimal registreringstid for portaktivitet er 32 ms (lavt strømforbrug)

Bit0 = 1> maksimal registreringstid for aktivitet på porten er 200usec (højere strømforbrug)

Trin 9: Struktur for kommunikation

Struktur for kommunikation
Struktur for kommunikation

Jeg viser her Wire -klassen, som er I2C -kommunikationen i vores kerne -Arduino, som også giver ekspanderen mulighed for at arbejde med Arduino Uno og Mega. Sidstnævnte har imidlertid allerede flere IO'er. Vi behandler her adresserne på chippen, adgangskontrollen, som er registrenes koder samt dataene.

Trin 10: Programmer

Program
Program

Vores program består i at kommunikere ESP32 med MCP23016 for at have flere GPIO'er at bruge. Vi vil derefter have en knap og nogle lysdioder forbundet til MCP23016. Vi kontrollerer dem alle kun ved hjælp af I2C -bussen. Således vil der kun blive brugt to ESP32 -ben. Du kan se billedkredsløbet herunder i videoen.

Trin 11: ESP01

ESP01
ESP01

Her viser jeg Pinout af ESP01.

Trin 12: Montering af ESP01

Montering ESP01
Montering ESP01

I dette eksempel har vi GPIO0 forbundet i SDA og GPIO2 tilsluttet i SCL. Vi har også et relæbræt, en summer og en LED. På den anden port, i GP1.0, har vi endnu en LED med en modstand.

Trin 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Her har vi Pinout af NodeMCU ESP-12E.

Trin 14: Montering af NodeMCU ESP-12E

MonteringsnodeMCU ESP-12E
MonteringsnodeMCU ESP-12E

I dette tilfælde er den eneste forskel fra det første eksempel, at du har tilsluttet D1 og D2 i henholdsvis SDA og SCL.

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

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

Her er Pinout af WiFi NodeMCU-32S ESP-WROOM-32.

Trin 16: WiFi-monteringsnodeMCU-32S ESP-WROOM-32

WiFi-monteringsnodeMCU-32S ESP-WROOM-32
WiFi-monteringsnodeMCU-32S ESP-WROOM-32

Denne gang er den største forskel fra de to andre eksempler knappen og de tre blinkende lysdioder. Her er SDA forbundet til GPIO19, mens SCL er forbundet til GPIO23.

Trin 17: Biblioteker og variabler

Først inkluderer vi Wire.h, som er ansvarlig for i2c -kommunikation, samt indstilling af i2c -adressen på MCP23016. Jeg viser flere kommandoer, selv nogle, som vi ikke bruger i dette projekt.

#include // angiv brug af Wire.h bibliotek. // endereço I2C do MCP23016 #define MCPAddress 0x20 // COMMAND BYTE TIL REGISTER RELATIONS: Table: 1-3 of Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // DATA PORT REGISTER 0 #define GP1 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 #define IPOL1 0x05 // INPUT POLARITY #INfUT POLARITY /I/O DIRECTION REGISTER 0 #define IODIR1 0x07 // I/O DIRECTION REGISTER 1 #define INTCAP0 0x08 // INTERRUPT CAPTURE REGISTER 0 #define INTCAP1 0x09 // INTERRUPT CAPTURE REGISTER 1 #define IOCON0 0x0A // REGISTRE 0 #define IOCON1 0x0B // I/O EXPANDER CONTROL REGISTER 1

Trin 18: Opsætning

Her har vi funktionerne til at initialisere fire forskellige typer mikrokontrollere. Vi kontrollerer også frekvensen, konfigurerer GPIO'erne og sætter stifterne. I Loop kontrollerer vi status på knappen.

ugyldig opsætning () {Serial.begin (9600); forsinkelse (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekvens // konfiguration af GPIO0 som OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfigura o GPIO1 como INPUT o GP1.0 e como OUTPUT os outros GP1 configurePort (IODIR1, 0x01); // seta todos os pinos gør GPIO0 som LOW writeBlockData (GP0, B00000000); // seta todos os pinos gør GPIO1 som LOW writeBlockData (GP1, B00000000); } void loop () {// verifica e o botão GP foi pressionado checkButton (GP1); } // slutsløjfe

Trin 19: ConfigurePort

I dette trin konfigurerer vi tilstanden for GPIO -benene og identificerer portens tilstand.

// konfigura 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/ / brugerdefineret værdi for 0-255 indikationer for modas 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 port, uint8_t brugerdefineret) {if (custom == INPUT) {writeBlockData (port, 0xFF); } ellers hvis (tilpasset == OUTPUT) {writeBlockData (port, 0x00); } ellers {writeBlockData (port, brugerdefineret); }}

Trin 20: WriteBlockData & CheckButton

Her sender vi data til MCP23016 gennem i2c -bussen, kontrollerer status for knappen og angiver det næste trin, samtidig med at der tages hensyn til tilstanden for at blive trykket eller ej.

// envia dados para o MCP23016 através do barramento i2c // cmd: COMANDO (registrator) // data: dados (0-255) void writeBlockData (uint8_t cmd, uint8_t data) {Wire.beginTransmission (MCPAddress); Wire.write (cmd); Wire.write (data); Wire.endTransmission (); forsinkelse (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 para HIGH as portas GP0 if (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa todas em estado LOW else {writeBlockData (GP0, B00000000); }}

Trin 21: ReadPin & ValueFromPin

Vi beskæftiger os her med aflæsning af en bestemt pin og tilbagevenden af bitværdien til den ønskede position.

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

Trin 22: ESP8266 -program

Herfra vil vi se, hvordan det program, vi brugte i ESP-01 og i nodeMCU ESP-12E blev oprettet, hvilket giver os mulighed for at forstå, hvordan forskelle mellem dem er minimale.

Vi vil kun ændre linjen i i2c -kommunikationskonstruktoren, som er begyndelsesmetoden for Wire -objektet.

Bare tag kommentaren ud af linjen i henhold til den plade, vi skal kompilere.

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

Opsætning

Bemærk, at bygherren stadig kommenteres. Derfor skal du ikke kommentere i henhold til dit board (ESP-01 eller nodeMCU ESP12-E).

ugyldig opsætning () {Serial.begin (9600); forsinkelse (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekvens // konfiguration af GPIO0 som OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfiguration af GPIO1 som OUTPUT (todos os pinos) configurePort (IODIR1, OUTPUT); // sætter os også på, at GPIO0 kan lave LOW writeBlockData (GP0, B00000000); // seta todos os pinos gør GPIO1 som LOW writeBlockData (GP1, B00000001); }

Sløjfe

I sløjfen skifter vi stifterne hvert 1. sekund. Når pin0 på GP0 er tændt, er benene på GP1 således slukket. Når pin0 på GP1 er tændt, er GP0 -benene slukket.

void loop () {// seta o pino 7 do GP0 como HIGH e os demais como LOW writeBlockData (GP0, B10000000); // seta todos os pinos gør GPIO1 som LOW writeBlockData (GP1, B00000000); forsinkelse (1000); // sætter os også på, at GPIO0 kan lave LOW writeBlockData (GP0, B00000000); // seta o pino 0 do GP1 como HIGH e os demais como LOW writeBlockData (GP1, B00000001); forsinkelse (1000); } // slutsløjfe

Trin 23: VIGTIGT

De anvendte variabler og bibliotek er de samme som for det program, vi lavede for ESP32, samt metoderne configurePort og writeBlockData.

Trin 24: Filer

Download filerne:

PDF

INO (ESP8266)

INO (ESP32)

Anbefalede: