Любите ли вы 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 pinout
Arduino Nano pinout

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

#include <pu2clr_pcf8574.h>
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. Как работает реле с этим устройством - на видео.

Комментарии (19)


  1. REPISOT
    20.01.2022 06:11
    +3

    I2C все же не предназначена для связи с внешними устройствами по длинным линиям. В основном используется в пределах одной платы.


    1. alexraven Автор
      20.01.2022 07:15

      Я вообще изначально хотел отказаться от проводов, но у меня не было под рукой коробочки, в которой бы поместился блок реле. Провод не очень-то и длинный, около 50 см. Пишут, что до метра проблем быть не должно.


      1. Nstuzealot
        20.01.2022 07:48
        -1

        Мой рекорд длины линии I2C - 8 метров. Датчик SHT30D подключен к raspberry pi 4 через мультиплексор даже на такой длине линии работает стабильно.


        1. melodictsk
          20.01.2022 11:20

          Зависит от скорости шины. На малых скоростях по витухе работает на очень далеко.


      1. m0tral
        20.01.2022 12:07
        +2

        О сколько открытий новых будет, когда узнаете что ещё есть и CAN, тоже 2 провода)) а бывает и 1)


  1. mc2
    20.01.2022 06:31
    +2

    +100 за тему.

    Эх, были бы такие игрушки в наше время)))

    Благодаря Arduino mega "руками" осмыслил как работает калькулятор.


  1. usa_habro_user
    20.01.2022 08:31
    +2

    Любите ли вы I²C так же, как люблю я? 

    А просто "помигать светодиодом ардуиной" не пробовали? Возможно, хорошая тема для статьи "Любите ли вы LED так же, как люблю я?"

    В чём "поинт" "любви" к достаточно медленному протоколу последовательного обмена 40-летней давности? В простоте имплементации (реализованной для всего, что только возможно)? Ну, да, просто, но "любовь"...

    Или вы только что открыли для себя этот протокол (которому "сто лет в обед")? Ну, тогда понятно :D


    1. unsignedchar
      20.01.2022 09:12
      +1

      Как ни странно, нормальных туториалов я так и не нашел

      Странно. Прямо нигде не написано, как соединить 3 провода и задать адрес перемычками?


      1. alexraven Автор
        20.01.2022 13:37
        -1

        Вот нашел туториал, правда уже после написания статьи https://robotchip.ru/upravlenie-vosmi-kanalnym-rele-po-i2c/


    1. alexraven Автор
      20.01.2022 13:36

      Поэтому в самом начале статьи я написал, что это туториал для новичков. Потому что знал, что найдутся умники, утверждающие, что подключить блок реле по i2c умеют все ))


      1. unsignedchar
        20.01.2022 13:44
        +2

        подключить блок реле по i2c умеют все


        А в чем подвох? ;) Ну, сложнее чем blink встроенным светодиодом. Ну, руководство с картинками про именно ваше реле нужно, наверное, поискать. А так, 3 провода + скетч из ардуиновских примеров.


        1. alexraven Автор
          20.01.2022 19:46
          -1

          А подвох в том, что многие новички даже не догадываются, что блок реле можно подключить по i2c.


          1. sav13
            20.01.2022 20:29

            Наверное потому что 8 реле к ардуино нано можно подключить и без I2C )))


            1. alexraven Автор
              20.01.2022 21:00

              Да можно, конечно. Но иногда возникает необходимость подключить еще что-то кроме реле.


              1. RTFM13
                20.01.2022 21:12
                +2

                А тут и начинается самое интересное.

                Как во время обмена с I2C устройством поставить на паузу обмен и сделать что-то еще. Как производить обмен данными асинхронно не останавливая выполнение программы на время обмена, в том числе без аппаратного контроллера I2C. Как продолжить выполнение программы если периферийное устройство намертво завесило шину. И т.д. и т.п.

                С описанием этих нюансов с примерами потянуло бы на статью.


                1. alexraven Автор
                  21.01.2022 01:57

                  Это как раз материал для следующей статьи. Опишу создание системы автоматического полива с использованием блока реле.


          1. VT100
            20.01.2022 22:13

            I2C — внутриприборный интерфейс для некритичных (телек) устройств. В промавтоматике — ему не место, особенно — на "9 yards 8 метров".


          1. unsignedchar
            20.01.2022 22:59

            многие новички даже не догадываются


            Просвещать новичков, наверное, лучше как-то более системно.


      1. DmitryVS
        20.01.2022 23:01
        +1

        Это, извините, не туториал, а больше на набор вредных советов смахивает. От таких "обучалок", в том числе, у некоторых глазик дёргаться начинает при словах об Ардуине и её "сообществе".

        Проблема в том, что Вы описали как соединить три не самых выдающихся образца электроники проводами и "подрыгать ножками" из IDE, но не пишете, а как это собственно работает. Работать-то оно будет, но на письменном столе и недолго. А в "дикой природе"; передаю по буквам; это решение не выживет. "Ардуинщикам" такое невдомёк, они ж по "тьюториалу всё соединили", и любой шаг в сторону приводит к воплям, а-а-а спаситя-памягитя!!! За это их не любят, в основном.

        Что плохо. Про железки. Вы тут пишите про конкретные модули не делая никаких обобщений, так что ругать я буду тоже конкретно это.

        Китайский релейный блок - гавно. Реле с намёком на "силовую нагрузку" Вы не сможете так использовать. Т.к. на плате нет снабберных цепочек, у реле контакты быстро погорят с хорошей вероятностью. Опторазвязка - это фикция при общем питании на обе стороны. Накойхер эта схема вообще такая китайцы скромно умалчивают. Ну и в эти винтовые клеммы я поостерёгся бы заводить какие-нибудь прилично нагруженные 1.5 мм2.

        Китайский расширитель портов - гавно. На нём нет конденсаторов по питанию, зато наглухо распаяны резисторы подтяжки шины. В реальных условиях будут проблемы с самопроизвольным переключением GPIO и зависаниями шины. Ещё возможны чудеса с обменом, когда Вы повесите гирлянду подобных "модулей" и кто-то на шине в конце концов офигеет тягать связку из n-цати подтяжек.

        Что делать? Собрать из этих какашек модель шоколадного торта, порадоваться, что получилось, разобрать и сделать годные платы под свой проект самому. Никогда не ставить никакие китайские "модули для Ардуино" ни в какие боевые решения.

        Про содержание. Как уже заметили, "вот же ж круто, а зачем"? Если пишите для новичков, то такие вещи указываются в первую очередь: что мы будем делать и какую проблему мы этим решим. Опять же, если для новичков, то надо бы было объяснить, а как вообще эта шина работает на аппаратном уровне? Что такое подтяжка уровня и зачем она? Сколько может быть мастеров, сколько слейвов, как у них арбитраж устроен? Сколько слейвов может быть в теории (не 64 это точно, это я Вам, как большому любителю I2C, намекаю), а сколько на реальной физической шине? С чем связано ограничение (электрическая емкость портов и линии, напряжение питания, сопротивление подтяжки)? Как решить проблему большого числа слейвов и длинных линий (буферы I2C)?

        Про PCF8574 тоже молчок, хотя и там не всё так просто. У неё квази-двунаправленный GPIO порт со "слабой подтяжкой" к высокому уровню. Что это за зверь новичку невдомёк. Вот он посадит какую-нибудь нагрузку порта на землю, чтобы, значит, она логической единицей включалась "как на Ардуине тыщу раз делал", а она не заработет. Имеет полное право.

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