В прошлой статье мы рассмотрели программирование микроконтроллера ESP32, распаянных на материнской плате Lavritech V7.1 Lite компонентов (Ethernet интерфейса, LoRa модуля и т. д.) и внутренних подключаемых модулей, в этой статье мы разберём программирование внешних Wiren Board блоков на DIN-рейку.
В ассортименте Wiren Board имеется огромное количество таких блоков на все случае жизни и изначально они рассчитаны на работу с «родными» Wiren Board контроллерами, хотя ничто не мешает использовать их и в связке с каким-то другим контроллером.
До появления Lavritech V7.1 Lite не существовало сторонних решений прямо рассчитанных на подключение и использование Wiren Board блоков, но теперь мы можем пользоваться всем этим богатством в своих проектах на ESP32.
Осталось только разобраться как программировать Wiren Board блоки отдельно от Wiren Board контроллеров…
❯ Пещера Алладина
Wiren Board разработала для своей экосистемы множество дополнительных блоков на DIN-рейку. Фактически, там присутствует полный ассортимент блоков, которые могут понадобиться домашнему или профессиональному автоматизатору для решения своих задач. Блоки эти хорошего качества, выпускаются давно и имеют отработанную и проверенную временем и множеством инсталляций схемотехнику.
Другими словами, на рынке есть развитая экосистема строительных блоков для автоматизации, которую мы можем использовать в своих проектах со своими (не Wiren Board) контроллерами. До последнего времени не существовало сторонних решений, прямо рассчитанных на подключение и использование Wiren Board блоков, и требовалось создавать какие-то переходники для подключения таких блоков к сторонним контроллерам.
Теперь появился Lavritech V7.1 Lite, который штатным образом рассчитан на подключение и работу с Wiren Board блоками (и внутренними модулями) — мы можем просто выбирать нужные нам блоки из каталога Wiren Board и использовать их в своих проектах.
На мой взгляд это просто здорово — набрал нужную конфигурацию, залил прошивку и ввёл контроллер в строй.
Из всего богатства внешних подключаемых Wiren Board блоков на DIN-рейку в моём распоряжении оказались три популярных модели, это:
WIRENBOARD WBIO-DI-WD-14 (14 универсальных дискретных входов)
WIRENBOARD WBIO-AI-DV-12/4-20mA (12 аналоговых входов 4-20 мА)
WIRENBOARD WBIO-DO-R10A-8 (8 релейных выходов 7 A)
Далее мы и разберём их устройство, назначение и примеры их программирования. Поняв основные принципы работы с этими блоками, вы сможете выбирать и использовать в своих проектах различные модели таких блоков из обширного каталога Wiren Board (а также, возможно, и других производителей).
❯ Общие принципы подключения
Для начала давайте разберём общие принципы подключения Wiren Board блоков к контроллерам, в нашем случае к контроллеру Lavritech V7.1 Lite.
Как вы помните из предыдущих статей, эти блоки стыкуются к контроллеру и между собой при помощи 10-контактного разъёма. Это стандартный Wiren Board разъём и все такие блоки совместимы с ним, то есть их можно не боясь (что-то «замкнуть») стыковать друг с другом на DIN-рейке.
На фото ниже вы можете видеть межблочный Wiren Board разъём на правой боковой стенке контроллера Lavritech V7.1 Lite.
На материнской плате этот разъём выглядит следующим образом:
Распиновка разъёма предельно простая, он содержит линии земли и питания (3,3 и 5 В), линии I2C интерфейса и сигнала прерывания.
Отдельно выведены 4 адресные линии. Эти пины задают адрес конкретного блока в цепочке подключённых модулей на DIN-рейке. Адрес задаётся тем или иным сочетанием потенциалов («0» или «1») на адресных пинах.
Сама система адресации компанией Wiren Board не раскрывается и о ней мы можем судить только косвенно — по результатам собственных экспериментов и слухам от «бывалых» пользователей экосистемы Wiren Board.
Насколько удалось установить, адресные линии внутри каждого блока «закручиваются» (меняют порядок соединений во входном и выходном разъёмах), тем самым обеспечивая автоматическую адресацию (идентификацию) до 4-х блоков каждого типа на линии. Отсюда ограничения в официальной документации на подключение до 4-х блоков одного типа в цепочке (и прочие ограничения).
В практическом плане, подобная система адресации переводит проблему идентификации отдельных блоков в цепочке на уровень программной реализации и требует от программиста понимания соответствующей проблематики.
Примечание. (Забавным) следствием подобной системы является то, что один и тот же блок Wiren Board будет иметь разные I2C адреса в зависимости от его физического расположения в цепочке блоков на DIN-рейке.
Ниже представлен наглядный пример подключения блока Wiren Board WBIO-DO-R10A-8 к материнской плате Lavritech V7.1 Lite.
С основными принципами подключения Wiren Board блоков к контроллерам всё понятно, далее переходим к разбору работы с конкретными моделями блоков.
❯ Распиновка
Приведу распиновку Lavritech V7.1 Lite. В контексте подключения внешних блоков на DIN-рейку, из всего этого разнообразия нас интересуют только пины I2C интерфейса SCL (32) и SDA (33).
❯ Блок Wiren Board WBIO-DI-WD-14
Блок Wiren Board WBIO-DI-WD-14 — это модуль на DIN-рейку с 14-ю универсальными дискретными входами, шириной 2U. Может использоваться для получения данных от различных датчиков, контактов и т. п.
На крышке корпуса приведены типовые варианты использования входов, а на сайте производителя есть документация, подробно описывающая характеристики этого блока.
Цитата. Предназначен для подключения импульсных счетчиков, кнопок, датчиков с выходом «сухой контакт», ввода дискретных сигналов, контроля целостности цепи. Содержит 14 универсальных входов типа «сухой контакт» и определения наличия низкого напряжения с групповой гальванической развязкой. Режим работы зависит от выбранной схемы подключения.
Поскольку с техникой мы на «ты», то разбираем блок, добираемся до печатной платы и выясняем, что WBIO-DI-WD-14 построен на популярной микросхеме I2C расширителя портов MCP23017, что делает всё остальное делом техники — найти соответствующую Arduino библиотеку и подключить этот блок к Lavritech V7.1 Lite не составляет никаких проблем.
Нам также понадобится вспомогательная библиотека Adafruit_BusIO.
Подключаем кнопку к 1-у входу (и контакту iGND), далее в скетче определяем пины I2C интерфейса платы Lavritech V7.1 Lite и задаём адрес I2C блока.
I2C адрес блока (методом подбора) определяем из диапазона 0x20-0x27 или запускаем I2C сканер и получаем нужный нам текущий адрес WBIO-DI-WD-14 на шине. Те же же самые манипуляции с адресом можно реализовать в готовой прошивке — можно либо дать возможность пользователю задавать конкретный адрес блока или в автоматическом режиме сканировать I2C шину и программно определять подключённые блоки.
Тестовый скетч:
/*
Wiren Board WBIO-DI-WD-14 test (Lavritech V7.1 Lite)
I2C MCP23017
*/
#include <Adafruit_MCP23X17.h>
#define I2C_SDA 33
#define I2C_SCL 32
#define I2C_ADR 0x27
#define BUTTON_PIN 0 // button is attached to MCP23017 pin
Adafruit_MCP23X17 mcp;
void setup() {
Serial.begin(115200);
Serial.println(F("MCP23017 DI test starting..."));
Wire.begin(I2C_SDA, I2C_SCL);
if (!mcp.begin_I2C(I2C_ADR)) {
Serial.println(F("Error"));
while(true);
}
mcp.pinMode(BUTTON_PIN, INPUT);
}
void loop() {
Serial.print(F("Button ")); Serial.print(BUTTON_PIN);
if (mcp.digitalRead(BUTTON_PIN)) {
Serial.println(" Pressed");
} else {
Serial.println(" not Pressed");
}
delay(1000);
}
Проверяем работу скетча и убеждаемся, что всё работает так, как надо. Как я уже заметил, всё остальное — дело техники. В готовой прошивке можно реализовать любую логику работы с 14-ю входными сигналами блока Wiren Board WBIO-DI-WD-14.
Теперь переходим к работе с аналоговыми входами.
❯ Блок Wiren Board WBIO-AI-DV-12/4-20mA
Блок Wiren Board WBIO-AI-DV-12/4-20mA — это модуль на DIN-рейку с 12-ю аналоговыми входами (4-20 мА), шириной 3U.
Назначение блока очевидно из его названия, цитата с официального сайта:
12 однополярных входов 4-20 мА, групповая гальваническая развязка. Предназначен для измерения аналоговых сигналов 4-20 мА. Типичное применение модуля — получение данных с датчиков с токовым выходом: термометры, датчики давления и т. д.
Схема подключения токового датчика к WBIO-AI-DV-12/4-20mA с сайта производителя:
Отжимаем четыре защёлки (кстати, разбирается всё достаточно легко), снимаем нижнюю крышку блока и видим нижнюю сторону печатной платы WBIO-AI-DV-12/4-20mA.
Вынимаем плату из корпуса, достаём лупу и находим 3 микросхемы ADS1115, которые и обеспечивают работу 12-и аналоговых входов (3 микросхемы по 4 линии на каждую).
ADS1115 — это многоканальный 16-битный АЦП с I2C интерфейсом. Поскольку на плате находится сразу 3 таких чипа, то и на I2C шине они видятся как 3 устройства с разными I2C адресами. С этим связаны и специфические ограничения, о которых говорится на официальном сайте, цитата:
В отличие от других устройств, WBIO-AI-DV-12/4-20 мА можно подключать только один, но зато можно подключать девятым модулем в линейке боковых модулей, в дополнение к обычным восьми. При этом, для правильной адресации, не стоит ставить его между модулями одного типа, т. е. он должен занимать первую, пятую или девятую позицию.
(«Особенно мне понравились первая, пятая или девятая революции...» © классика)
Теперь, вооружившись полученными (сакральными) знаниями мы можем создать скетч и интегрировать блок WBIO-AI-DV-12/4-20 мА в свою систему (прошивку). Нужно только не забыть подключить нужную библиотеку Adafruit_ADS1X15.
Задаём I2C адрес (0x48) первой микросхемы ADS1115, подключаем тестовый датчик к первому аналоговому входу блока WBIO-AI-DV-12/4-20 мА и запускаем скетч в работу.
/*
Wiren Board WBIO-AI-DV-12/4-20mA test (Lavritech V7.1 Lite)
I2C ADS1115
*/
#include <Adafruit_ADS1X15.h>
#define I2C_SDA 33
#define I2C_SCL 32
#define I2C_ADR0 0x48
#define I2C_ADR1 0x49
#define I2C_ADR2 0x4A
Adafruit_ADS1115 ads; // 16-bit version
void setup() {
Serial.begin(115200);
Serial.println(F("ADS1115 test starting..."));
Wire.begin(I2C_SDA, I2C_SCL);
if (!ads.begin(I2C_ADR0)) {
Serial.println(F("Error"));
while(true);
}
}
void loop() {
int16_t adc0, adc1, adc2, adc3;
float volts0, volts1, volts2, volts3;
adc0 = ads.readADC_SingleEnded(0);
adc1 = ads.readADC_SingleEnded(1);
adc2 = ads.readADC_SingleEnded(2);
adc3 = ads.readADC_SingleEnded(3);
volts0 = ads.computeVolts(adc0);
volts1 = ads.computeVolts(adc1);
volts2 = ads.computeVolts(adc2);
volts3 = ads.computeVolts(adc3);
Serial.print("AIN0: "); Serial.print(adc0); Serial.print(" ("); Serial.print(volts0); Serial.println("V)");
Serial.print("AIN1: "); Serial.print(adc1); Serial.print(" ("); Serial.print(volts1); Serial.println("V)");
Serial.print("AIN2: "); Serial.print(adc2); Serial.print(" ("); Serial.print(volts2); Serial.println("V)");
Serial.print("AIN3: "); Serial.print(adc3); Serial.print(" ("); Serial.print(volts3); Serial.println("V)");
Serial.println();
delay(5000);
}
И снова всё работает как надо и так, как и ожидалось — блок Wiren Board WBIO-AI-DV-12/4-20 мА полностью в нашей власти и мы можем делать с ним всё, что захотим в своей системе.
Ну и для полноты картины далее попробуем подключить к нашей системе не только входы, но и выходные реле.
❯ Блок Wiren Board WBIO-DO-R10A-8
Блок Wiren Board WBIO-DO-R10A-8 — это модуль на DIN-рейку с 8-ю релейными выходами (7 A), шириной 3U. Самоидентификация модуля с сайта производителя:
Предназначен для прямого управления маломощной нагрузкой (до 7А) без больших пусковых токов: сигнальные лампы, промежуточные контакторы. Не подходит для коммутации блоков питания и светодиодных ламп.
Ну что ж, как говорится «скромно, но со вкусом». Без лишних церемоний снимаем верхнюю крышку и вскрываем сам блок WBIO-DO-R10A-8.
Внутри всё ожидаемо, немного покопавшись в начинке, выясняем, что общением с контроллером занимается микросхема I2C расширителя портов MCP23008, а в управлении реле ей помогает матрица транзисторов Дарлингтона ULN2803.
Поскольку MCP23008 — это родная сестра ранее рассмотренной микросхемы MCP23017, то и для работы с ней подходит та же библиотека Adafruit-MCP23017.
Создаём скетч и щёлкаем реле как хотим, в своё удовольствие.
/*
Wiren Board WBIO-DO-R10A-8 test (Lavritech V7.1 Lite)
I2C MCP23008
*/
#include <Adafruit_MCP23X08.h>
#define I2C_SDA 33
#define I2C_SCL 32
#define I2C_ADR 0x20
#define RELAY_PIN 0 // Relay attached to MCP23008 pin
#define PERIOD 5000
Adafruit_MCP23X08 mcp;
void setup() {
Serial.begin(115200);
Serial.println(F("MCP23008 DO test starting..."));
Wire.begin(I2C_SDA, I2C_SCL);
if (!mcp.begin_I2C(I2C_ADR)) {
Serial.println(F("Error"));
while(true);
}
mcp.pinMode(RELAY_PIN, OUTPUT);
}
void loop() {
Serial.println(F("ON"));
mcp.digitalWrite(RELAY_PIN, HIGH);
delay(PERIOD);
Serial.println(F("OFF"));
mcp.digitalWrite(RELAY_PIN, LOW);
delay(PERIOD);
}
Дублируем включение и выключение реле выводом соответствующих строк в Serial.
На этом заканчиваем разбор подключения типовых блоков Wiren Board к контроллеру Lavritech V7.1 Lite, из приведённых примеров вам должны быть понятны принципы интеграции Wiren Board блоков в свои проекты.
❯ Заключение
Как оказалось, подключение к контроллеру и программирование Wiren Board блоков на DIN-рейку (ассортимент которых очень широк) — это простое и полезное дело — можно с лёгкостью расширить базовый функционал как Lavritech V7.1 Lite, так и любого другого контроллера, благо для интеграции нужно соединить всего несколько линий питания и GPIO.
Комментарии (7)
akirsanov
11.11.2022 11:21Прикручивал WBIO-DI-WD-14 к малинке zero по официальной распиновке к i2c, модуль надежный и недорогой, в моем случае это было отличным способом получить гальванически изолированные сухие контакты без "дребезга". Софтово все работает и под питоном через пакет adafruit-circuitpython-mcp230xx
serafims
11.11.2022 15:42Не получилось в итоге сделать таблицу истинности выходных сигналов на линиях адресов относительно входных?
smart_alex Автор
11.11.2022 16:21Насколько я понял, они "закручиваются" на единицу, а базовый номер у каждого типа модулей - свой.
progchip666
Ароматизаторы без сомнения по достоинству оценят данный продукт, особенно домашние ароматизаторы!
smart_alex Автор
Спасибо, поправил. И ведь два раза вычитывал текст...
progchip666
Обычно принято в личных сообщениях об описках сообщать, но ваша была уж очень смешная, сорри не смог удержаться.
smart_alex Автор
Ничего страшного, эта автоподстановка меня уже не первый раз подводит - нужно внимательнее вычитывать каждое слово.