Тринадцать цифровых линий и шесть аналоговых входов – это все, что может предложить Arduino в качестве средств ввода/вывода. Но в некоторых случаях (особенно в проектах с большим количеством периферийных устройств) такого набора линий портов недостаточно.

В связи с этим встает вопрос о целесообразности расширения количества линий ввода/вывода. В данном материале будет показан пример такого расширения с помощью микросхемы MCP23017.
Возможно, вы знаете, что 6 аналоговых контактов также могут использоваться как цифровые линии ввода/вывода таким образом:
Аналоговый вход 0 = линия 14
Аналоговый вход 1 = линия 15
Аналоговый вход 2 = линия 16
Аналоговый вход 3 = линия 17
Аналоговый вход 4 = линия 18
Аналоговый вход 5 = линия 19
То есть на самом деле мы можем ссылаться на аналоговый вход 5 как на цифровую линию следующим образом: digitalWrite(19,HIGH). Такая команда запишет логическую единицу в порт 19, то есть аналоговую линию 5.
Технически мы можем использовать линии последовательного порта TX/RX. Но в некоторых случаях это сделать крайне затруднительно, особенно когда в коде используются функции типа Serial.begin(), нужные для работы последовательного порта. Таким образом, общее количество контактов, доступных для пользователя, все же будет 17. Но разве можно с семнадцатью выводами управлять большим количеством светодиодов или сервомоторов? В этом случае лучше воспользоваться специальными внешними микросхемами. Зачастую в этих целях используют сдвиговый регистр вроде 74HC595. Но он требует три дополнительных линии для управления и не позволяет одновременно «расширить» все линии. Дисплейные драйверы, такие как MAX7219 тоже фактически «расширяют» количество контактов. Но MAX7219 является дорогостоящей микросхемой. Поэтому дешевле и рациональнее взять микросхему расширителя портов MCP23017. Эта микросхема рассчитана на 16 линий, имеет широкий диапазон рабочего напряжения от 1.8 до 5.5 В и управляется по интерфейсу I2C.
MCP23017 будет использовать 2 контакта Arduino и даст 16 линий ввода/вывода. Так что технически вы можете использовать 8 штук MCP23017 для расширения одного 16-контактного Arduino до 16 x 8 = 128 контактов. Arduino имеет библиотеку для шины I2C под названием Wire.h, поэтому взаимодействие с MCP23017 будет очень простым. Ниже приведена схема подключения Arduino и MCP23017.

Далее приведен код (скетч) для расширения портов Arduino с помощью MCP23017.
#include "Wire.h"
void setup()
{
Wire.begin(); // активируем шину I2C
// устанавливаем линии на выход
Wire.beginTransmission(0x20);
Wire.write(0x00); // регистр IODIRA
Wire.write(0x00); // устанавливаем все линии порта A на выход
Wire.endTransmission();
}
void loop()
{
Wire.beginTransmission(0x20);
Wire.write(0x12); // адресный банк A
Wire.write((byte)0xAA); // отправляемое значение - все линии в лог. 1
Wire.endTransmission();
delay(500);
Wire.beginTransmission(0x20);
Wire.write(0x12); // адресный банк A
Wire.write((byte)0x55); // отправляемое значение - все линии в лог. 1
Wire.endTransmission();
delay(500);
}
© digitrode.ru