
Оглавление:
- Шаг 1. Введение
- Шаг 2: Характеристики
- Шаг 3: ESP01 может иметь 128 GPIO
- Шаг 4: MCP23016
- Шаг 5: ЧАСЫ
- Шаг 6: адрес
- Шаг 7: Команды
- Шаг 8: Категории:
- Шаг 9: структура для общения
- Шаг 10: программа
- Шаг 11: ESP01
- Шаг 12: Установка ESP01
- Шаг 13: NodeMCU ESP-12E
- Шаг 14: Установка NodeMCU 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: файлы
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-23 15:05



Хотели бы вы расширить количество операций ввода-вывода вашего ESP32, ESP8266 или Arduino? А вы не задумывались о возможности 16 новых GPIO, которыми можно будет управлять с помощью шины I2C? Итак, сегодня я собираюсь познакомить вас с расширителем GPIO MCP23016. Также я покажу вам, как установить связь между микроконтроллером и MCP23016. Я также расскажу о создании программы, в которой мы будем использовать только 2 контакта этого микроконтроллера для связи с расширителем. Мы будем использовать их для управления светодиодами и кнопкой.
Шаг 1. Введение
Устройство MCP23016 предоставляет 16 бит для расширения GPIO с использованием шины I2C. Каждый бит можно настроить индивидуально (вход или выход).
MCP23016 состоит из нескольких 8-битных настроек для входа, выхода и выбора полярности.
Расширители представляют собой простое решение, когда необходимы входы-выходы для переключателей, датчиков, кнопок и светодиодов, среди других примеров.
Шаг 2: Характеристики
16 контактов ввода / вывода (16 стандартных входов)
Тактовая частота быстрой шины I2C (0-400 кбит / с)
Три контакта аппаратного адреса позволяют использовать до восьми устройств
Регистратор захвата порта прерывания
Регистр изменения полярности для установки полярности данных входного порта
Совместим с большинством микроконтроллеров
Шаг 3: ESP01 может иметь 128 GPIO

Примером, показывающим масштабы этого расширителя, является его использование с ESP01, к которому можно подключить до восьми расширителей только с двумя IOS, достигая 128 GPIO.
Шаг 4: MCP23016

Здесь у нас есть схема расширителя, который имеет две группы по восемь бит. Всего получается 16 портов. Помимо вывода прерывания, он имеет вывод CLK, который соединяет конденсатор и резистор, которые внутренне подключены к логическому порту. Это сделано для формирования часов, используя идею кварцевого генератора, которому требуется тактовая частота 1 МГц. Вывод TP используется для измерения часов. Контакты A0, A1 и A2 являются двоичными адресами.
Шаг 5: ЧАСЫ


Поэтому MCP23016 использует внешнюю RC-цепь для определения скорости внутренних часов. Для правильной работы устройства требуются внутренние часы с частотой 1 МГц (обычно). Внутренние часы можно измерить на выводе TP. Рекомендуемые значения для REXT и CEXT показаны ниже.
Шаг 6: адрес
Затем для определения адреса MCP23016 мы используем контакты A0, A1 и A2. Просто оставьте для них ВЫСОКИЙ или НИЗКИЙ, чтобы изменить адрес.
Адрес будет сформирован следующим образом:
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.
Чтение регистра обеспечивает состояние контактов этого порта.
Бит = 1> ВЫСОКИЙ Бит = 0> НИЗКИЙ
OLAT0 / OLAT1 - ВЫХОДНЫЕ РЕГИСТРЫ LACTCH
Есть два регистра, которые обеспечивают доступ к выходным портам двух портов.
IPOL0 / IPOL1 - Регистры входной полярности
Эти регистры позволяют пользователю настраивать полярность данных входного порта (GP0 и GP1).
IODIR0 / IODIR1
Есть два регистра, которые управляют режимом вывода. (Вход или выход)
Бит = 1> ВХОД Бит = 0> ВЫХОД
INTCAP0 / INTCAP1 - регистры захвата прерываний
Это регистры, которые содержат значение порта, сгенерировавшего прерывание.
IOCON0 / IOCON1 - Регистр управления расширителем ввода / вывода
Это контролирует функциональность MCP23016.
Установка бита 0 (IARES> Interrupt Activity Resolution) контролирует частоту дискретизации контактов порта GP.
Bit0 = 0> (по умолчанию) Максимальное время обнаружения активности порта составляет 32 мс (низкое энергопотребление)
Bit0 = 1> максимальное время обнаружения активности на порте составляет 200 мс (повышенное энергопотребление)
Шаг 9: структура для общения

