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, Juli
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đe ću vam pokazati kako komunicirati mikrokontroler sa MCP23016. Govorit ću i o stvaranju programa u kojem ćemo koristiti samo 2 pina ovog mikrokontrolera za komunikaciju s ekspanderom. 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 se može konfigurirati zasebno (ulaz ili izlaz).

MCP23016 se sastoji od više 8-bitnih postavki za izbor 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, između ostalih primjera.

Korak 2: Karakteristike

16 ulaznih / izlaznih pinova (16 ulaznih standarda)

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

Tri priključka za hardversku adresu omogućuju upotrebu do osam uređaja

Snimanje snimanja prekida portova

Registar za promjenu polariteta za postavljanje polariteta ulaznih podataka porta

Kompatibilan sa 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 sa ESP01, koji se može povezati 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. Ovo čini ukupno 16 priključaka. Osim pin -a za prekid, on ima CLK pin, koji povezuje kondenzator i otpornik, koji su interno povezani u logički port. Ovo je za formiranje takta, 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 vanjsko RC kolo za određivanje brzine unutarnjeg sata. Za pravilan rad uređaja potreban je interni takt od 1 MHz (obično). Unutrašnji sat se može 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. Ostavite ih na HIGH ili LOW radi promjene adrese.

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

MCP_Address = 20 + (A0 A1 A2)

Tamo gdje A0 A1 A2 može poprimiti VISINE / NISKE vrijednosti, to čini 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

Komande
Komande

Ispod se nalazi 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ćavaju pristup do dva GPIO porta.

Očitavanje registra pruža status pinova na tom portu.

Bit = 1> HIGH Bit = 0> LOW

OLAT0 / OLAT1 - IZLAZNI REGISTRI LACTCH

Postoje dva registra koji omogućuju pristup izlaznim portovima dva porta.

IPOL0 / IPOL1 - Ulazni registri polariteta

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

IODIR0 / IODIR1

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

Bit = 1> INPUT Bit = 0> OUTPUT

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

Ovo kontrolira funkcionalnost MCP23016.

Postavni bit 0 (IARES> Razlučivost aktivnosti prekida) kontrolira frekvenciju uzorkovanja pinova GP porta.

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

Bit0 = 1> maksimalno vrijeme detekcije aktivnosti na portu je 200usec (veća potrošnja energije)

Korak 9: Struktura komunikacije

Struktura za komunikaciju
Struktura za komunikaciju

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

Korak 10: Program

Program
Program

Naš program se sastoji od komuniciranja ESP32 s MCP23016 kako biste imali više GPIO -a za upotrebu. Tada ćemo imati dugme 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 povezan u SDA, a GPIO2 u SCL. Imamo i relejnu ploču, zvučni signal i LED diodu. Na drugom portu, 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 u odnosu na prvi primjer je to što ste spojili D1 i D2 u SDA i SCL, respektivno.

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

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

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

Korak 16: Node za postavljanje WiFi-jaMCU-32S ESP-WROOM-32

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

Ovoga puta glavna razlika od druga dva primjera je dugme i tri trepereće LED diode. Ovdje je SDA spojen na GPIO19, dok je SCL povezan s GPIO23.

Korak 17: Biblioteke 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 Wire.h biblioteke. // endereço I2C do MCP23016 #define MCPAddress 0x20 // ODNOS ZAPOVJEDNOG BAJTA ZA REGISTRACIJU: Tablica: 1-3 od Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // REGISTAR PORT PODATAKA 0 #define GP1 0 PORT REGISTAR 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 DIREKCIJE 0 #define IODIR1 0x07 // REGISTAR I/O DIRECTION 1 #define INTCAP0 0x08 // REGRATOR HVATANJA PREKIDA 0 #define INTCAP1 0x09 // REGISTRIRAJ REGISTAR HVATANJA 1 #define IOCON0 OxPAND 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 dugmeta.

void setup () {Serial.begin (9600); kašnjenje (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // učestalost // konfiguracija o GPIO0 kao OUTPUT (sve što je potrebno) configurePort (IODIR0, OUTPUT); // konfiguracija o GPIO1 kao ULAZ o GP1.0 ili zajednički IZLAZ prema GP1 configurePort (IODIR1, 0x01); // postavljanje na GPIO0 kao LOW writeBlockData (GP0, B00000000); // postavljanje na GPIO1 kao LOW writeBlockData (GP1, B00000000); } void loop () {// verifikuje i o GP -u za pritiskanje 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 -u (GP0 ili GP1) // parametro passamos: // port: GP0 ou GP1 // običaj: INPUT para todos as portas to GP trabalharem como entrada // OUTPUT para todos as portas to GP trabalharem como saida/ / custom um valor de 0-255 označava modo das portas (1 = INPUT, 0 = OUTPUT) // ex: 0x01 ou B00000001 ili 1: indica que apenas o GPX.0 trabalhará como entrada, ili restao 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 tipke i označavamo sljedeći korak uzimajući u obzir stanje pritiska ili ne.

// sa podacima o MCP23016 através do barramento i2c // cmd: COMANDO (registrator) // podaci: dados (0-255) void writeBlockData (uint8_t cmd, uint8_t podaci) {Wire.beginTransmission (MCPAddress); Wire.write (cmd); Wire.write (podaci); Wire.endTransmission (); kašnjenje (10); }

// provjeravamo da li je pritisnut pritisak // parametar GP: GP0 ili GP1 void checkButton (uint8_t GP) {// faz a leitura do pino 0 no GP fornecido uint8_t btn = readPin (0, GP); // postavlja se kao pritisak, postavlja se kao HIGH kao port GP0 if (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa nije uključen LOW else {writeBlockData (GP0, B00000000); }}

Korak 21: ReadPin & ValueFromPin

Ovdje se bavimo očitavanjem 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 pozicionoj desejadi // 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ćava da razumijemo 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

Primijetite 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); // učestalost // konfiguracija o GPIO0 kao OUTPUT (sve što je potrebno) configurePort (IODIR0, OUTPUT); // konfiguracija o GPIO1 kao OUTPUT (sve što je potrebno) configurePort (IODIR1, OUTPUT); // postavljanje na GPIO0 kao LOW writeBlockData (GP0, B00000000); // postavljanje na GPIO1 kao LOW writeBlockData (GP1, B00000001); }

Petlja

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

void loop () {// postavlja se o 7 do GP0 prema HIGH -u ili zahtijeva prema LOW writeBlockData (GP0, B10000000); // postavljanje na GPIO1 kao LOW writeBlockData (GP1, B00000000); kašnjenje (1000); // postavljanje na GPIO0 kao LOW writeBlockData (GP0, B00000000); // postavljanje ili pino 0 do GP1 kao VISOKOG ili zahtjeva prema LOW writeBlockData (GP1, B00000001); kašnjenje (1000); } // završna petlja

Korak 23: VAŽNO

Varijable i biblioteka 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čuje se: