Съдържание:
- Стъпка 1: Въведение
- Стъпка 2: Характеристики
- Стъпка 3: ESP01 може да има 128 GPIO
- Стъпка 4: MCP23016
- Стъпка 5: ЧАСОВНИК
- Стъпка 6: Адрес
- Стъпка 7: Команди
- Стъпка 8: Категории:
- Стъпка 9: Структура за комуникация
- Стъпка 10: Програма
- Стъпка 11: ESP01
- Стъпка 12: Монтиране на ESP01
- Стъпка 13: NodeMCU ESP-12E
- Стъпка 14: Монтиране на възелMCU ESP-12E
- Стъпка 15: WiFi NodeMCU-32S ESP-WROOM-32
- Стъпка 16: WiFi монтажен възелMCU-32S ESP-WROOM-32
- Стъпка 17: Библиотеки и променливи
- Стъпка 18: Настройка
- Стъпка 19: ConfigurePort
- Стъпка 20: WriteBlockData & CheckButton
- Стъпка 21: ReadPin & ValueFromPin
- Стъпка 22: Програма ESP8266
- Стъпка 23: ВАЖНО
- Стъпка 24: Файлове
Видео: IO Expander за ESP32, ESP8266 и Arduino: 24 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:53
Искате ли да разширите 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, който може да бъде свързан с до осем разширителя само с два IOS, достигащи 128 GPIO.
Стъпка 4: 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
Тук показвам Pinout на ESP01.
Стъпка 12: Монтиране на ESP01
В този пример имаме GPIO0, свързан в SDA, и GPIO2, свързан в SCL. Имаме и релейна платка, зумер и светодиод. На другия порт, в GP1.0, имаме още един светодиод с резистор.
Стъпка 13: NodeMCU ESP-12E
Тук имаме Pinout на NodeMCU ESP-12E.
Стъпка 14: Монтиране на възелMCU ESP-12E
В този случай единствената разлика от първия пример е, че сте свързали D1 и D2 съответно в SDA и SCL.
Стъпка 15: WiFi NodeMCU-32S ESP-WROOM-32
Ето разпечатката на WiFi NodeMCU-32S ESP-WROOM-32.
Стъпка 16: 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: Файлове
Изтеглете файловете:
INO (ESP8266)
INO (ESP32)
Препоръчано:
Първи стъпки с Python за ESP8266 и ESP32: 6 стъпки
Първи стъпки с Python за ESP8266 и ESP32: Bacground ESP8266 и неговият по-малък брат ESP32 са евтини Wi-Fi микрочипове с пълен TCP/IP стек и възможност за микроконтролер. Чипът ESP8266 за пръв път попадна в общността на производителите през 2014 г. Оттогава ниската цена (
Raspberry Pi - PCA9536 Вход/изход Expander Python Урок: 4 стъпки
Raspberry Pi-PCA9536 Входно/изходен разширител Python Урок: PCA9536 е 8-пиново CMOS устройство, което осигурява 4 бита разширение за паралелен вход/изход (GPIO) с общо предназначение за приложения на I2C-шина/SMBus. Състои се от 4-битов регистър за конфигуриране, който служи за целите на избора на вход или изход, 4-битов
ESP32 Bluetooth урок - Как да използвате вградения Bluetooth на ESP32: 5 стъпки
ESP32 Bluetooth урок | Как да използвате вградения Bluetooth на ESP32: Здравейте момчета Тъй като ESP32 Board идва с WiFi & Bluetooth и двете, но за нашите предимно проекти обикновено използваме само Wifi, ние не използваме Bluetooth. Така че в тази инструкция ще покажа колко лесно е да се използва Bluetooth на ESP32 & За вашите основни проекти
Първи стъпки с ESP32 CAM - Поточно предаване на видео с помощта на ESP CAM през Wifi - Проект за охранителна камера ESP32: 8 стъпки
Първи стъпки с ESP32 CAM | Поточно предаване на видео с помощта на ESP CAM през Wifi | Проект за камера за сигурност ESP32: Днес ще научим как да използваме тази нова ESP32 CAM платка и как можем да я кодираме и използваме като камера за сигурност и да получим поточно видео през wifi
Първи стъпки с ESP32 - Инсталиране на платки ESP32 в Arduino IDE - ESP32 Blink Code: 3 стъпки
Първи стъпки с ESP32 | Инсталиране на платки ESP32 в Arduino IDE | ESP32 Blink Code: В тази инструкция ще видим как да започнем работа с esp32 и как да инсталираме esp32 дъски в Arduino IDE и ще програмираме esp 32 да изпълнява мигащ код, използвайки arduino ide