KC868-A128: заявка на Книгу рекордов Гиннеса

4z0bikyrxct7ijk9-m4ul6dokku.jpeg

Сегодня мы поговорим о решении, достойном помещения в Книгу рекордов Гиннеса — это контроллер 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 в проектах, где нужно получать данные со множества входов и управлять множеством исполнительных устройств.

fpi1exnnj3n93tgu7lo9jhoozf8.jpeg
KC868-A128 в собранном виде, готовый для установки на DIN-рейку (осталось только найти соответствующий щиток)

Подключаемые блоки реле


В KC868-A128 используются транзисторные (MOSFET) выходы, которые могут управлять не только реле, но и прочим оборудованием, например, электромагнитными клапанами. Если же требуется управлять именно реле, то в этом случае нужно подключить внешние блоки, например, блок Kincony KC868-E16 или аналогичный от другого производителя.

hod0hri6eptkmufiby4h_5kpwlq.jpeg
Дополнительный блок реле Kincony KC868-E16

Поскольку KC868-A128 имеет 128 выходов, то для полного их использования понадобятся 8 блоков KC868-E16, или нужно искать блоки на большее количество реле, например 32, 64 и т. д. (если таковые имеются в продаже).

Внешний вид и конструкция


KC868-A128 комплектуется специальным нарезным профилем для установки и крепления на DIN-рейку. Всё разбирается и разбирается довольно просто — достаточно выкрутить несколько шурупов по краям этого профиля и «выдвинуть» вбок плату контроллера.

k04l0e_inff4mzr1qhwwrlxkodq.jpeg

В связи большим числом цифровых входов и управляющих выходов, все элементы не поместились на верхней стороне платы. Обратная сторона утыкана оптопарами и мосфетами в невероятном количестве, мне лично это чем-то напоминает построение полков на военном параде.

efqx44dfldcssrf_0byyltwdtvg.jpeg

Схемотехника


В этом разделе я не буду приводить тотальное описание всех подсистем контроллера KC868-A128 (Kincony в своих изделиях использует типовые решения, которые я многократно описывал в предыдущих статьях), разберу только некоторые из них, характерные и специфичные для рассматриваемой модели.

Для начала вид платы сверху. 80% платы занято входами/выходами, а оставшиеся 20% — всем остальным содержимым контроллера.

jtblmoxlvn07jjqwmowdr2fiwsg.jpeg

Обратная сторона платы во всей красе. Интересно, а последует ли выпуск KC868-A256 и какие размеры в этом случае будет иметь контроллер?

qwupvhnfvas9mbhwrh64jd5w9y8.jpeg

Цифровые входы


Контроллер имеет 128 цифровых оптоизолированных входов «сухой контакт» на оптронах EL357, распределённых на 16 колодок по 8 контактов. Для обеспечения их работы в связке с ESP32 в KC868-A128 применены расширители цифровых входов/выходов c I2C интерфейсом на 8-и микросхемах PCF8575TS.

gd6_kmh33uzmvbjhtvsfitjq5vk.jpeg

Принципиальная схема подсистемы цифровых входов. Для наглядности и чтобы не загромождать схему показан только один из 16-и блоков оптронов, остальные полностью ему аналогичны. Расширители портов на PCF8575TS показаны все 8 штук. Обслуживает цифровые входы один из двух I2C интерфейсов (I2C №2).

dj5wioz0pxdvuh1hnpzvttgbw48.png

Отдельно схема колодок для подключения цифровых опторазвязанных входов «сухой контакт». Каждая колодка имеет по два контакта GND (для замыкания).

1vabe0d3ywr4ok9gm_qh_iu_aro.png

MOSFET выходы


Ещё одна большая подсистема контроллера KC868-A128, взаимодействие которой с микроконтроллером ESP32 осуществляется при помощи 8-и расширителей входов/выходов c I2C интерфейсом PCF8575TS. Далее управляющие сигналы поступают на оптопары TLP181, которые в свою очередь управляют 128-ю мосфетами NCE40P05Y (40В/5,3А).

Здесь же присутствуют индикаторные светодиоды, по свечению которых можно определить текущее состояние выходов контроллера KC868-A128.

mfou37sj6jxlx7lkl2vfwukllyk.jpeg

Принципиальная схема подсистемы MOSFET выходов. На схеме показан только один из 16-и MOSFET блоков (остальные полностью ему аналогичны). Управление выходами осуществляется посредством I2C интерфейса (I2C №1).

i0_haxwb1berarw3ckypl3qvqbs.png

Отдельно схема колодок для подключения MOSFET выходов. Каждая колодка имеет контакт для подключения питающего напряжения 12/24 В.

fkh-7vnxf_j7lx4tpvbnyucnr18.png

Разъёмы I2C


Два очень полезных для подключения различных дополнительных компонентов разъёма I2C. К ним можно подключить, например, дисплей, дополнительные сенсоры и прочие элементы. Причём, обратите внимание, в эти разъёмы выведены разные интерфейсы (I2C №1 и I2C №2).

lj1fbbo3-dvunh_pw2rmujyy0ho.jpeg

Принципиальная схема подсистемы (разъёмов) I2C:

2r0hicp3xfbgds9pms0amv2xogm.png

Serial разъём


Не менее полезное дополнение — к этому разъёму можно подключить много интересного оборудования, использующего Serial интерфейс для приёма и передачи данных.

nnbxqdggyn5rp-pzw53ipkwunqc.jpeg

Принципиальная схема подсистемы (разъёма) Serial:

sv2w7byvt7mnqnbggi2hr4iojqs.png

Распиновка


Распиновка KC868-A128. Исчерпывающая информация по тому, что и как подключено к микроконтроллеру ESP32 на плате KC868-A128.

xfplxk-ffu6nzkk3qrw-harcq4g.png

Схема внешних подключений


Оригинальная схема разъёмов и внешних подключений контроллера KC868-A128 от производителя. Тут можно наглядно увидеть все места расположения и распиновки разъёмов.

tbvtvb6ytlmrbds7yoqrwadyhny.jpeg

Программирование


Теперь разберём несколько примеров программирования 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-й вход замкнут на землю).

rfp6v6h-foehkn5bz2odaijimj4.png

Поражает воображение наглядная визуализация количества цифровых входов: каждая строка — это 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.

sshzarqbkebjbafxierguyxoobo.png

Заключение


Теперь, когда вам понадобится в каком-то проекте получать данные с сотни с лишним датчиков и управлять сотней с лишним актуаторов, вы знаете, что нужно делать (смайл). Мне же в KC868–128 больше всего нравится простота программирования — можно с лёгкостью как угодно запрограммировать KC868–128 как на управление оборудованием, так и на коммуникации по различным протоколам с вашей IoT системой автоматизации.

p-u9l27ynelxi92bcmdxhu76ma8.png

© Habrahabr.ru