Obsah:

IO Expander pro ESP32, ESP8266 a Arduino: 24 kroků
IO Expander pro ESP32, ESP8266 a Arduino: 24 kroků

Video: IO Expander pro ESP32, ESP8266 a Arduino: 24 kroků

Video: IO Expander pro ESP32, ESP8266 a Arduino: 24 kroků
Video: Adding I/O with MCP23017 - Collin’s Lab Notes #adafruit #collinslabnotes 2024, Listopad
Anonim
Image
Image
Úvod
Úvod

Chcete rozšířit IO svých ESP32, ESP8266 nebo Arduino? A přemýšleli jste o možnosti 16 nových GPIO, které lze ovládat pomocí sběrnice I2C? Dnes vám představím GPIO expandér MCP23016. Také vám ukážu, jak komunikovat mikrokontrolér s MCP23016. Budu také mluvit o vytvoření programu, kde budeme ke komunikaci s expandérem používat pouze 2 piny tohoto mikrokontroléru. Použijeme je k ovládání LED a tlačítka.

Krok 1: Úvod

Zařízení MCP23016 poskytuje 16 bitů pro rozšíření GPIO pomocí sběrnice I2C. Každý bit lze konfigurovat jednotlivě (vstup nebo výstup).

MCP23016 se skládá z několika 8bitových nastavení pro výběr vstupu, výstupu a polarity.

Expandéry poskytují mimo jiné jednoduché řešení, když jsou IO potřebné pro spínače, senzory, tlačítka a LED diody.

Krok 2: Charakteristiky

16 vstupních / výstupních pinů (16 vstupních standardů)

Rychlá taktovací frekvence sběrnice I2C (0-400 kbit/s)

Tři hardwarové adresní kolíky umožňují použití až osmi zařízení

Záznamník přerušení portu

Registr obracející polaritu pro nastavení polarity dat vstupního portu

Kompatibilní s většinou mikrokontrolérů

Krok 3: ESP01 může mít 128 GPIO

ESP01 může mít 128 GPIO!
ESP01 může mít 128 GPIO!

Příkladem, který ukazuje velikost tohoto expandéru, je jeho použití s ESP01, který lze připojit až k osmi expandérům pouze se dvěma IOS a dosáhnout 128 GPIO.

Krok 4: MCP23016

MCP23016
MCP23016

Zde máme schéma expandéru, který má dvě skupiny po osmi bitech. To činí celkem 16 portů. Kromě přerušovacího pinu má pin CLK, který spojuje kondenzátor a odpor, které jsou interně propojeny v logickém portu. Toto má tvořit hodiny pomocí myšlenky krystalového oscilátoru, který potřebuje 1MHz hodiny. Pin TP slouží k měření hodin. Piny A0, A1 a A2 jsou binární adresy.

Krok 5: HODINY

HODINY
HODINY
HODINY
HODINY

MCP23016 proto používá k určení rychlosti interních hodin externí RC obvod. Aby zařízení správně fungovalo, je nutný (obvykle) vnitřní takt 1 MHz. Interní hodiny lze měřit na pinu TP. Doporučené hodnoty pro REXT a CEXT jsou uvedeny níže.

Krok 6: Adresa

K definování adresy MCP23016 pak použijeme piny A0, A1 a A2. Pro změnu adresy je nechte na VYSOKÉ nebo NÍZKÉ.

Adresa bude vytvořena následovně:

MCP_Address = 20 + (A0 A1 A2)

Kde A0 A1 A2 může nabývat hodnot HIGH / LOW, tvoří to binární číslo od 0 do 7.

Například:

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

Nebo jinak, A0> VYSOKÝ, A1> GND, A2> VYSOKÝ (to znamená 101, pak 20 + 5 = 25)

Krok 7: Příkazy

Příkazy
Příkazy

Níže je tabulka s příkazy pro komunikaci. Použijme GP0 a GP1, stejně jako IODIR0 a IODIR1.

Krok 8: Kategorie:

GP0 / GP1 - registry datových portů

Existují dva registry, které poskytují přístup ke dvěma portům GPIO.

Čtení registru poskytuje stav pinů na tomto portu.

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

OLAT0 / OLAT1 - Výstup LACTCH REGISTRACE

Existují dva registry, které poskytují přístup k výstupním portům obou portů.

IPOL0 / IPOL1 - registry polarity vstupu

Tyto registry umožňují uživateli konfigurovat polaritu dat vstupního portu (GP0 a GP1).

IODIR0 / IODIR1

Režim pinů ovládají dva registry. (Vstup nebo výstup)

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

INTCAP0 / INTCAP1 - Přerušení záznamových registrů

Jedná se o registry, které obsahují hodnotu portu, který generoval přerušení.

IOCON0 / IOCON1 - I / O Expander Control Register

Tím se ovládá funkčnost MCP23016.

Nastavení bitu 0 (IARES> Rozlišení aktivity přerušení) řídí vzorkovací frekvenci pinů portu GP.

Bit0 = 0> (výchozí) Maximální doba detekce aktivity portu je 32 ms (nízká spotřeba energie)

Bit0 = 1> maximální doba detekce aktivity na portu je 200usec (vyšší spotřeba energie)

Krok 9: Struktura pro komunikaci

Struktura pro komunikaci
Struktura pro komunikaci

Ukazuji zde třídu Wire, což je komunikace I2C v našem jádru Arduino, která také umožňuje expandéru pracovat s Arduino Uno a Mega. Ten druhý však již má několik IO. Zabýváme se zde adresami čipu, kontrolou přístupu, což jsou kódy registrů, a také daty.

Krok 10: Program

Program
Program

Náš program spočívá v komunikaci ESP32 s MCP23016, aby bylo možné použít více GPIO. Poté budeme mít k MCP23016 připojeno tlačítko a některé diody LED. Všechny je budeme ovládat pouze pomocí sběrnice I2C. Budou tedy použity pouze dva piny ESP32. Obrazový obvod můžete vidět níže ve videu.

Krok 11: ESP01

ESP01
ESP01

Zde ukazuji Pinout ESP01.

Krok 12: Montáž ESP01

Montáž ESP01
Montáž ESP01

V tomto případě máme GPIO0 připojený v SDA a GPIO2 připojený v SCL. Máme také reléovou desku, bzučák a LED. Na druhém portu, v GP1.0, máme ještě jednu LED s odporem.

Krok 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Zde máme Pinout NodeMCU ESP-12E.

Krok 14: Montáž NodeMCU ESP-12E

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

V tomto případě je jediným rozdílem od prvního příkladu to, že jste připojili 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

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

Krok 16: Připojení WiFi NodeMCU-32S ESP-WROOM-32

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

Tentokrát je hlavním rozdílem od ostatních dvou příkladů tlačítko a tři blikající diody LED. Zde je SDA připojen k GPIO19, zatímco SCL je připojen k GPIO23.

Krok 17: Knihovny a proměnné

Nejprve zahrneme Wire.h, který je zodpovědný za komunikaci i2c, a také nastavení adresy i2c MCP23016. Ukazuji několik příkazů, dokonce i některé, které v tomto projektu nepoužíváme.

#include // zadejte použití knihovny 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 PORTU 1 #definovat OLAT0 0x02 // VÝSTUP ZÁPADNÍ REGISTRÁTOR 0 #definovat OLAT1 0x03 // VÝSTUPNÍ ZÁPIS REGISTR 1 #definovat IPOL0 0x04 // VSTUP POLARITA REGISTR PORTU 0 #definovat IPOL1 0x05 // VSTUP POLARITY PORT REGISTER 1 # /REGISTR SMĚRU I/O 0 #definovat IODIR1 0x07 // REGISTR SMĚRU I/O 1 #definovat INTCAP0 0x08 // PŘERUŠIT REGISTR CAPTURE 0 #definovat INTCAP1 0x09 // PŘERUŠIT ZÁZNAM REGISTR 1 #definovat IOCON0 0x0 REGISTRACE 0 #definovat IOCON1 0x0B // I/O EXPANDER REGISTRACE 1

Krok 18: Nastavení

Zde máme funkce pro inicializaci čtyř různých typů mikrokontrolérů. Také kontrolujeme frekvenci, nastavujeme GPIO a nastavujeme piny. Ve smyčce kontrolujeme stav tlačítka.

neplatné nastavení () {Serial.begin (9600); zpoždění (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekvence // konfigurace o GPIO0 como VÝSTUP (todos os pinos) configurePort (IODIR0, OUTPUT); // konfigurace o GPIO1 como INPUT o GP1.0 e como OUTPUT os outros GP1 configurePort (IODIR1, 0x01); // seta tosos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta tosos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000000); } void loop () {// verifica e o botão GP for pressionado checkButton (GP1); } // koncová smyčka

Krok 19: ConfigurePort

V tomto kroku konfigurujeme režim GPIO pinů a identifikujeme režim portů.

// konfigurace o GPIO (GP0 ou GP1) // parametry parametru 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 == VÝSTUP) {writeBlockData (port, 0x00); } else {writeBlockData (port, vlastní); }}

Krok 20: WriteBlockData & CheckButton

Zde odesíláme data na MCP23016 přes sběrnici i2c, kontrolujeme stav tlačítka a indikujeme další krok, přičemž vezmeme v úvahu stav stisknutí nebo 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 (data); Wire.endTransmission (); zpoždění (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); // více než obvykle, nastavte jako VYSOKÉ jako porty GP0 if (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa todas em estado LOW else {writeBlockData (GP0, B00000000); }}

Krok 21: ReadPin & ValueFromPin

Zde se zabýváme čtením konkrétního kolíku a návratem bitové hodnoty do požadované 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 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; }

Krok 22: Program ESP8266

Odtud uvidíme, jak byl vytvořen program, který jsme použili v ESP-01 a v nodeMCU ESP-12E, což nám umožňuje pochopit, jak jsou rozdíly mezi nimi minimální.

Upravíme pouze řádek komunikačního konstruktoru i2c, což je počáteční metoda objektu Wire.

Stačí odkomentovat řádek podle desky, kterou se chystáme sestavit.

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

Založit

Všimněte si, že stavitel je stále okomentován. Proto odkomentujte podle vaší desky (ESP-01 nebo nodeMCU ESP12-E).

neplatné nastavení () {Serial.begin (9600); zpoždění (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekvence // konfigurace o GPIO0 como VÝSTUP (todos os pinos) configurePort (IODIR0, OUTPUT); // konfigurace o GPIO1 como VÝSTUP (todos os pinos) configurePort (IODIR1, OUTPUT); // seta tosos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta tosos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000001); }

Smyčka

Ve smyčce přepínáme kolíky každou 1 sekundu. Když je tedy pin0 GP0 zapnutý, piny GP1 jsou vypnuté. Když je pin0 GP1 zapnutý, piny GP0 jsou vypnuté.

void loop () {// seta o pino 7 do GP0 como HIGH e os demais como LOW writeBlockData (GP0, B10000000); // seta tosos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000000); zpoždění (1000); // seta tosos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta o pino 0 do GP1 como HIGH e os demais como LOW writeBlockData (GP1, B00000001); zpoždění (1000); } // koncová smyčka

Krok 23: DŮLEŽITÉ

Použité proměnné a knihovna jsou stejné jako v programu, který jsme udělali pro ESP32, a také v metodách configurePort a writeBlockData.

Krok 24: Soubory

Stáhnout soubory:

PDF

INO (ESP8266)

INO (ESP32)

Doporučuje: