Sadržaj:

IO ekspander za ESP32, ESP8266 i Arduino: 24 koraka
IO ekspander za ESP32, ESP8266 i Arduino: 24 koraka

Video: IO ekspander za ESP32, ESP8266 i Arduino: 24 koraka

Video: IO ekspander za ESP32, ESP8266 i Arduino: 24 koraka
Video: PCF8574 GPIO Extender - With Arduino and NodeMCU 2024, Studeni
Anonim
Image
Image
Uvod
Uvod

Želite li proširiti IO -ove vašeg ESP32, ESP8266 ili Arduina? Jeste li razmišljali o mogućnosti 16 novih GPIO -a koji se mogu kontrolirati pomoću I2C sabirnice? Pa danas ću vam predstaviti GPIO ekspander MCP23016. Također ću vam pokazati kako komunicirati mikrokontroler s MCP23016. Također ću govoriti o stvaranju programa u kojem ćemo koristiti samo 2 pina ovog mikrokontrolera za komunikaciju s proširivačem. Koristit ćemo ih za kontrolu LED dioda i gumba.

Korak 1: Uvod

Uređaj MCP23016 pruža 16 bita za GPIO proširenje pomoću I2C sabirnice. Svaki bit može se konfigurirati zasebno (ulaz ili izlaz).

MCP23016 sastoji se od više 8-bitnih postavki za odabir ulaza, izlaza i polariteta.

Proširivači pružaju jednostavno rješenje kada su IO -ovi potrebni za prekidače, senzore, gumbe i LED diode, među ostalim primjerima.

Korak 2: Karakteristike

16 ulaznih / izlaznih pinova (16 ulaznih standarda)

Brza frekvencija takta sabirnice I2C (0-400 kbita/s)

Tri priključka za hardversku adresu omogućuju korištenje do osam uređaja

Snimanje snimanja prekida portova

Registar za promjenu polariteta za postavljanje polariteta ulaznih podataka porta

Kompatibilan s većinom mikrokontrolera

Korak 3: ESP01 može imati 128 GPIO -a

ESP01 može imati 128 GPIO -a!
ESP01 može imati 128 GPIO -a!

Primjer koji pokazuje veličinu ovog proširivača je njegova upotreba s ESP01, koji se može spojiti na do osam proširivača sa samo dva IOS -a, dostižući 128 GPIO -a.

Korak 4: MCP23016

MCP23016
MCP23016

Ovdje imamo shemu proširivača koji ima dvije grupe od osam bitova. To čini ukupno 16 priključaka. Uz pin za prekid, on ima pin CLK, koji povezuje kondenzator i otpornik, koji su interno povezani u logički port. Ovo je za stvaranje sata, koristeći ideju kristalnog oscilatora, kojem je potreban takt od 1 MHz. TP pin se koristi za mjerenje sata. Igle A0, A1 i A2 su binarne adrese.

Korak 5: SAT

SAT
SAT
SAT
SAT

MCP23016 stoga koristi vanjski RC krug za određivanje brzine unutarnjeg sata. Za ispravan rad uređaja potreban je (obično) unutarnji sat od 1 MHz. Unutarnji sat može se mjeriti na TP pinu. Preporučene vrijednosti za REXT i CEXT prikazane su u nastavku.

Korak 6: Adresa

Za definiranje adrese MCP23016 tada koristimo pinove A0, A1 i A2. Za promjenu adrese ostavite ih na VISOKOM ili NISKOM.

Adresa će se formirati na sljedeći način:

MCP_Adress = 20 + (A0 A1 A2)

Tamo gdje A0 A1 A2 može poprimiti VISOKE / NISKE vrijednosti, to tvori binarni broj od 0 do 7.

Na primjer:

A0> GND, A1> GND, A2> GND (znači 000, zatim 20 + 0 = 20)

Ili drugo, A0> HIGH, A1> GND, A2> HIGH (znači 101, zatim 20 + 5 = 25)

Korak 7: Naredbe

Naredbe
Naredbe

Dolje je tablica s naredbama za komunikaciju. Koristimo GP0 i GP1, kao i IODIR0 i IODIR1.

Korak 8: Kategorije:

GP0 / GP1 - Registri portova za podatke

Postoje dva registra koji omogućuju pristup dvama GPIO priključcima.

Očitavanje registra osigurava status pinova na tom priključku.

Bit = 1> HIGH Bit = 0> LOW

OLAT0 / OLAT1 - IZLAZNI REGISTRI LACTCH

Postoje dva registra koji omogućuju pristup izlaznim portovima dvaju portova.

IPOL0 / IPOL1 - Registri ulaznih polariteta

Ti registri omogućuju korisniku da konfigurira polaritet ulaznih podataka porta (GP0 i GP1).

IODIR0 / IODIR1

Postoje dva registra koji kontroliraju pin način rada. (Ulaz ili izlaz)

Bit = 1> ULAZ Bit = 0> IZLAZ

INTCAP0 / INTCAP1 - Registri hvatanja prekida

To su registri koji sadrže vrijednost porta koji je generirao prekid.

IOCON0 / IOCON1 - Upravljački registar I / O ekspandera

Time se kontrolira funkcionalnost MCP23016.

Postavni bit 0 (IARES> Razrješenje aktivnosti prekida) kontrolira frekvenciju uzorkovanja pinova GP priključka.

Bit0 = 0> (zadano) Maksimalno vrijeme otkrivanja aktivnosti priključka je 32 ms (niska potrošnja energije)

Bit0 = 1> maksimalno vrijeme otkrivanja aktivnosti na priključku je 200usec (veća potrošnja energije)

Korak 9: Struktura za komunikaciju

Struktura za komunikaciju
Struktura za komunikaciju

Ovdje pokazujem klasu Wire, koja je I2C komunikacija u našem jezgri Arduina, koja također omogućuje proširivaču rad s Arduino Uno i Mega. Međutim, potonji već ima nekoliko IO -ova. Ovdje se bavimo adresama čipa, kontrolom pristupa, kodovima registara, kao i podacima.

Korak 10: Program

Program
Program

Naš program sastoji se od komuniciranja ESP32 s MCP23016 kako bi se moglo koristiti više GPIO -ova. Tada ćemo imati gumb i neke LED diode spojene na MCP23016. Kontrolirat ćemo sve njih koristeći samo I2C sabirnicu. Tako će se koristiti samo dva ESP32 pina. Krug slike možete vidjeti ispod u videu.

Korak 11: ESP01

ESP01
ESP01

Ovdje pokazujem ispis ESP01.

Korak 12: Montiranje ESP01

Montaža ESP01
Montaža ESP01

U ovom primjeru imamo GPIO0 spojen u SDA, a GPIO2 u SCL. Također imamo relejnu ploču, zujalicu i LED diodu. S druge strane, u GP1.0, imamo još jednu LED sa otpornikom.

Korak 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Ovdje imamo ispis NodeMCU ESP-12E.

Korak 14: Montiranje NodeMCU ESP-12E

Montažni čvorMCU ESP-12E
Montažni čvorMCU ESP-12E

U ovom slučaju, jedina razlika od prvog primjera je ta što ste spojili D1 i D2 u SDA odnosno SCL.

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

WiFi čvorMCU-32S ESP-WROOM-32
WiFi čvorMCU-32S ESP-WROOM-32

Ovdje je ispis WiFi NodeMCU-32S ESP-WROOM-32.

Korak 16: WiFi čvor za montažuMCU-32S ESP-WROOM-32

WiFi čvor za montažuMCU-32S ESP-WROOM-32
WiFi čvor za montažuMCU-32S ESP-WROOM-32

Ovaj put glavna razlika od druga dva primjera je gumb i tri trepereće LED diode. Ovdje je SDA spojen na GPIO19, dok je SCL spojen na GPIO23.

Korak 17: Knjižnice i varijable

Prvo ćemo uključiti Wire.h, koji je odgovoran za i2c komunikaciju, kao i postavljanje i2c adrese MCP23016. Prikazujem nekoliko naredbi, čak i neke koje ne koristimo u ovom projektu.

#include // navedite upotrebu knjižnice Wire.h. // endereço I2C do MCP23016 #define MCPAddress 0x20 // ODNOS ZAPOVJEDNOG BAJTA ZA REGISTRACIJU: Tablica: 1-3 mikročipa MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // REGISTAR PORT PODATAKA 0 #define GP1 0 PORT REGISTR 1 #define OLAT0 0x02 // REGISTAR IZLAZNOG ZATVORA 0 #define OLAT1 0x03 // REGISTAR IZLAZNOG ZATVORA 1 #define IPOL0 0x04 // REGISTAR ULAZNOG POLARITETA 0 #define IPOL1 0x05 // INPUT POLARITY PORT IGRE 1 /I/O REGISTAR UPRAVLJANJA 0 #define IODIR1 0x07 // REGISTAR I/O SMJERNICE 1 #define INTCAP0 0x08 // REGRETAR HVATANJA PREKIDA 0 #define INTCAP1 0x09 // REGISTRIRAJ REGISTAR HVATANJA 1 #define IOCON0 OxPA I REGISTAR 0 #define IOCON1 0x0B // UPRAVLJAČ I/O PROŠIRIVAČA REGISTAR 1

Korak 18: Postavljanje

Ovdje imamo funkcije za inicijalizaciju četiri različite vrste mikrokontrolera. Također provjeravamo frekvenciju, postavljamo GPIO -ove i postavljamo pinove. U petlji provjeravamo status gumba.

void setup () {Serial.begin (9600); kašnjenje (1000); Wire.begin (19, 23); // ESP32 // Žica.počnite (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekvencija // konfiguracija o GPIO0 kao OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfiguracija o GPIO1 kao ULAZ o GP1.0 ili zajednički OUTPUT os out 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); } // završna petlja

Korak 19: Konfigurirajte port

U ovom koraku konfiguriramo način rada GPIO pinova i identificiramo način portova.

// konfiguracija 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/ / 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 port, uint8_t custom) {if (custom == INPUT) {writeBlockData (port, 0xFF); } else if (custom == OUTPUT) {writeBlockData (port, 0x00); } else {writeBlockData (port, prilagođeno); }}

Korak 20: WriteBlockData & CheckButton

Ovdje šaljemo podatke na MCP23016 putem sabirnice i2c, provjeravamo status gumba i označavamo sljedeći korak, uzimajući u obzir stanje pritiska ili ne.

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

Korak 21: ReadPin & ValueFromPin

Ovdje se bavimo očitanjem određenog pina i vraćanjem vrijednosti bita u željeni položaj.

// 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 hrabrosti do bita 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; }

Korak 22: Program ESP8266

Odavde ćemo vidjeti kako je nastao program koji smo koristili u ESP-01 i u čvoru MCU ESP-12E, što nam omogućuje da shvatimo kako su razlike među njima minimalne.

Promijenit ćemo samo liniju komunikacijskog konstruktora i2c, što je metoda početka objekta Wire.

Samo komentirajte redak prema ploči koju ćemo sastaviti.

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

Postaviti

Uočite da se graditelj još uvijek komentira. Stoga, uklonite komentar u skladu sa svojom pločom (ESP-01 ili nodeMCU ESP12-E).

void setup () {Serial.begin (9600); kašnjenje (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekvencija // konfiguracija o GPIO0 kao OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfiguracija o GPIO1 kao 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); }

Petlja

U petlji mijenjamo pinove svake 1 sekunde. Dakle, kada je pin0 GP0 uključen, pinovi GP1 su isključeni. Kad je pin0 GP1 uključen, GP0 pinovi su isključeni.

void loop () {// seta o pino 7 do GP0 kao HIGH e os demais como LOW writeBlockData (GP0, B10000000); // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000000); kašnjenje (1000); // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta o pino 0 do GP1 kao HIGH e os demais como LOW writeBlockData (GP1, B00000001); kašnjenje (1000); } // završna petlja

Korak 23: VAŽNO

Varijable i knjižnica koje se koriste iste su kao u programu koji smo radili za ESP32, kao i metode configurePort i writeBlockData.

Korak 24: Datoteke

Preuzmite datoteke:

PDF

INO (ESP8266)

INO (ESP32)

Preporučeni: