Оглавление:

Расширитель ввода-вывода для ESP32, ESP8266 и Arduino: 24 шага
Расширитель ввода-вывода для ESP32, ESP8266 и Arduino: 24 шага

Видео: Расширитель ввода-вывода для ESP32, ESP8266 и Arduino: 24 шага

Видео: Расширитель ввода-вывода для ESP32, ESP8266 и Arduino: 24 шага
Видео: Подключение нескольких устройств, датчиков по I2C (АйТуСи) шине 2024, Ноябрь
Anonim
Image
Image
Вступление
Вступление

Хотели бы вы расширить количество операций ввода-вывода вашего 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 может иметь 128 GPIO!
ESP01 может иметь 128 GPIO!

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

Шаг 4: MCP23016

MCP23016
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
ESP01

Здесь я показываю распиновку ESP01.

Шаг 12: Установка ESP01

Крепление ESP01
Крепление ESP01

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

Шаг 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

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

Шаг 14: Установка NodeMCU ESP-12E

Монтажный узел MCU ESP-12E
Монтажный узел MCU ESP-12E

В этом случае единственное отличие от первого примера состоит в том, что вы подключили D1 и D2 в SDA и SCL соответственно.

Шаг 15: WiFi NodeMCU-32S ESP-WROOM-32

Узел Wi-Fi MCU-32S ESP-WROOM-32
Узел Wi-Fi MCU-32S ESP-WROOM-32

Вот распиновка WiFi-узла MCU-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 #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: файлы

Загрузите файлы:

PDF

INO (ESP8266)

INO (ESP32)

Рекомендуемые: