Любите ли вы I²C так же, как люблю я? Поистине, гениальное изобретение - можно подключить до 64 устройств всего по двум проводам (не считая питания). Сегодня статья - туториал для новичков. Мы будем подключать готовый блок реле из 8 штук, израсходовав всего два пина. Как ни странно, нормальных туториалов я так и не нашел, в том числе в англоязычном сегменте. Постараюсь восполнить этот пробел.
Реле уже имеют всю необходимую обвязку и могут управляться напрямую цифровыми выходами. Но наша задача - подключить их по I²C. Как и в прошлой моей статье про USB клавиатуру (https://habr.com/ru/post/645109/), я взял I²C расширитель портов ввода-вывода на микросхеме PCF8574. Она имеет 8 портов (P0 - P7) и один пин прерывания, который мы в данном случае использовать не будем. Соединить модуль реле и модуль PCF8574 очень просто - паяем IN1 - IN8 к P0 - P7, соответственно. Очень удобно припаять модуль прямо на пины блока реле. Можно для удобства сюда же припаять кабель с разъемом. Я взял "витую пару" и разъем DIN-5. Блок реле пролежал у меня в коробке на антресоли лет 7, поэтому слегка запылился. Большим плюсом данного блока есть наличие светодиодов, сигнализирующих о включении реле.
К Arduino Nano подключаем A4 > SDA, A5 > SCL. Ну и соответственно, питание.
Обращение к устройству 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)
mc2
20.01.2022 06:31+2+100 за тему.
Эх, были бы такие игрушки в наше время)))
Благодаря Arduino mega "руками" осмыслил как работает калькулятор.
usa_habro_user
20.01.2022 08:31+2Любите ли вы I²C так же, как люблю я?
А просто "помигать светодиодом ардуиной" не пробовали? Возможно, хорошая тема для статьи "Любите ли вы LED так же, как люблю я?"
В чём "поинт" "любви" к достаточно медленному протоколу последовательного обмена 40-летней давности? В простоте имплементации (реализованной для всего, что только возможно)? Ну, да, просто, но "любовь"...
Или вы только что открыли для себя этот протокол (которому "сто лет в обед")? Ну, тогда понятно :D
unsignedchar
20.01.2022 09:12+1Как ни странно, нормальных туториалов я так и не нашел
Странно. Прямо нигде не написано, как соединить 3 провода и задать адрес перемычками?
alexraven Автор
20.01.2022 13:37-1Вот нашел туториал, правда уже после написания статьи https://robotchip.ru/upravlenie-vosmi-kanalnym-rele-po-i2c/
alexraven Автор
20.01.2022 13:36Поэтому в самом начале статьи я написал, что это туториал для новичков. Потому что знал, что найдутся умники, утверждающие, что подключить блок реле по i2c умеют все ))
unsignedchar
20.01.2022 13:44+2подключить блок реле по i2c умеют все
А в чем подвох? ;) Ну, сложнее чем blink встроенным светодиодом. Ну, руководство с картинками про именно ваше реле нужно, наверное, поискать. А так, 3 провода + скетч из ардуиновских примеров.alexraven Автор
20.01.2022 19:46-1А подвох в том, что многие новички даже не догадываются, что блок реле можно подключить по i2c.
sav13
20.01.2022 20:29Наверное потому что 8 реле к ардуино нано можно подключить и без I2C )))
alexraven Автор
20.01.2022 21:00Да можно, конечно. Но иногда возникает необходимость подключить еще что-то кроме реле.
RTFM13
20.01.2022 21:12+2А тут и начинается самое интересное.
Как во время обмена с I2C устройством поставить на паузу обмен и сделать что-то еще. Как производить обмен данными асинхронно не останавливая выполнение программы на время обмена, в том числе без аппаратного контроллера I2C. Как продолжить выполнение программы если периферийное устройство намертво завесило шину. И т.д. и т.п.
С описанием этих нюансов с примерами потянуло бы на статью.
alexraven Автор
21.01.2022 01:57Это как раз материал для следующей статьи. Опишу создание системы автоматического полива с использованием блока реле.
VT100
20.01.2022 22:13I2C — внутриприборный интерфейс для некритичных (телек) устройств. В промавтоматике — ему не место, особенно — на "
9 yards8 метров".
unsignedchar
20.01.2022 22:59многие новички даже не догадываются
Просвещать новичков, наверное, лучше как-то более системно.
DmitryVS
20.01.2022 23:01+1Это, извините, не туториал, а больше на набор вредных советов смахивает. От таких "обучалок", в том числе, у некоторых глазик дёргаться начинает при словах об Ардуине и её "сообществе".
Проблема в том, что Вы описали как соединить три не самых выдающихся образца электроники проводами и "подрыгать ножками" из IDE, но не пишете, а как это собственно работает. Работать-то оно будет, но на письменном столе и недолго. А в "дикой природе"; передаю по буквам; это решение не выживет. "Ардуинщикам" такое невдомёк, они ж по "тьюториалу всё соединили", и любой шаг в сторону приводит к воплям, а-а-а спаситя-памягитя!!! За это их не любят, в основном.
Что плохо. Про железки. Вы тут пишите про конкретные модули не делая никаких обобщений, так что ругать я буду тоже конкретно это.
Китайский релейный блок - гавно. Реле с намёком на "силовую нагрузку" Вы не сможете так использовать. Т.к. на плате нет снабберных цепочек, у реле контакты быстро погорят с хорошей вероятностью. Опторазвязка - это фикция при общем питании на обе стороны. Накойхер эта схема вообще такая китайцы скромно умалчивают. Ну и в эти винтовые клеммы я поостерёгся бы заводить какие-нибудь прилично нагруженные 1.5 мм2.
Китайский расширитель портов - гавно. На нём нет конденсаторов по питанию, зато наглухо распаяны резисторы подтяжки шины. В реальных условиях будут проблемы с самопроизвольным переключением GPIO и зависаниями шины. Ещё возможны чудеса с обменом, когда Вы повесите гирлянду подобных "модулей" и кто-то на шине в конце концов офигеет тягать связку из n-цати подтяжек.
Что делать? Собрать из этих какашек модель шоколадного торта, порадоваться, что получилось, разобрать и сделать годные платы под свой проект самому. Никогда не ставить никакие китайские "модули для Ардуино" ни в какие боевые решения.
Про содержание. Как уже заметили, "вот же ж круто, а зачем"? Если пишите для новичков, то такие вещи указываются в первую очередь: что мы будем делать и какую проблему мы этим решим. Опять же, если для новичков, то надо бы было объяснить, а как вообще эта шина работает на аппаратном уровне? Что такое подтяжка уровня и зачем она? Сколько может быть мастеров, сколько слейвов, как у них арбитраж устроен? Сколько слейвов может быть в теории (не 64 это точно, это я Вам, как большому любителю I2C, намекаю), а сколько на реальной физической шине? С чем связано ограничение (электрическая емкость портов и линии, напряжение питания, сопротивление подтяжки)? Как решить проблему большого числа слейвов и длинных линий (буферы I2C)?
Про PCF8574 тоже молчок, хотя и там не всё так просто. У неё квази-двунаправленный GPIO порт со "слабой подтяжкой" к высокому уровню. Что это за зверь новичку невдомёк. Вот он посадит какую-нибудь нагрузку порта на землю, чтобы, значит, она логической единицей включалась "как на Ардуине тыщу раз делал", а она не заработет. Имеет полное право.
Про программные нюансы уже написали. Повторяться не буду. Общий посыл один: обучалка должна обучать пониманию того, что ты делаешь, зачем и почему, а не попугайскому втыканию проводков и копипасте скетчей.
REPISOT
I2C все же не предназначена для связи с внешними устройствами по длинным линиям. В основном используется в пределах одной платы.
alexraven Автор
Я вообще изначально хотел отказаться от проводов, но у меня не было под рукой коробочки, в которой бы поместился блок реле. Провод не очень-то и длинный, около 50 см. Пишут, что до метра проблем быть не должно.
Nstuzealot
Мой рекорд длины линии I2C - 8 метров. Датчик SHT30D подключен к raspberry pi 4 через мультиплексор даже на такой длине линии работает стабильно.
melodictsk
Зависит от скорости шины. На малых скоростях по витухе работает на очень далеко.
m0tral
О сколько открытий новых будет, когда узнаете что ещё есть и CAN, тоже 2 провода)) а бывает и 1)