В прошлой статье мы рассмотрели программирование микроконтроллера 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.