Я показываю здесь класс Wire, который является связью I2C в нашем ядре Arduino, который также позволяет расширителю работать с Arduino Uno и Mega. Однако у последнего уже есть несколько IO. Здесь мы имеем дело с адресами чипа, контролем доступа, которые являются кодами регистров, а также данными.
Шаг 10: программа

Наша программа состоит из связи ESP32 с MCP23016 для использования большего количества GPIO. Затем у нас будет кнопка и несколько светодиодов, подключенных к MCP23016. Всеми ими мы будем управлять, используя только шину I2C. Таким образом, будут использоваться только два контакта ESP32. Вы можете увидеть схему изображения ниже на видео.
Шаг 11: ESP01

Здесь я показываю распиновку ESP01.
Шаг 12: Установка ESP01

В этом примере у нас есть GPIO0, подключенный к SDA, и GPIO2, подключенный к SCL. У нас также есть плата реле, зуммер и светодиод. На другом порте, в GP1.0, есть еще один светодиод с резистором.
Шаг 13: NodeMCU ESP-12E

Здесь у нас есть распиновка NodeMCU ESP-12E.
Шаг 14: Установка NodeMCU ESP-12E

В этом случае единственное отличие от первого примера состоит в том, что вы подключили D1 и D2 в SDA и SCL соответственно.
Шаг 15: WiFi NodeMCU-32S ESP-WROOM-32

Вот распиновка WiFi-узла MCU-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 #define MCPAddress 0x20 // БАЙТ КОМАНДЫ ДЛЯ РЕГИСТРАЦИИ ВЗАИМОДЕЙСТВИЙ: Таблица: 1-3 Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // DATA PORT REGISTER 0 #define DATA 0GP1 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 Ox0A // IOCON0 Ox0A РЕГИСТР 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 como OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // конфигурируем GPIO1 как INPUT или GP1.0 и как OUTPUT вместо GP1 configurePort (IODIR1, 0x01); // установить задачи os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // установить задачи os pinos do GPIO1 como LOW writeBlockData (GP1, B00000000); } void loop () {// проверка бота GP для нажатия checkButton (GP1); } // конец цикла
Шаг 19: ConfigurePort
На этом этапе мы настраиваем режим контактов GPIO и определяем режим портов.
// configura o GPIO (GP0 ou GP1) // como parameter 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 or modo das portas (1 = INPUT, 0 = OUTPUT) // ex: 0x01 or B00000001 or 1: indica que apenas o GPX.0 trabalhará como entrada, o restando como saida void configurePort (uint8_t порт, uint8_t custom) {if (custom == INPUT) {writeBlockData (порт, 0xFF); } else if (custom == OUTPUT) {writeBlockData (порт, 0x00); } else {writeBlockData (порт, настраиваемый); }}
Шаг 20: WriteBlockData и CheckButton
Здесь мы отправляем данные на MCP23016 через шину i2c, проверяем состояние кнопки и указываем следующий шаг, учитывая при этом, нажата она или нет.
// 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 (данные); Wire.endTransmission (); задержка (10); }
// проверка бота для прессования // параметр GP: GP0 или GP1 void checkButton (uint8_t GP) {// faz a leitura do pino 0 no GP fornecido uint8_t btn = readPin (0, GP); // этот бот нажимается, устанавливается для HIGH как порт GP0 if (btn) {writeBlockData (GP0, B11111111); } // может быть иначе, чем LOW else {writeBlockData (GP0, B00000000); }}
Шаг 21: ReadPin и ValueFromPin
Здесь мы имеем дело с чтением определенного вывода и возвратом значения бита в желаемое положение.
// faz a leitura de um pino específico // pin: pino desejado (0-7) // gp: GP0 or 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); // сделаем чип 1 байт statusGP = Wire.read (); возвращаемое значениеFromPin (pin, statusGP); } // вернуть или вернуть бит на позиции // 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 como OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // настройка GPIO1 como OUTPUT (todos os pinos) configurePort (IODIR1, OUTPUT); // установить задачи os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // установить задачи os pinos do GPIO1 como LOW writeBlockData (GP1, B00000001); }
Петля
В шлейфе переключаем пины каждую 1 секунду. Таким образом, когда pin0 GP0 включен, контакты GP1 выключены. Когда pin0 GP1 включен, контакты GP0 выключены.
void loop () {// установить 7 для GP0 в HIGH или в LOW writeBlockData (GP0, B10000000); // установить задачи os pinos do GPIO1 como LOW writeBlockData (GP1, B00000000); задержка (1000); // установить задачи os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // установить значение 0 для GP1 в режим HIGH и в режиме LOW writeBlockData (GP1, B00000001); задержка (1000); } // конец цикла
Шаг 23: ВАЖНО
Используемые переменные и библиотека те же, что и в программе, которую мы сделали для ESP32, а также методы configurePort и writeBlockData.
Шаг 24: файлы
Загрузите файлы:
INO (ESP8266)
INO (ESP32)
Рекомендуемые:
Компьютерное управление с помощью жестов и сенсорного ввода: 3 шага

Компьютерное управление с помощью жестов и сенсорного ввода: это демонстрационный проект для нового Piksey Atto. Мы используем сенсорную ИС TTP224 и модуль жестов APDS-9960 для управления компьютером. Мы загружаем эскиз в Atto, который заставляет его действовать как USB-клавиатуру, а затем отправляет соответствующие коды клавиш в зависимости
Поистине расширитель Wi-Fi: 5 шагов

Truly WiFi Extender: Введение Настоящий WiFi Extender - это повторитель WiFi, основанный на Raspberry Pi Zero W. Он представляет собой хорошую альтернативу коммерческому повторителю WiFi, сочетающему недорогое (менее 10 долларов США) и настраиваемое программное обеспечение. Он также может запускать некоторые решения для блокировки рекламы
4-битное последовательное устройство ввода и хранения: 4 шага

4-битное последовательное устройство ввода и хранения: вы когда-нибудь представляли, как ваша клавиатура принимает ввод и как эти данные хранятся! Этот проект представляет собой уменьшенную версию ввода и хранения данных. Подробное объяснение того, как сигнал от клавиш, часов влияет на элементы памяти (триггеры)
Дешевый расширитель диапазона WiFi для Интернета вещей: 8 шагов

Дешевый WiFi-расширитель для IoT: как создать свой собственный WiFi-расширитель из дешевого WiFi-модуля ESP8266 за 2-8 долларов *** РЕДАКТИРОВАТЬ: С момента написания этой инструкции прошивка была значительно улучшена, с добавлением дополнительной страницы настроек графического интерфейса. (как обычный роутер), межсетевой экран, powerman
Однонаправленный расширитель диапазона Wi-Fi - еще раз: 3 шага

Однонаправленный расширитель диапазона WIFI - еще раз: 1-й шаг - перейдите по этой ссылке: (Затем вернитесь сюда) https://www.instructables.com/id/Uni-Directional-WIFI-Range-Extender/?ALLSTEPS"tm36usa" опубликовал это в июле 2006 года. Я наконец добрался до его создания в апреле 2009 года, потому что я много путешествую