KC868-A128: заявка на Книгу рекордов Гиннеса
Сегодня мы поговорим о решении, достойном помещения в Книгу рекордов Гиннеса — это контроллер Kincony KC868-A128, имеющий на борту аж 128 цифровых входов и 128 транзисторных (MOSFET) выходов. Как говорится, «раззудись плечо, размахнись рука» — с такими ТТХ KC868-A128 может стать основой весьма нетривиальных проектов.
Обратной стороной таких впечатляющих возможностей является размер контроллера — он переходит все пределы и чем-то напоминает «крыло от Боинга». Это произведение креативной китайской мысли не влезет ни в один «бытовой» щиток, для его размещения нужен либо промышленный щит, либо какой-то отдельный бокс с автоматикой.
Но управляется KC868-A128 при помощи нашего любимого ESP32, что делает его доступным для самостоятельного программирования и включения в ваши DIY проекты по автоматизации. Далее мы подробно рассмотрим устройство KC868-A128 и создадим скетчи для управления всеми его 256-ю входами/выходами.
❯ Kincony KC868-A128
Если продолжить образные аналогии, то Kincony KC868-A128 можно сравнить с океаническим контейнеровозом — большая часть платы занята «контейнерами» (элементами цифровых входов и MOSFET выходов), а сам контроллер («рубка управления» — ESP32, Ethernet и т. д.) скромно примостилась с одного края платы. Тут даже непонятно, что является основной частью, а что — дополнением: то ли входы и выходы дополняют ESP32, то ли ESP32 дополняет входы и выходы.
И даже закрадываются крамольные мысли:, а не стоило ли разделить сам контроллер и гипертрофированный блок входов/выходов на два отдельных устройства, соединённых по интерфейсу I2C, благо на плате KC868-A128 это так и сделано. В этом случае периферийные блоки можно было бы подключать, в зависимости от конкретной задачи, к основному контроллеру. Но это только архитектурные предпочтения, видимо компании Kincony легче снабдить каждый блок входов/выходов встроенным контроллером, чем «мудрить» межконтроллерные разъёмы и интерфейсы.
KC868-A128 содержит:
- Микроконтроллер ESP32 (ESP-WROOM-32E)
- 128 цифровых опторазвязанных входов («сухой контакт»)
- 2 аналоговых входа 0–5 В
- 2 аналоговых входа 4–20 мА
- 128 MOSFET выходов 12/24 В/0,5 А для управления реле и прочим оборудованием
- 128 светодиодов состояний выходов
- Возможность подключения внешних блоков реле KC868-E16 или аналогичных
- Интерфейс RS485
- Два отдельных I2C разъёма
- Отдельный Serial разъём
- Ethernet LAN8270A
- Разъём USB для программирования и заливки прошивок
- Кнопки «Reset» и «Download»
- Питание от 12/24 В постоянного тока
Видно, что KC868-A128 имеет всё необходимое для реализации самых разнообразных проектов по автоматизации, я даже не буду подробно останавливаться на описании всех его подсистем, замечу только, что всё это богатство легко и просто программируется самостоятельно, в моём случае в среде Ардуино (а вы можете это делать в вашей любимой IDE).
Ну и необходимо ещё раз упомянуть основную «фишку» и основную роль KC868-A128 — это 128 цифровых входов и 128 MOSFET выходов, которые предполагают использование KC868-A128 в проектах, где нужно получать данные со множества входов и управлять множеством исполнительных устройств.
KC868-A128 в собранном виде, готовый для установки на DIN-рейку (осталось только найти соответствующий щиток)
❯ Подключаемые блоки реле
В KC868-A128 используются транзисторные (MOSFET) выходы, которые могут управлять не только реле, но и прочим оборудованием, например, электромагнитными клапанами. Если же требуется управлять именно реле, то в этом случае нужно подключить внешние блоки, например, блок Kincony KC868-E16 или аналогичный от другого производителя.
Дополнительный блок реле Kincony KC868-E16
Поскольку KC868-A128 имеет 128 выходов, то для полного их использования понадобятся 8 блоков KC868-E16, или нужно искать блоки на большее количество реле, например 32, 64 и т. д. (если таковые имеются в продаже).
❯ Внешний вид и конструкция
KC868-A128 комплектуется специальным нарезным профилем для установки и крепления на DIN-рейку. Всё разбирается и разбирается довольно просто — достаточно выкрутить несколько шурупов по краям этого профиля и «выдвинуть» вбок плату контроллера.
В связи большим числом цифровых входов и управляющих выходов, все элементы не поместились на верхней стороне платы. Обратная сторона утыкана оптопарами и мосфетами в невероятном количестве, мне лично это чем-то напоминает построение полков на военном параде.
❯ Схемотехника
В этом разделе я не буду приводить тотальное описание всех подсистем контроллера KC868-A128 (Kincony в своих изделиях использует типовые решения, которые я многократно описывал в предыдущих статьях), разберу только некоторые из них, характерные и специфичные для рассматриваемой модели.
Для начала вид платы сверху. 80% платы занято входами/выходами, а оставшиеся 20% — всем остальным содержимым контроллера.
Обратная сторона платы во всей красе. Интересно, а последует ли выпуск KC868-A256 и какие размеры в этом случае будет иметь контроллер?
Цифровые входы
Контроллер имеет 128 цифровых оптоизолированных входов «сухой контакт» на оптронах EL357, распределённых на 16 колодок по 8 контактов. Для обеспечения их работы в связке с ESP32 в KC868-A128 применены расширители цифровых входов/выходов c I2C интерфейсом на 8-и микросхемах PCF8575TS.
Принципиальная схема подсистемы цифровых входов. Для наглядности и чтобы не загромождать схему показан только один из 16-и блоков оптронов, остальные полностью ему аналогичны. Расширители портов на PCF8575TS показаны все 8 штук. Обслуживает цифровые входы один из двух I2C интерфейсов (I2C №2).
Отдельно схема колодок для подключения цифровых опторазвязанных входов «сухой контакт». Каждая колодка имеет по два контакта GND (для замыкания).
MOSFET выходы
Ещё одна большая подсистема контроллера KC868-A128, взаимодействие которой с микроконтроллером ESP32 осуществляется при помощи 8-и расширителей входов/выходов c I2C интерфейсом PCF8575TS. Далее управляющие сигналы поступают на оптопары TLP181, которые в свою очередь управляют 128-ю мосфетами NCE40P05Y (40В/5,3А).
Здесь же присутствуют индикаторные светодиоды, по свечению которых можно определить текущее состояние выходов контроллера KC868-A128.
Принципиальная схема подсистемы MOSFET выходов. На схеме показан только один из 16-и MOSFET блоков (остальные полностью ему аналогичны). Управление выходами осуществляется посредством I2C интерфейса (I2C №1).
Отдельно схема колодок для подключения MOSFET выходов. Каждая колодка имеет контакт для подключения питающего напряжения 12/24 В.
Разъёмы I2C
Два очень полезных для подключения различных дополнительных компонентов разъёма I2C. К ним можно подключить, например, дисплей, дополнительные сенсоры и прочие элементы. Причём, обратите внимание, в эти разъёмы выведены разные интерфейсы (I2C №1 и I2C №2).
Принципиальная схема подсистемы (разъёмов) I2C:
Serial разъём
Не менее полезное дополнение — к этому разъёму можно подключить много интересного оборудования, использующего Serial интерфейс для приёма и передачи данных.
Принципиальная схема подсистемы (разъёма) Serial:
❯ Распиновка
Распиновка KC868-A128. Исчерпывающая информация по тому, что и как подключено к микроконтроллеру ESP32 на плате KC868-A128.
❯ Схема внешних подключений
Оригинальная схема разъёмов и внешних подключений контроллера KC868-A128 от производителя. Тут можно наглядно увидеть все места расположения и распиновки разъёмов.
❯ Программирование
Теперь разберём несколько примеров программирования KC868–128. Поскольку для обслуживания цифровых входов и MOSFET выходов используются микросхемы I2C расширителей портов PCF8575, то для работы с ними нам понадобится соответствующая библиотека PCF8574_library.
Программирование цифровых входов
Для примера создадим скетч получения данных со всех 128 цифровых входов контроллера KC868-A128 и вывода этой информации в Serial. Чтобы понятно было, что наш скетч реально работает, замкнём первый цифровой вход на землю перемычкой — в выходных данных это должно соответствующим образом отражаться.
/*
KC868-A128 DI example
*/
#include "Arduino.h"
#include "PCF8575.h"
#define SDA 15
#define SCL 4
PCF8575 pcf_1(0x24, SDA, SCL);
PCF8575 pcf_2(0x25, SDA, SCL);
PCF8575 pcf_3(0x21, SDA, SCL);
PCF8575 pcf_4(0x22, SDA, SCL);
PCF8575 pcf_5(0x26, SDA, SCL);
PCF8575 pcf_6(0x27, SDA, SCL);
PCF8575 pcf_7(0x20, SDA, SCL);
PCF8575 pcf_8(0x23, SDA, SCL);
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println(F("KC868-128 DI example start..."));
pcf_1.begin();
pcf_2.begin();
pcf_3.begin();
pcf_4.begin();
pcf_5.begin();
pcf_6.begin();
pcf_7.begin();
pcf_8.begin();
for (byte i = 0; i < 16; i++) {
pcf_1.pinMode(i, INPUT);
pcf_2.pinMode(i, INPUT);
pcf_3.pinMode(i, INPUT);
pcf_4.pinMode(i, INPUT);
pcf_5.pinMode(i, INPUT);
pcf_6.pinMode(i, INPUT);
pcf_7.pinMode(i, INPUT);
pcf_8.pinMode(i, INPUT);
}
delay(1000);
}
void loop() {
Serial.println();
for (byte i = 0; i < 16; i++) {Serial.print(pcf_1.digitalRead(i));} Serial.print(' ');
for (byte i = 0; i < 16; i++) {Serial.print(pcf_2.digitalRead(i));} Serial.print(' ');
for (byte i = 0; i < 16; i++) {Serial.print(pcf_3.digitalRead(i));} Serial.print(' ');
for (byte i = 0; i < 16; i++) {Serial.print(pcf_4.digitalRead(i));} Serial.print(' ');
for (byte i = 0; i < 16; i++) {Serial.print(pcf_5.digitalRead(i));} Serial.print(' ');
for (byte i = 0; i < 16; i++) {Serial.print(pcf_6.digitalRead(i));} Serial.print(' ');
for (byte i = 0; i < 16; i++) {Serial.print(pcf_7.digitalRead(i));} Serial.print(' ');
for (byte i = 0; i < 16; i++) {Serial.print(pcf_8.digitalRead(i));} Serial.print(' ');
delay(300);
}
Поскольку на плате KC868–128 интерфейс I2C работает на нестандартных GPIO15 и 4 (I2C №2), то нам нужно явным образом указать это в скетче. Тут же указываем адреса (0×24, 0×25, 0×21, 0×22, 0×26, 0×27, 0×20, 0×23) расширителей портов PCF8575.
#define SDA 15
#define SCL 4
PCF8575 pcf_1(0x24, SDA, SCL);
PCF8575 pcf_2(0x25, SDA, SCL);
PCF8575 pcf_3(0x21, SDA, SCL);
PCF8575 pcf_4(0x22, SDA, SCL);
PCF8575 pcf_5(0x26, SDA, SCL);
PCF8575 pcf_6(0x27, SDA, SCL);
PCF8575 pcf_7(0x20, SDA, SCL);
PCF8575 pcf_8(0x23, SDA, SCL);
Далее инициализируем линии расширителей как входы и в цикле печатаем матрицу состояний всех 128-и цифровых входов KC868–128 (обратите внимание на ноль в первой позиции каждой строки — это 1-й вход замкнут на землю).
Поражает воображение наглядная визуализация количества цифровых входов: каждая строка — это 128 отдельных входов, которые может обслуживать KC868–128. Это вам не 1–2 цифровых входа, как на некоторых других контроллерах (смайл).
Программирование выходов
Теперь давайте попробуем попрограммировать вторую киллер-фишку KC868–128 — это 128 MOSFET выходов. Только представьте себе электрощит, где к контроллеру подключены 128 реле или 128 клапанов.
/*
KC868-A128 DO example
*/
#include "Arduino.h"
#include "PCF8575.h"
#define SDA 5
#define SCL 16
PCF8575 pcf_1(0x24, SDA, SCL);
PCF8575 pcf_2(0x25, SDA, SCL);
PCF8575 pcf_3(0x21, SDA, SCL);
PCF8575 pcf_4(0x22, SDA, SCL);
PCF8575 pcf_5(0x26, SDA, SCL);
PCF8575 pcf_6(0x27, SDA, SCL);
PCF8575 pcf_7(0x20, SDA, SCL);
PCF8575 pcf_8(0x23, SDA, SCL);
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println(F("KC868-128 DO example start..."));
pcf_1.begin();
pcf_2.begin();
pcf_3.begin();
pcf_4.begin();
pcf_5.begin();
pcf_6.begin();
pcf_7.begin();
pcf_8.begin();
for (byte i = 0; i < 16; i++) {
pcf_1.pinMode(i, OUTPUT);
pcf_2.pinMode(i, OUTPUT);
pcf_3.pinMode(i, OUTPUT);
pcf_4.pinMode(i, OUTPUT);
pcf_5.pinMode(i, OUTPUT);
pcf_6.pinMode(i, OUTPUT);
pcf_7.pinMode(i, OUTPUT);
pcf_8.pinMode(i, OUTPUT);
}
delay(1000);
}
void loop() {
Serial.println();
pcf_1.digitalWrite(P0, HIGH); Serial.println(F("OUT1 HIGH"));
delay(3000);
pcf_1.digitalWrite(P0, LOW); Serial.println(F("OUT1 LOW"));
delay(3000);
}
Здесь всё аналогично обслуживанию цифровых входов, только микросхемы PCF8575 подключены к 1-у I2C (GPIO5, 16). Далее инициализируем объекты и конфигурируем линии как выходы.
#define SDA 5
#define SCL 16
PCF8575 pcf_1(0x24, SDA, SCL);
PCF8575 pcf_2(0x25, SDA, SCL);
PCF8575 pcf_3(0x21, SDA, SCL);
PCF8575 pcf_4(0x22, SDA, SCL);
PCF8575 pcf_5(0x26, SDA, SCL);
PCF8575 pcf_6(0x27, SDA, SCL);
PCF8575 pcf_7(0x20, SDA, SCL);
PCF8575 pcf_8(0x23, SDA, SCL);
Затем в цикле манипулируем одним (первым) выходом, включая и выключая его. Аналогичным образом можно управлять любым из 128 выходов, имеющихся на плате KC868–128.
❯ Заключение
Теперь, когда вам понадобится в каком-то проекте получать данные с сотни с лишним датчиков и управлять сотней с лишним актуаторов, вы знаете, что нужно делать (смайл). Мне же в KC868–128 больше всего нравится простота программирования — можно с лёгкостью как угодно запрограммировать KC868–128 как на управление оборудованием, так и на коммуникации по различным протоколам с вашей IoT системой автоматизации.