Подключение блока реле к Arduino по I²C

Любите ли вы I²C так же, как люблю я? Поистине, гениальное изобретение — можно подключить до 64 устройств всего по двум проводам (не считая питания). Сегодня статья — туториал для новичков. Мы будем подключать готовый блок реле из 8 штук, израсходовав всего два пина. Как ни странно, нормальных туториалов я так и не нашел, в том числе в англоязычном сегменте. Постараюсь восполнить этот пробел.

Блок из 8 пятивольтовых реле с опторазвязкойБлок из 8 пятивольтовых реле с опторазвязкойМодуль PCF8574Модуль PCF8574

Реле уже имеют всю необходимую обвязку и могут управляться напрямую цифровыми выходами. Но наша задача — подключить их по I²C. Как и в прошлой моей статье про USB клавиатуру (https://habr.com/ru/post/645109/), я взял I²C расширитель портов ввода-вывода на микросхеме PCF8574. Она имеет 8 портов (P0 — P7) и один пин прерывания, который мы в данном случае использовать не будем. Соединить модуль реле и модуль PCF8574 очень просто — паяем IN1 — IN8 к P0 — P7, соответственно. Очень удобно припаять модуль прямо на пины блока реле. Можно для удобства сюда же припаять кабель с разъемом. Я взял «витую пару» и разъем DIN-5. Блок реле пролежал у меня в коробке на антресоли лет 7, поэтому слегка запылился. Большим плюсом данного блока есть наличие светодиодов, сигнализирующих о включении реле.

Модуль из 8 реле с припаянным PCF8574Модуль из 8 реле с припаянным PCF8574

К Arduino Nano подключаем A4 > SDA, A5 > SCL. Ну и соответственно, питание.

Arduino Nano pinoutArduino Nano pinout

Обращение к устройству I²C происходит по адресу, который можно задать DIP переключателями на плате модуля PCF8574. Когда они все выключены (0 0 0), это соответствует адресу 0×20. Я взял библиотеку PU2CLR — PCF8574 Arduino Library (https://github.com/pu2clr/PCF8574), ее также можно установить через менеджер библиотек Arduino IDE. Следующий скетч будет «перещелкивать» все 8 реле в цикле с задержкой в 1 секунду.

#include 
PCF pcf;
void setup()
{
  // I2C адрес устройства 0x20
  pcf.setup(0x20);
}
void loop()
{
  // перебираем в цикле все 8 реле
  for (int i=0; i<8; i++)
  {
    // включить реле
    pcf.digitalWrite(i,LOW);
    delay(1000);
    // выключить реле
    pcf.digitalWrite(i,HIGH);
  }
}

Бонусом моя коробочка — тестер. Я собрал ее специально для подобных экспериментов. Она состоит из Arduino Nano, LCD экрана 1602 с припаянным модулем… конечно же I²C, энкодера с кнопкой, и «пищалки» (которая умеет только пищать, т.е издавать звук одного тона, просто ради прикола). Двумя нажатиями на ручку энкодера можно, например, узнать адреса всех подключенных I²C устройств, поворотами ручки — переключать порты. Что забавно, вся начинка уместилась в крышке коробочки. В корпусе только разъем DIN-5. Как работает реле с этим устройством — на видео.

© Habrahabr.ru