Сегодня мы поговорим о решении, достойном помещения в Книгу рекордов Гиннеса — это контроллер 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), то нам нужно явным образом указать это в скетче. Тут же указываем адреса (0x24, 0x25, 0x21, 0x22, 0x26, 0x27, 0x20, 0x23) расширителей портов 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 системой автоматизации.
Комментарии (32)
scruff
26.12.2022 12:12Интересно, с помощью данного девайса прописать логику для бензинового двигателя средней навороченности возможно? На входы подать все датчики - ДПКВ, ДПРВ, МАФ, давление, Температуры и т.д. На выходах - катушки зажигания, форсунки, дроссель, фазы. Думаю прикольная вещь для чиптюнинга вышла бы, которую в любой момент можно перепрошить как хочешь, а лучше иметь набор прошивок на все случаи жизни. Проект бомба.
smart_alex Автор
26.12.2022 12:20Прописать можно любую логику. Про автомобильную тематику не очень понял.
smart_pic
26.12.2022 12:24Для авто точно не пойдет, так как идет чтение входов через расширители входов по I2C , причем нужно вычитать все 8 микросхем и потом определить какой именно вход поменял свое состояние. Для авто часть функционала делается на аппаратном уровне в МК.
nikolay666
26.12.2022 15:08Здесь входы/выходы организованы через i2c, скорость чтения/записи будет недостаточной для управления мотором. Да и не нужно там столько входов/выходов.
nafikovr
26.12.2022 14:39а в миллиметрах это сколько? присоединяясь к вышенедоумевающим - а зачем?
smart_alex Автор
26.12.2022 14:51Если вы о длине контроллера, то это 38 см.
nafikovr
26.12.2022 14:53а как с жесткостью девайса учитывая крепление на рейке с двух концов? при закручивании винтов в середине плату не крутит?
smart_alex Автор
26.12.2022 15:14Учитывая габариты девайса, жесткость у него не особенная, например, при манипуляции с центральными колодками плата заметно прогибается.
Субъективно, если руки у пользователя растут из анатомически правильного места, то жесткости платы достаточно для нормальной эксплуатации.
shadrap
26.12.2022 16:09Если я не ошибаюсь частота работы у PCF8575 400 кГц, т.е. сильно шустро управлять выходами не получится (это в плане авто).
smart_pic
26.12.2022 16:14при таком количестве подходящих к устройству проводов и отсутствия корпуса и крышки , шансов что отвалившийся провод попадет в "самое нужное место" и еще под напряжением , составляет все 128% (шутка)
red_dragon
Плохо себе представляю назначение этого девайса, но пусть будет, наверное. А вот "распиновка", нарисованная в электронной таблице, это да. Ни разу до этого не видел.
smart_alex Автор
Ну, всё-таки бывают проекты, которые требуют много входов и выходов.
red_dragon
Пример был бы интересен. Ну и входов здесь не особо много, в вашем девайсе.
vbifkol
Ну хорошо, вот у меня проект на 128 входов. Допустим, я поставил эту .... (сложно нематерное слово подобрать), ну, скажем, штуковину. Подключил, поработало, и внезапно - сжег один вход. Мне дальше снимать всю эту хренацию и ставить на ее место такую же, перекоммутировав 256 контактов? Извините, но модульность придумали не от нищеты. Если у меня в машинке горит один вход, я выкручиваю 8 проводков, снимаю блок входов, ставлю такой же и закручиваю обратно. А тут - ремонтопригодность уровня бог.
smart_alex Автор
Разумный аргумент. А с другой стороны, кто мешает из 128 каналов оставить несколько для резерва?
smart_pic
Ардуино среда программирования где все назначения входов прописываются в коде. Как минимум придется править проект и перекомпилировать.
smart_alex Автор
О чём вы говорите? В Ардуино без проблем можно сделать загрузку конфигурации и даже логики из веб-интерфейса, из конфигурационного файла или хоть из командной строки через Serial или удалённо вынести интерпретатор командной строки в веб-интерфейс.
Да вообще можно сделать как угодно - в этом то и есть вся фишка DIY микроконтроллеров - можно сделать как угодно, как нужно именно вам, и как не пришло в голову сделать никому другому.
vbifkol
если через 5 лет исходники еще будут и будет живой человек, который умеет их загружать.
Я не то что логику не помню того, что делал лет 5 назад - я не всегда сам факт того что я это делал помню. Особенно если делал дома в режиме поделок. На работе под это есть документация, но это не путь ардуинщика.
smart_alex Автор
Во-первых, использование KC868-A128 - это не обязанность, а возможность.
Во вторых, если вам не нравится DIY, то вы можете использовать любые другие решения.
В третьих, ардуинщику никто не мешает задокументировать проект.
nafikovr
В защиту девайса (нет) - через 5 лет и аналогичного девайса на замену не будет. Наверно так себе выбор для долгоживущих вопросов.
smart_alex Автор
Это общая проблема для DIY контроллеров - с уверенностью сказать, что модель будет выпускаться и через 10 лет можно только об Arduino Mega 2560.
Я вижу тут только одно решение - купить дополнительный контроллер в резерв.
Tabke
Ваши сведения устарели. Здесь используется ESP32. Я, к примеру, в своих ардуино-проектах на ESP, храню все настройки в json файлах, которые храняться во внутренней памяти микроконтроллера, а меняю настройки через веб-морду или телеграм-бота.
vbifkol
Хорошо, оставил 5 для резерва. В первый год выгорело 2, во второй - 1, в третий - 2. На четвертый год мы оказываемся в той же ситуации. А 4 года для автоматизации - не срок, у меня машинки по десять лет стоят и еще столько же как минимум стоять будут.
smart_alex Автор
Оставьте 28 для резерва. И почему у вас постоянно что-то горит?
vbifkol
можно и 100 оставить. Только тогда радость 128 портов пропадет.
В курортно-промышленно-торговых городках центральной Сибири электросети неидеальные. Ну и режимы эксплуатации на производстве не домашние. Не горит только то что никуда не включено.
semmaxim
У Вас проект может быть на 100 входов. И вот вам уже в базе 28 "запасных".
smart_alex Автор
И я о том же.