Obsah:

IO Expander pre ESP32, ESP8266 a Arduino: 24 krokov
IO Expander pre ESP32, ESP8266 a Arduino: 24 krokov

Video: IO Expander pre ESP32, ESP8266 a Arduino: 24 krokov

Video: IO Expander pre ESP32, ESP8266 a Arduino: 24 krokov
Video: PCF8574 GPIO Extender - With Arduino and NodeMCU 2024, Júl
Anonim
Image
Image
Úvod
Úvod

Chcete rozšíriť IO svojich ESP32, ESP8266 alebo Arduino? A premýšľali ste o možnosti 16 nových GPIO, ktoré je možné ovládať pomocou zbernice I2C? Dnes vám predstavím expandér GPIO MCP23016. Tiež vám ukážem, ako komunikovať mikrokontrolér s MCP23016. Tiež budem hovoriť o vytvorení programu, kde na komunikáciu s expandérom použijeme iba 2 piny tohto mikrokontroléra. Použijeme ich na ovládanie LED diód a tlačidla.

Krok 1: Úvod

Zariadenie MCP23016 poskytuje 16 bitov na rozšírenie GPIO pomocou zbernice I2C. Každý bit je možné konfigurovať jednotlivo (vstup alebo výstup).

MCP23016 pozostáva z viacerých 8-bitových nastavení pre výber vstupu, výstupu a polarity.

Expandéry poskytujú okrem iného jednoduché riešenie, keď sú IO potrebné pre spínače, senzory, tlačidlá a diódy LED.

Krok 2: Charakteristiky

16 vstupných / výstupných pinov (16 vstupných štandardov)

Vysoká hodinová frekvencia zbernice I2C (0-400 kbit/s)

Tri hardvérové adresné kolíky umožňujú použitie až ôsmich zariadení

Záznamník prerušenia portu

Register obrátenia polarity na nastavenie polarity údajov vstupného portu

Kompatibilný s väčšinou mikrokontrolérov

Krok 3: ESP01 môže mať 128 GPIO

ESP01 môže mať 128 GPIO!
ESP01 môže mať 128 GPIO!

Príkladom, ktorý ukazuje veľkosť tohto expandéra, je jeho použitie s ESP01, ktorý je možné pripojiť až k ôsmim expandérom s iba dvoma IOS, dosahujúcimi 128 GPIO.

Krok 4: MCP23016

MCP23016
MCP23016

Tu máme schému expandéra, ktorý má dve skupiny po osem bitov. Spolu je to teda 16 portov. Okrem kolíka prerušenia má pin CLK, ktorý spája kondenzátor a odpor, ktoré sú vnútorne spojené v logickom porte. Toto má vytvoriť hodiny pomocou myšlienky kryštálového oscilátora, ktorý potrebuje hodiny 1 MHz. Na meranie hodín slúži pin TP. Piny A0, A1 a A2 sú binárne adresy.

Krok 5: HODINY

HODINY
HODINY
HODINY
HODINY

MCP23016 preto používa externý RC obvod na určovanie rýchlosti vnútorných hodín. Na správnu funkciu zariadenia je potrebný (spravidla) vnútorný takt 1 MHz. Vnútorné hodiny je možné merať na kolíku TP. Odporúčané hodnoty pre REXT a CEXT sú uvedené nižšie.

Krok 6: Adresa

Na definovanie adresy MCP23016 potom použijeme piny A0, A1 a A2. Na zmenu adresy ich nechajte na HIGH alebo LOW.

Adresa bude mať nasledujúci tvar:

MCP_Address = 20 + (A0 A1 A2)

Tam, kde A0 A1 A2 môže nadobúdať VYSOKÉ / NÍZKE hodnoty, tvorí to binárne číslo od 0 do 7.

Napríklad:

A0> GND, A1> GND, A2> GND (znamená 000, potom 20 + 0 = 20)

Alebo iný, A0> VYSOKÝ, A1> GND, A2> VYSOKÝ (to znamená 101, potom 20 + 5 = 25)

Krok 7: Príkazy

Príkazy
Príkazy

Nasleduje tabuľka s príkazmi na komunikáciu. Používajme GP0 a GP1, ako aj IODIR0 a IODIR1.

Krok 8: Kategórie:

GP0 / GP1 - Registre dátových portov

Existujú dva registre, ktoré poskytujú prístup k dvom portom GPIO.

Čítanie registra poskytuje stav pinov na tomto porte.

Bit = 1> VYSOKÝ Bit = 0> NÍZKY

OLAT0 / OLAT1 - Výstup REGISTRÁTOROV LACTCH

Existujú dva registre, ktoré poskytujú prístup k výstupným portom týchto dvoch portov.

IPOL0 / IPOL1 - registre polarity vstupu

Tieto registre umožňujú užívateľovi konfigurovať polaritu údajov vstupného portu (GP0 a GP1).

IODIR0 / IODIR1

Režim pinov ovládajú dva registre. (Vstup alebo výstup)

Bit = 1> VSTUP Bit = 0> VÝSTUP

INTCAP0 / INTCAP1 - prerušenie registrov zachytávania

Ide o registre, ktoré obsahujú hodnotu portu, ktorý generoval prerušenie.

IOCON0 / IOCON1 - Riadiaci register expandéra I / O

Toto riadi funkčnosť MCP23016.

Nastavením bitu 0 (IARES> Rozlíšenie aktivity prerušenia) sa riadi vzorkovacia frekvencia pinov portu GP.

Bit0 = 0> (predvolené) Maximálna doba detekcie aktivity portu je 32 ms (nízka spotreba energie)

Bit0 = 1> maximálna doba detekcie aktivity na porte je 200usec (vyššia spotreba energie)

Krok 9: Štruktúra pre komunikáciu

Štruktúra pre komunikáciu
Štruktúra pre komunikáciu

Ukazujem tu triedu Wire, čo je komunikácia I2C v našom jadre Arduino, ktorá tiež umožňuje expandéru pracovať s Arduino Uno a Mega. Ten druhý však už má niekoľko IO. Zaoberáme sa tu adresami čipu, kontrolou prístupu, ktorými sú kódy registrov, ako aj údajmi.

Krok 10: Program

Program
Program

Náš program spočíva v komunikácii ESP32 s MCP23016, aby bolo možné použiť viac GPIO. Potom budeme mať k MCP23016 pripojené tlačidlo a niektoré diódy LED. Všetky budeme ovládať iba pomocou zbernice I2C. Budú teda použité iba dva piny ESP32. Obrazový obvod môžete vidieť nižšie vo videu.

Krok 11: ESP01

ESP01
ESP01

Tu uvádzam Pinout ESP01.

Krok 12: Montáž ESP01

Montáž ESP01
Montáž ESP01

V tomto prípade máme GPIO0 pripojený v SDA a GPIO2 zapojený v SCL. Máme tiež reléovú dosku, bzučiak a diódu LED. Na druhom porte, v GP1.0, máme ešte jednu LED s odporom.

Krok 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Tu máme Pinout NodeMCU ESP-12E.

Krok 14: Montáž NodeMCU ESP-12E

Montáž NodeMCU ESP-12E
Montáž NodeMCU ESP-12E

V tomto prípade je jediným rozdielom od prvého príkladu to, že ste prepojili D1 a D2 v SDA a SCL.

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

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

Tu je pinout WiFi NodeMCU-32S ESP-WROOM-32.

Krok 16: Pripojenie WiFi NodeMCU-32S ESP-WROOM-32

WiFi montáž NodeMCU-32S ESP-WROOM-32
WiFi montáž NodeMCU-32S ESP-WROOM-32

Tentoraz je hlavným rozdielom od ostatných dvoch príkladov tlačidlo a tri blikajúce diódy LED. Tu je SDA pripojený k GPIO19, zatiaľ čo SCL je pripojený k GPIO23.

Krok 17: Knižnice a premenné

Najprv zahrnieme Wire.h, ktorý je zodpovedný za komunikáciu i2c, a tiež nastavenie adresy i2c MCP23016. Ukazujem niekoľko príkazov, dokonca aj niektoré, ktoré v tomto projekte nepoužívame.

#include // zadajte použitie knižnice Wire.h. // 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 REGISTRÁCIA PORTU 1 #definovať OLAT0 0x02 // REGISTRÁCIA ZÁPADKU VÝSTUPU 0 #definovať OLAT1 0x03 // REGISTRÁCIA VÝSTUPU LATCH 1 #definovať IPOL0 0x04 // VSTUP POLARITY REGISTRÁCIA 0 #definovať IPOL1 0x05 // VSTUP POLARITY REGISTER 1 # / /REGISTRÁCIA SMEROV I/O 0 #definovať IODIR1 0x07 // REGISTRÁCIA SMEROV I/O 1 #definovať INTCAP0 0x08 // REGISTRÁCIA PRERUŠENIA ZACHYTÁVANIA 0 #definovať INTCAP1 0x09 // PRERUŠIŤ REGISTRÁCIU ZÁZNAMU 1 #definovať IOCON0 0/0 REGISTRÁCIA 0 #definovať IOCON1 0x0B // REGISTRÁCIA REGISTRÁCIE I/O EXPANDÉRA 1

Krok 18: Nastavenie

Tu máme funkcie na inicializáciu štyroch rôznych typov mikrokontrolérov. Tiež kontrolujeme frekvenciu, nastavujeme GPIO a nastavujeme piny. V slučke kontrolujeme stav tlačidla.

void setup () {Serial.begin (9600); oneskorenie (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekvencia // konfigurácia o GPIO0 como VÝSTUP (všetky osi) configurePort (IODIR0, VÝSTUP); // konfigurácia o GPIO1 como INPUT o GP1.0 e como OUTPUT os outros GP1 configurePort (IODIR1, 0x01); // seta tosos os pinos to GPIO0 como LOW writeBlockData (GP0, B00000000); // seta tosos os pinos to GPIO1 como LOW writeBlockData (GP1, B00000000); } void loop () {// overenie alebo testovanie GP pre tlač checkButton (GP1); } // koncová slučka

Krok 19: ConfigurePort

V tomto kroku nakonfigurujeme režim pinov GPIO a identifikujeme režim portov.

// konfigurácia GPIO (GP0 alebo GP1) // parametre viacerých parametrov: // port: GP0 alebo GP1 // vlastný: VSTUP pre všetky porty ako pre GP trabalharem como entrada // VÝSTUP pre všetky porty ako porty pre 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 == VÝSTUP) {writeBlockData (port, 0x00); } else {writeBlockData (port, vlastny); }}

Krok 20: WriteBlockData & CheckButton

Tu odosielame údaje na MCP23016 cez zbernicu i2c, kontrolujeme stav tlačidla a indikujeme ďalší krok, pričom vezmeme do úvahy stav stlačenia alebo nie.

// všetky údaje o MCP23016 atracé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 (údaje); Wire.endTransmission (); oneskorenie (10); }

// overenie konkrétnych tlakov // parametro GP: GP0 alebo GP1 void checkButton (uint8_t GP) {// faz a leitura do pino 0 no GP fornecido uint8_t btn = readPin (0, GP); // sa presúva, vyberajte VYSOKÉ ako porty GP0 if (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa todas em estado LOW else {writeBlockData (GP0, B00000000); }}

Krok 21: ReadPin a ValueFromPin

Tu sa zaoberáme čítaním konkrétneho kolíka a návratom bitovej hodnoty do požadovanej polohy.

// 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 (); návratová hodnotaFromPin (pin, statusGP); } // retorna or valor do bit on 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; }

Krok 22: Program ESP8266

Odtiaľto uvidíme, ako bol vytvorený program, ktorý sme použili v ESP-01 a v nodeMCU ESP-12E, čo nám umožňuje pochopiť, ako sú rozdiely medzi nimi minimálne.

Upravíme iba riadok komunikačného konštruktéra i2c, ktorý je počiatočnou metódou objektu Wire.

Stačí odkomentovať riadok podľa platne, ktorú ideme zostavovať.

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

Nastaviť

Všimnite si, že staviteľ je stále komentovaný. Odkomentujte preto podľa svojej dosky (ESP-01 alebo nodeMCU ESP12-E).

void setup () {Serial.begin (9600); oneskorenie (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekvencia // konfigurácia o GPIO0 como VÝSTUP (všetky osi) configurePort (IODIR0, VÝSTUP); // konfigurácia o GPIO1 como VÝSTUP (všetky osi) configurePort (IODIR1, VÝSTUP); // seta tosos os pinos to GPIO0 como LOW writeBlockData (GP0, B00000000); // seta tosos os pinos to GPIO1 como LOW writeBlockData (GP1, B00000001); }

Slučka

V slučke prepíname piny každú 1 sekundu. Keď je teda pin0 GP0 zapnutý, kolíky GP1 sú vypnuté. Keď je pin0 modulu GP1 zapnutý, kolíky GP0 sú vypnuté.

void loop () {// seta o pino 7 do GP0 como HIGH e os demais como LOW writeBlockData (GP0, B10000000); // seta tosos os pinos to GPIO1 como LOW writeBlockData (GP1, B00000000); oneskorenie (1000); // seta tosos os pinos to GPIO0 como LOW writeBlockData (GP0, B00000000); // seta o pino 0 do GP1 como HIGH e os demais como LOW writeBlockData (GP1, B00000001); oneskorenie (1000); } // koncová slučka

Krok 23: DÔLEŽITÉ

Použité premenné a knižnica sú rovnaké ako v programe, ktorý sme urobili pre ESP32, a tiež v metódach configurePort a writeBlockData.

Krok 24: Súbory

Stiahnite si súbory:

PDF

INO (ESP8266)

INO (ESP32)

Odporúča: