Съдържание:

IO Expander за ESP32, ESP8266 и Arduino: 24 стъпки
IO Expander за ESP32, ESP8266 и Arduino: 24 стъпки

Видео: IO Expander за ESP32, ESP8266 и Arduino: 24 стъпки

Видео: IO Expander за ESP32, ESP8266 и Arduino: 24 стъпки
Видео: PCF8574 GPIO Extender - With Arduino and NodeMCU 2024, Юли
Anonim
Image
Image
Въведение
Въведение

Искате ли да разширите IO на вашия ESP32, ESP8266 или Arduino? Мислили ли сте за възможността за 16 нови GPIO, които могат да се контролират с помощта на I2C шината? Е, днес ще ви запозная с GPIO разширителя MCP23016. Също така ще ви покажа как да комуникирате микроконтролер с MCP23016. Ще говоря и за създаване на програма, в която ще използваме само 2 пина на този микроконтролер за комуникация с разширителя. Ще ги използваме за управление на светодиодите и бутона.

Стъпка 1: Въведение

Устройството MCP23016 осигурява 16 бита за разширяване на GPIO с помощта на I2C шината. Всеки бит може да бъде конфигуриран поотделно (вход или изход).

MCP23016 се състои от множество 8-битови настройки за избор на вход, изход и полярност.

Разширителите предлагат просто решение, когато IO са необходими за ключове, сензори, бутони и светодиоди, наред с други примери.

Стъпка 2: Характеристики

16 входни / изходни пина (16 входни стандарта)

Бърза тактова честота на I2C шина (0-400 kbits/s)

Три пина за хардуерен адрес позволяват използването на до осем устройства

Рекордер за прекъсване на порт за улавяне

Регистър за обръщане на полярността за настройка на полярността на данните за входния порт

Съвместим с повечето микроконтролери

Стъпка 3: ESP01 може да има 128 GPIO

ESP01 може да има 128 GPIO!
ESP01 може да има 128 GPIO!

Пример, който показва мащаба на този разширител, е използването му с ESP01, който може да бъде свързан с до осем разширителя само с два IOS, достигащи 128 GPIO.

Стъпка 4: MCP23016

MCP23016
MCP23016

Тук имаме схемата на разширителя, който има две групи от осем бита. Това прави общо 16 порта. В допълнение към прекъсващ щифт, той има щифта CLK, който свързва кондензатора и резистора, които са вътрешно свързани в логически порт. Това е за формиране на часовника, като се използва идеята за кристален осцилатор, който се нуждае от 1MHz часовник. Щифтът TP се използва за измерване на часовника. Пиновете A0, A1 и A2 са двоични адреси.

Стъпка 5: ЧАСОВНИК

ЧАСОВНИК
ЧАСОВНИК
ЧАСОВНИК
ЧАСОВНИК

Следователно MCP23016 използва външна RC верига за определяне на скоростта на вътрешния часовник. Вътрешен часовник от 1 MHz е необходим (обикновено) за правилната работа на устройството. Вътрешният часовник може да се измери на TP щифта. Препоръчителните стойности за REXT и CEXT са показани по -долу.

Стъпка 6: Адрес

За да определим адреса на MCP23016, използваме пинове A0, A1 и A2. Просто ги оставете на HIGH или LOW за промяна на адреса.

Адресът ще бъде оформен, както следва:

MCP_Address = 20 + (A0 A1 A2)

Когато A0 A1 A2 може да приеме стойности HIGH / LOW, това формира двоично число от 0 до 7.

Например:

A0> GND, A1> GND, A2> GND (означава 000, след това 20 + 0 = 20)

Или друго, A0> HIGH, A1> GND, A2> HIGH (означава 101, след това 20 + 5 = 25)

Стъпка 7: Команди

Команди
Команди

По -долу е дадена таблица с командите за комуникация. Нека използваме GP0 и GP1, както и IODIR0 и IODIR1.

Стъпка 8: Категории:

GP0 / GP1 - Регистри на порта за данни

Има два регистъра, които осигуряват достъп до двата GPIO порта.

Четенето на регистъра осигурява състоянието на пиновете на този порт.

Bit = 1> HIGH Bit = 0> LOW

