Назначение
Модуль предназаначен для коммутации до 16 каналов постоянного тока 50В/0.5А (реле, двигатели и пр.).
Модуль подключается к основной плате по шине SPI/I2C (в зависимости от установленной в панельку микросхемы MCP23S17 или MCP23017).
- Нагрузка до 0.5А по каждому из 16 каналов
- Встроенные обратные диоды
- Возможна работа с платами в формате Nano
!!! Внимание !!!
Модуль поставляется без микросхемы MCP23x17, поскольку возможно применение как микросхем для I2C, так и для SPI интерфейсов.
Необходимую микросхему нужно заказать отдельно, либо использовать имеющеюся. Так, обладатели модуля Expander Shield вполне могут переставить одну из микросхем, если не требуются все 32 вывода Expander Shield, а достаточно 16.
Модуль поставляется в двух вариантах монтажа - для плат стандартного формата Arduino, и для плат формата Nano. Немонтируемые в той или иной версии разъемы высылаются вместе с платой для возможного последующего монтажа.


Конструктивно модуль представляет из себя расширитель портов MCP23x17 и подключенные к нему две буферные микросхемы ULN2803.
Характеристики модуля в плане коммутации нагрузки определяются характеристиками микросхемы ULN2803, представленными в документации производителяпросмотр. Рекомендуем обратится к ней, если необходимо управление мощной нагрузкой. В документации описаны ограничения на максимальную рассеиваемую мощность, рассмотрена возможность параллельной работы каналов.
Принципиальная схема по лицензии Creative Commons Attribution-ShareAlike 2.5
Подключение нагрузки
Модуль спроектирован под два различных варианта силовых микросхем (модификации модуля A и B). В настоящий момент доступны только модули с микросхемами ULN2803 (модификация A). Схема подключения для модификации A показана на рисунке ниже.
Источник питания коммутируемой нагрузки подключаетя к клеммникам J1 и J2. Положительный вывод источника питания нагрузки подключается к выводу P1 клеммника (левый со стороны подключения), а отрицательный (земля) - к выводу P2 (правый со стороны подключения).
Это может быть как один, так и два различных источника питания - каждый для своей группы из 8 силовых выходов. Отрицательные выводы источников питания будут соединены друг с другом, и с выводом Gnd платы Arduino. Если плата Arduino питается от внешнего достаточно мощного блока питания, он же может использоваться и для питания коммутируемой нагрузки.
Нагрузка подключается между положительным выводом источника питания, и одним из восьми выводов силовой микросхемы, обозначенных цифрами 0-7. В качестве положительного вывода можно использовать площадку, обозначенную P1.
На рисунке приведен пример подключения нагрузки (это могут быть три реле, например), управляемой по выводам 4, 5 и 7.

Конфигурирование модуля
Конфигурирование модуля производится с помощью групп перемычек Addr_bits, JSS, JRS, а также DIP-переключателя.
При установке в модуль микросхемы MCP23S17 обмен данными осуществляется по шине SPI, и движки 1-4 DIP-переключателя должны быть выставлены в положение ON (включено), движки 5-8 - выключено. Перемычкой JSS необходимо выбрать номер вывода Slave Select - 10, 9 либо 8.
При установке в модуль микросхемы MCP23017 обмен данными осуществляется по шине I2C, и движки 1-4 DIP-переключателя должны быть выставлены в положение выключено, движки 5 и 6 - ON (включено), движки 7 и 8, включающие подтяжку шины, в необходимое по условиям работы (при одном I2C устройстве на шине - в положение ON). Перемычка JSS должна быть снята совсем, либо установлена в соответствии с рисунком.
Адрес устройства на шине задается в обоих случаях с помощью перемычек Addr_bits.
Группа перемычек JRS задает варианты работы цепи сброса. Нормальное состояние приведено на рисунке, а положения перемычек и внешних цепей для нестандартных режимов работы могут быть получены из анализа принципиальной схемы модуля.

Библиотека MCP23xxx
Для упрощения работы с этим, и рядом других модулей, разработана библиотека MCP23xxx, предоставляющая простой интерфейс к функционалу микросхем серии MCP23xxx. Библиотека доступна для свободного скачивания: http://www.freeduino.ru/arduino/files/MCP23xxx.zip Библиотека совместима с ПО Arduino версии 1.0.5 (также предполагается совместимость и с более поздними версиями).
Фактически, это набор из двух библиотек: MCP23xxx и LiquidCrystal_MCP23x17.
Более подробно установка библиотек описана в разделе подключение библиотек. Структура каталогов папки libraries после установки должна стать такой:
/libraries/LiquidCrystal_MCP23x17
/libraries/MCP23xxx
В библиотеке MCP23xxx реализованы шаблоны классов, организующие работу с расширителями портов MCP23017, MCP23S17, MCP23008 и MCP23S08. Библиотека LiquidCrystal_MCP23x17 - это модифицированная стандартная библиотека LiquidCrystal, поддерживающая русский язык, и работающая через расширитель портов.
К библиотеке прилагаются примеры, поясняющие работу с ней. Также доступна для скачивания предыдущая версия библиотеки: http://www.freeduino.ru/arduino/files/MCP23x17.zip
Пример работы с модулем
Для коммутации нагрузки достаточно менять состояние выводов микросхемы MCP23x17 с помощью метода digitalWrite, предварительно переключив их в режим выхода с помощью метода pinMode, как в предлагаемом примере.
//#include <SPI.h>
//Для I2C версии подключаем Wire.h:
#include <Wire.h>
//подключаем библиотеку
#include <MCP23xxx.h>
////Для SPI версии создаем объект класса CMCP23S17:
//CMCP23S17 MCP;
//Для I2C версии создаем объект класса CMCP23017:
CMCP23017 MCP;
//но не инициализируем объект, т.к. шина не готова
void setup()
{
// //Для SPI версии конфигурируем шину SPI и объект MCP номером линии CS (10) и адресом (0)
// SPI.begin();
// MCP.init(10, 0);
//Для I2C версии конфигурируем шину I2C и объект MCP адресом (0)
Wire.begin(); //TWBR = 12; // <- так можно сделать 400kHz I2C
MCP.init(0);
//Все выводы чипа нужно сделать выходами либо в цикле
for (int i=0; i<16; i++) {
MCP.pinMode(i, OUTPUT);
}
//или за один раз, вызовом метод pinMode16
//MCP.pinMode16(0x00000);
}
void loop()
{
int i;
//Последовательно включаем и отключаем выводы микросхемы MCP с помощью digitalWrite
//соответственно состояниям выводов будет переключаться нагрузка
for (i=0; i<16; i++) {
MCP.digitalWrite(i, HIGH);
delay(1000);
MCP.digitalWrite(i, LOW);
}
}