OLAT0 / OLAT1 - ИЗХОДНИ РЕГИСТРИ ЗА ЗАКРИВАНЕ

Има два регистъра, които осигуряват достъп до изходните портове на двата порта.

IPOL0 / IPOL1 - Регистри за полярност на входа

Тези регистри позволяват на потребителя да конфигурира полярността на данните за входния порт (GP0 и GP1).

IODIR0 / IODIR1

Има два регистъра, които контролират pin режима. (Вход или изход)

Бит = 1> ВХОД Бит = 0> ИЗХОД

INTCAP0 / INTCAP1 - Регистри за улавяне на прекъсвания

Това са регистри, които съдържат стойността на порта, генерирал прекъсването.

IOCON0 / IOCON1 - Регистър за контрол на I / O Expander

Това контролира функционалността на MCP23016.

Настройващият бит 0 (IARES> Разрешаване на прекъсване на активността) контролира честотата на дискретизация на пиновете на GP порта.

Bit0 = 0> (по подразбиране) Максималното време за откриване на активност на порта е 32 ms (ниска консумация на енергия)

Bit0 = 1> максималното време за откриване на активност на порта е 200usec (по-висока консумация на енергия)

Стъпка 9: Структура за комуникация

Структура за комуникация
Структура за комуникация

Тук показвам класа Wire, който е I2C комуникацията в нашето ядро Arduino, което също позволява на разширителя да работи с Arduino Uno и Mega. Последният обаче вече има няколко IO. Тук се занимаваме с адресите на чипа, контрола на достъпа, които са кодовете на регистрите, както и данните.

Стъпка 10: Програма

Програма
Програма

Нашата програма се състои в комуникация на ESP32 с MCP23016, за да се използват повече GPIO. След това ще имаме бутон и някои светодиоди, свързани към MCP23016. Ние ще ги контролираме само с помощта на I2C шината. По този начин ще се използват само два ESP32 пина. Можете да видите схемата на картината по -долу във видеото.

Стъпка 11: ESP01

ESP01
ESP01

Тук показвам Pinout на ESP01.

Стъпка 12: Монтиране на ESP01

Монтаж на ESP01
Монтаж на ESP01

В този пример имаме GPIO0, свързан в SDA, и GPIO2, свързан в SCL. Имаме и релейна платка, зумер и светодиод. На другия порт, в GP1.0, имаме още един светодиод с резистор.

Стъпка 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Тук имаме Pinout на NodeMCU ESP-12E.

Стъпка 14: Монтиране на възелMCU ESP-12E

Монтиращ възелMCU ESP-12E
Монтиращ възелMCU ESP-12E

В този случай единствената разлика от първия пример е, че сте свързали D1 и D2 съответно в SDA и SCL.

Стъпка 15: WiFi NodeMCU-32S ESP-WROOM-32

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

Ето разпечатката на WiFi NodeMCU-32S ESP-WROOM-32.

Стъпка 16: WiFi монтажен възелMCU-32S ESP-WROOM-32

WiFi монтажен възелMCU-32S ESP-WROOM-32
WiFi монтажен възелMCU-32S ESP-WROOM-32

Този път основната разлика от другите два примера е бутонът и трите мигащи светодиода. Тук SDA е свързан към GPIO19, докато SCL е свързан към GPIO23.

Стъпка 17: Библиотеки и променливи

Първо, ще включим Wire.h, който отговаря за i2c комуникацията, както и за задаване на i2c адреса на MCP23016. Показвам няколко команди, дори някои, които не използваме в този проект.

#include // посочете използването на библиотеката Wire.h. // endereço I2C do MCP23016 #deteine MCPAddress 0x20 // COMMAND BYTE TO REGISTER RELACIONS: Таблица: 1-3 от Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // РЕГИСТЪР НА ДАННИ 0 #дефинирам 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 PORT REGISTER 1 /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 OxPAND I/ REGISTER 0 #define IOCON1 0x0B // РЕГИСТЪР ЗА УПРАВЛЕНИЕ НА И/О РАЗШИРИТЕЛ 1

Стъпка 18: Настройка

Тук имаме функциите за инициализиране на четири различни типа микроконтролери. Също така проверяваме честотата, настройваме GPIO и задаваме щифтовете. В цикъла проверяваме състоянието на бутона.

void setup () {Serial.begin (9600); забавяне (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // честота // конфигурация на GPIO0 като OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // конфигуриране на GPIO1 como INPUT o GP1.0 e como OUTPUT os outros GP1 configurePort (IODIR1, 0x01); // да зададете основите на GPIO0 като LOW writeBlockData (GP0, B00000000); // да зададете основите на GPIO1 като LOW writeBlockData (GP1, B00000000); } void loop () {// проверява e или botout GP за натискане на checkButton (GP1); } // краен цикъл

Стъпка 19: ConfigurePort

В тази стъпка конфигурираме режима на GPIO пиновете и идентифицираме режима на портовете.

// конфигурация за GPIO (GP0 или GP1) // como parametro passamos: // порт: GP0 ou GP1 // обичай: 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 порт, uint8_t персонализиран) {if (обичай == INPUT) {writeBlockData (порт, 0xFF); } else if (custom == OUTPUT) {writeBlockData (порт, 0x00); } else {writeBlockData (порт, персонализиран); }}

Стъпка 20: WriteBlockData & CheckButton

Тук изпращаме данни към MCP23016 през i2c шината, проверяваме състоянието на бутона и посочваме следващата стъпка, като отчитаме условието за натискане или не.

// envia dados за MCP23016 através do barramento i2c // cmd: COMANDO (регистратор) // данни: dados (0-255) void writeBlockData (uint8_t cmd, uint8_t данни) {Wire.beginTransmission (MCPAddress); Wire.write (cmd); Wire.write (данни); Wire.endTransmission (); забавяне (10); }

// проверява се за бота за натискане // параметър GP: GP0 или GP1 void checkButton (uint8_t GP) {// faz a leitura do pino 0 без GP fornecido uint8_t btn = readPin (0, GP); // се показва натиск, сета за HIGH като portas GP0 if (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa todas em estado LOW else {writeBlockData (GP0, B00000000); }}

Стъпка 21: ReadPin & ValueFromPin

Тук се занимаваме с отчитането на конкретен щифт и връщането на битовата стойност в желаната позиция.

// 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 (); възвращаема стойностFromPin (pin, statusGP); } // retorna o valor do bit на 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 << щифт)) == 0? 0: 1; }

Стъпка 22: Програма ESP8266

От тук ще видим как е създадена програмата, която използвахме в ESP-01 и в nodeMCU ESP-12E, което ни позволява да разберем колко разликите между тях са минимални.

Ще променим само реда на комуникационния конструктор i2c, който е началният метод на обекта Wire.

Просто декомментирайте реда според таблицата, която ще компилираме.

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

Настройвам

Забележете, че строителят все още е коментиран. Затова разкомментирайте според вашата платка (ESP-01 или nodeMCU ESP12-E).

void setup () {Serial.begin (9600); забавяне (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // честота // конфигурация на GPIO0 като OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // конфигуриране на GPIO1 като OUTPUT (todos os pinos) configurePort (IODIR1, OUTPUT); // да зададете основите на GPIO0 като LOW writeBlockData (GP0, B00000000); // да зададете основите на GPIO1 като LOW writeBlockData (GP1, B00000001); }

Цикъл

В цикъла превключваме щифтовете на всеки 1 секунда. По този начин, когато pin0 на GP0 е включен, щифтовете на GP1 са изключени. Когато pin0 на GP1 е включен, пиновете на GP0 са изключени.

void loop () {// seta o pino 7 до GP0 como HIGH e os demais como LOW writeBlockData (GP0, B10000000); // да зададете основите на GPIO1 като LOW writeBlockData (GP1, B00000000); забавяне (1000); // да зададете основите на GPIO0 като LOW writeBlockData (GP0, B00000000); // настройка за пино 0 до GP1 като HIGH e os demais como LOW writeBlockData (GP1, B00000001); забавяне (1000); } // краен цикъл

Стъпка 23: ВАЖНО

Използваните променливи и библиотека са същите като тези на програмата, която направихме за ESP32, както и методите configurePort и writeBlockData.

Стъпка 24: Файлове

Изтеглете файловете:

PDF

INO (ESP8266)

INO (ESP32)

Препоръчано: