Очередной "Умный дом", на этот раз модульная система...

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Не совсем мое дело) Но если вы любознательный и есть время вот есть очень грамотная статья по поводу этих интерфейсов https://2662255.ru/can-rs485/

Я к чему просто я когда свои модули разрабатывал я тоже смотрел в сторону CAN и в итоге отказался и там очень много аргументов) Поэтому и заострил на этом внимание. CAN классная вещь но как по мне не для домашней автоматики и скорость у него меньше даже чем у RS но не намного. Это просто модификация как юы протокола и там много мусора для задачи домашней автоматики. А так в целом кто че хочет делает))) любой уровень будет работать что нисший самый хоть самый высокий. Но в целом я остановился на таких аргументах как скорость, помехазащищеность так как в моей квартире линии идут рядом с силовыми все + много потребителей мощных и главное это простота и дешивезна. Если поможет в целом то был рад стараться.

MaksVV
Offline
Зарегистрирован: 06.08.2015

CAN более скоростной я имел ввиду, потому что арбитраж аппаратный и не нужно дожидаться пока мастер опросит. А так скорость шины да, наверное  одинаковая примерно, при прочих равных. CAN разгоняется до 1 Мбит при определённых условиях, а про RS485 таких скоростей не слышал. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

из той статьи которую вы привели складывается ощущение, что автор ещё бОльший дилетант чем я. Например: "С другой стороны, есть еще один параметр – максимальное количество тревог, которое может обработать система в секунду. Этот параметр у CAN хуже – ведь каждая тревога должна быть не только передана, но и должна сначала поучаствовать в процессе арбитража."

Давайте представим can систему из 10 датчиков , которые сработали почти одновременно и 11-й типа следящий МК, да что представлять, я на столе такое собирал. Дак вот следящий МК получает сообщения от всех CAN датчиков за 100мс, при этом разница во времени между соседними сообщениями соответсвенно 10мс. скорость шины 100кбит/с. По моим примерным подсчетам на такой скорости максимально это 800 сообщений в секунду (1,5 байта заголовок+8 байт инфы). 

Интересно посмотреть на реализацию данной простой задачи на базе RS485.

Можно и другие части статьи легко опровергнуть. Я не защищаю CAN. У самого уже были куплены 20 модулей RS485, но программировать оказалось легче на CAN при использовании библиотеки. Поэтому выбрал его. и не жалею. Негатива пока не встретил не одного, чего не скажешь о RIV, у него, да, есть какие то косяки с протоколом. Но у меня вся система проще гораздо, пока 3 МК насчитывает. 

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Что мог сказал))) В остальном я бессилен. Как говорится все интерфейсы хороши, но каждый в своей сфере как говорится. У меня у самого используется не только RS))) просто я КИПовец) и есть опыт работы с интерфейсами. Моя задача была как я сказал Вас не отговорить а просто осветить со всех сторон этото вопрос.

MaksVV
Offline
Зарегистрирован: 06.08.2015

MaksVV пишет:

взялся посадить на плату основной МК в моей модульной системе. А то так и работает на "соплях" уже три года. 

такие были сопли, мега-волосянка. нет ничего более постоянного, чем...

 

это моя самая большая в жизни плата 200 на 200. 

травить пришлось в тазике, другой посудины найти не смог: 

готово

Купил стопицот пинхидеров, просверлил стопицот отверстий, запаял стопицот перемычек, даже отходов не было от резисторов и кондёров, всё в дело пошло)

получилась такая почти материнская плата аля микро атх socket ARD2018:

LCD, счётчик PZEM, кан модуль MCP закрепил на винты с гайками, хорошо получилось. 

и слава тебе Господи, всё заработало, сразу!!! Бывает же такое.

Я доволен. Осталось всё в ящик сложить и провода подключить. 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

MaksVV пишет:

Пока одна шина, соответственно здесь один MCP2515. Просто стандарт CAN шины звездой не позволяет топологию делать, я так понял. 

Я не пробовал, но видел скан патента, где  CAN как раз звездой разведен. Ну и, в любом случае, в две стороны можно лучи пустить не выходя за рамки стандарта. Другое дело что на шину не надо адское количество устройств навешивать. В DeviceNet, например, существует ограничение условного MAC - 6 бит.

sadman41
Offline
Зарегистрирован: 19.10.2016

Seltvik пишет:

Это не совсем правда) у меня все на шине 485 и включение моментальное 1 сек и то если учесть что через ESP еще передача на сервер валит))) Просто крупные производители автоматики промышленной и домашней не с проста выбрали данный интерейс) 

Если использовать 485-й, то транспортный уровень нужно самому на МК пилить, а в CAN уже все готово - МК за ногу дернули, он из буфера читанул пакет и голова у программиста не болит насчет проверки целостности, перезапроса данных и т.д.

MaksVV
Offline
Зарегистрирован: 06.08.2015

+100. людям, которые действительно попользовали кан, уже будет лень применять rs485. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

sadman41 пишет:

Я не пробовал, но видел скан патента, где  CAN как раз звездой разведен. Ну и, в любом случае, в две стороны можно лучи пустить не выходя за рамки стандарта. Другое дело что на шину не надо адское количество устройств навешивать. В DeviceNet, например, существует ограничение условного MAC - 6 бит.

да я тоже думаю, что всё будет работать, причём стабильно. Но на всякий случай развел плату на три модуля, вдруг меня растащит))

riv
Offline
Зарегистрирован: 20.07.2017

MaksVV пишет:

sadman41 пишет:

Я не пробовал, но видел скан патента, где  CAN как раз звездой разведен. Ну и, в любом случае, в две стороны можно лучи пустить не выходя за рамки стандарта. Другое дело что на шину не надо адское количество устройств навешивать. В DeviceNet, например, существует ограничение условного MAC - 6 бит.

да я тоже думаю, что всё будет работать, причём стабильно. Но на всякий случай развел плату на три модуля, вдруг меня растащит))

Вот тут человек продумал как решить вопрос звезды на CAN

https://demid.net/product/разветвитель-шины-can-8-портов/

Думаю надо попробовать.

riv
Offline
Зарегистрирован: 20.07.2017

В общем накропал тут библиотеку как обещал. https://github.com/graynet-dev/aHomeBus2

Она в свою очередь основана на https://github.com/adlerweb/asysbus

А та на iSysBus Patrick Amrhein, www.isysbus.org.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Riv , и что с этой твоей библиотекой модули уже не глючат по CAN, не отваливаются? Значит программный косяк был? 

riv
Offline
Зарегистрирован: 20.07.2017

Глючили не модули, проблема в звезде на Can. Вот и буду ее решать концентратором CAN.

Причем у меня на работе с той же проблемой столкнулись. Т.е. переполнение буферов ошибок и контроллер перестает отвечать на софт ресет. Только полный сброс.

riv
Offline
Зарегистрирован: 20.07.2017

А библиотека полностью скрывает от программиста работу с CAN  и пр. шинами. 

demid.net
Offline
Зарегистрирован: 02.12.2019

Всем привет.

Я автор этого безобразия, на которое дали ссылку чуть выше. Рисовал долго :) Работает прикольно. Делался для себя.

Как-то тут резко обсуждение прервалось... мне кажется нужно продолжить, ибо тема хорошая, интересная. Да и у меня по ней есть наработки.

Коротко о себе: Александр, без двух недель 40 лет, 3 детей, 2 диплома программиста, с МК начал знакомство года 4 назад и не с Arduino а с PIC16-18. Потом STM32. В основном пишу все в Mikroc. Умею и C#. Кое-как автоматизировал дачу. Могу что угодно включить/выключить удаленно, выставить нужную температуру по этажам. 12 датчиков раскиданы повсюду. От улицы до земли (ввод воды). Отопление самодельными канальными нагреваттелями в вентиляции. Температура в доме поддерживается +/-0.25 градуса. Но душа хочет именно умного дома а не пульта от него.

На сегодня у меня наколбашено 13 блоков с разным назначением. Около 30 готовых к работе железок. Проект в виде хобби, вялотекущий, но уже работающий. Блоки естественно с CAN-шиной. Протокол польностью свой - это ложка дегтя.

Для Arduino тоже пишу, но без энтузиазма. Не то чтобы я противник, просто у них больше ограничений в угоду универсальности. Буду рад чем-то помочь и не откажусь от помощи.

MaksVV
Offline
Зарегистрирован: 06.08.2015

а ктонибудь пробовал CAN на 10...50кБит/c запускать? вроде нужны особые трансиверы. Думаю, что с такой скоростью пофиг на звёздность шины. 

demid.net
Offline
Зарегистрирован: 02.12.2019

Пробовал. Ничего интересного. Просто маленькая скорость. Что-то тут явно не так. CAN у меня заводится практически в любых условиях.

Я сегодня прочел все 23 страницы в этой ветке и кажется мне что проблемы не в звездности.

1) MCP2515 на китайской платке тактируется от 8МГц (Мегабит с этой штукой не получить априори, ну да фиг с ним), а SPI вы к ней инициализируете на 10МГц - в чем тайный смысл и как это по-вашему должно работать - не понятно. Тем более 10Мгц по проводкам а не разводкой на плате.

2) Не увидел ни одного скриншота с программой Canculator. Сдается мне что выставления только скорости CAN для MCP2515 не достаточно. Нужно проверять что там в библиотеке с SJW, BRP и прочими PHSEG.

3) Не увидел ни одного скриншота с осциллографа.

4) Есть вопрос по резистору у MCP2551 от RS на GND. Какой там номинал чтоб выставлять хотя бы 125кбит/с

MaksVV
Offline
Зарегистрирован: 06.08.2015

demid.net пишет:
Пробовал. Ничего интересного. Просто маленькая скорость. Что-то тут явно не так. CAN у меня заводится практически в любых условиях.

а как тогда появился концентратор? На малых скоростях какой трансивер применял? Низкая скорость должна быть интересна тем, что, по идее, сеть при этом менее требовательна к топологии и качеству кабеля. Конечно это мнение дилетанта, просто имхо. 

PS. у меня тоже проблем с CAN сетью не было, но я узлов ещё много не навешивал, всего 3 пока. Работает как всем известный автомат.

riv
Offline
Зарегистрирован: 20.07.2017

А у меня 20 узлов, сеть древовидная. И узлы накопив ошибки выпадают.

Специально написал код который позволяют через esp8266 дать команду на ресет CAN и ничего не работает. Только аппаратный сброс.

riv
Offline
Зарегистрирован: 20.07.2017

Вот примерно так

void CAN_test (){
  if (Serial.available()>0){
    byte inByte;
    inByte = Serial.read () - '0';
    if (inByte == 0) {ahbCan0.mcp2515_reset(); Serial.println("Pres 0");}
    else if (inByte == 1) {ahbCan0.begin();  Serial.println("Pres 1");}
    else if (inByte == 2) while(1);
     else if (inByte == 3) {
           byte data1[2] = {50,1};
            ahb0.ahbSend(AHB_PKGTYPE_UNICAST, 167, 100, 0, ahb0._nodeId,  sizeof(data1), data1);
      }
    //else if (inByte == 4) ;
    //else if (inByte == 5) ;
    //else if (inByte == 8) ;
    //else if (inByte == 9) ;
  }   
}

 

 

 

demid.net
Offline
Зарегистрирован: 02.12.2019

MaksVV пишет:

а как тогда появился концентратор? На малых скоростях какой трансивер применял? Низкая скорость должна быть интересна тем, что, по идее, сеть при этом менее требовательна к топологии и качеству кабеля. Конечно это мнение дилетанта, просто имхо. 

Концентратор появился после постройки гаража... 6*8м с лабораторией на втором этаже. Чисто (психо)логичкски это другая сеть, которую надо подключить к основной. Сначала был собран повторитель 50x32мм односторонний без перемычек... CAN+CANSPI

и в принципе на этом можно было закрыть вопрос. Но и после добавления блоков сложно придерживаться шинной топологии.

Тот же MCP2551.

А в плане скорости я ставил 10кбит/с чисто для проверки. Меньше не позволяет USBtinViewer софтина usb-can переходника. Я использую перерисованный под себя usbtin. Не люблю перемычки :)

 

Для себя я принял, что снижать скорость буду только при невозможности обработать поток пакетов. И скорее всего от 250кбит, которые есть сейчас, рано или поздно провалюсь в 125 а может и ниже. Просто тут обратная зависимость. Лучше чтобы код умел переваривать такой поток, иначе это халтура а не программа.

CAN это не только скорость, но еще куча параметров передачи, настройки которых я тут не увидел. Может дело в библиотеке ардуины с ее "по-умолчанию" ? Потому как инициализация CAN_SPI выглядит несколько сложнее.

MaksVV
Offline
Зарегистрирован: 06.08.2015

riv пишет:

А у меня 20 узлов, сеть древовидная. И узлы накопив ошибки выпадают.

Специально написал код который позволяют через esp8266 дать команду на ресет CAN и ничего не работает. Только аппаратный сброс.

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

Мое имхо, если перепаять на китайских модулях все дерьмовые tja1050 на MCP2551 , и за одно и кварцы на 16Мгц, поставить скорость 100 кбит/с  то проблема возможно ликвидируется. Ну или ставить предложенный концентратор.

Мне проще витухи накидать, не выходя за шинную топологию. Кидая компьютерную витуху на очередной контроллер, по одной паре шина туда уходит, по другой возвращается и можно её дальше кидать на следующий. Концентратор у меня получается это чисто монтажные соединения проводов CAN. 

demid.net
Offline
Зарегистрирован: 02.12.2019

MaksVV пишет:

Мне проще витухи накидать, не выходя за шинную топологию. Кидая компьютерную витуху на очередной контроллер, по одной паре шина туда уходит, по другой возвращается и можно её дальше кидать на следующий. Концентратор у меня получается это чисто монтажные соединения проводов CAN. 

С точки зрения CAN - это нормальная идея, а с точки зрения подачи питания - зло. Именно CAN кабель стоит каких-то неимоверных денег. Типа 400р/м - это перебор, имхо.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Питание у меня по жилам витухи не идёт. Везде кидаю вместе с витухой лапшу. по лапше 220В от Компьютерного UPS. На каждом МК свой БП AC-DC. Не знаю насколько такой подход правильный, но не парюсь по падению напряжения и толщине питающих проводов. 

riv
Offline
Зарегистрирован: 20.07.2017

Опасное это дело, с сигнальными цепями 220В кидать. Так до беды не далеко. + Решишь картину прибить а про кабель забыл. Питающие все по СНИП кладутся. Вертикально  и пр. А слаботочка обычно как придется.

Мне обычного ноутбучного блока питания типа такого http://ntb74.ru/?product=b-p-dlya-noutbuka-3q-ch120-meu08n-120w хватает на всю сеть без потерь. Не забывай про вилку напряжений на регуляторах.

Но это только мое имхо.

riv
Offline
Зарегистрирован: 20.07.2017

demid.net пишет:

Пробовал. Ничего интересного. Просто маленькая скорость. Что-то тут явно не так. CAN у меня заводится практически в любых условиях.

Я сегодня прочел все 23 страницы в этой ветке и кажется мне что проблемы не в звездности.

1) MCP2515 на китайской платке тактируется от 8МГц (Мегабит с этой штукой не получить априори, ну да фиг с ним), а SPI вы к ней инициализируете на 10МГц - в чем тайный смысл и как это по-вашему должно работать - не понятно. Тем более 10Мгц по проводкам а не разводкой на плате.

2) Не увидел ни одного скриншота с программой Canculator. Сдается мне что выставления только скорости CAN для MCP2515 не достаточно. Нужно проверять что там в библиотеке с SJW, BRP и прочими PHSEG.

3) Не увидел ни одного скриншота с осциллографа.

4) Есть вопрос по резистору у MCP2551 от RS на GND. Какой там номинал чтоб выставлять хотя бы 125кбит/с

В наших проектах мы используем библиотеку https://github.com/coryjfowler/MCP_CAN_lib

Там есть MCP2515Calc.xlsx

riv
Offline
Зарегистрирован: 20.07.2017

По поводу звезды. Вот что пишут производители железа использующие CAN.

Ответвления от основной “линии” длиной до 3 м — допустимы. Общая длина проводов не должна превышать 500 м.

Если “звезды” не избежать, то можно использовать следующую схему.

Так как обычно используется кабель с 4-мя витыми парами, можно использовать одну из них для прохода сигнала “туда”, а вторую для прохода сигнала “обратно”.

Таким образом, можно сохранить линейную топологию даже при физически проложенном кабеле “звездой”.

Видимо проблемы как у Ethernet со 100 метрами на 100 Мб. 

Так что попробую CAN HUB от demid.net  и если не пойдет буду вытягивать звезду в шину как написано выше.

P.S.

У меня от центрального щита звезда во все помещения это по 10-15 м. не меньше по кабелю, а в некоторых помещениях ответвления еще по 5-7 метров.

Я включал логи и как раз наблюдал большое количество ошибок.

MaksVV
Offline
Зарегистрирован: 06.08.2015

делай топологию в шину, надёжнее имхо. А че наша городьба (я имею ввиду скетч) не попёрла? я так старался)))

riv
Offline
Зарегистрирован: 20.07.2017

Твоя работа, на самом деле очень важна. Она позволила отладить концепцию. Каюсь не вписал тебя в соавторы. Обязательно это исправлю. Если посмотришь библиотеку то там все явно прослеживается.

MaksVV
Offline
Зарегистрирован: 06.08.2015

мда, почитал, и вооооообще ничего не понял, хотя я, оказывается, соавтор О_О.    Видимо библиотека для очень узкого круга людей. Слишком сложно всё. Те кто способен это всё понять, чужим трудом вряд ли будут пользоваться, им проще своё наваять. 

riv
Offline
Зарегистрирован: 20.07.2017

На самом деле все просто

Это адреса в сети CAN

uint8_t can_addr_net[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,77,78};

Это Modbus

uint8_t modbus_rtu_addr_net[] = {100,101,102,103};

Объявляем тип узла

AHB ahb0(5,Master);

Объявляем
AHB_CAN ahbCan0(52, CAN_500KBPS, MCP_16MHZ , 2,can_addr_net, size_can_addr_net);
AHB_MODBUS_RTU ahbModBusRtu0(0,1,10,modbus_rtu_addr_net, size_modbus_rtu_addr_net);

Ну там еще мелочи в сетапе

И все

Так отправляешь сообщение
ahb0.ahbSend(AHB_PKGTYPE_UNICAST, 167, 100, 0, ahb0._nodeId,  sizeof(data1), data1);

Так принимаешь

ahbPacket pkg = ahb0.loop();
  Serial.print(msg_num3);
    Serial.print(F(" - Type: 0x"));
    Serial.print(pkg.meta.type);
    Serial.print(F(" - CMD: 0x"));
    Serial.print(pkg.meta.cmd);    
    Serial.print(F("  Target: 0x"));
    Serial.print(pkg.meta.target);
    Serial.print(F("  Port: 0x"));
    Serial.print(pkg.meta.port);
    Serial.print(F("  Source: 0x"));
    Serial.print(pkg.meta.source);
    Serial.print(F("  Length: 0x"));
    Serial.print(pkg.len);
    for(byte i=0; i<pkg.len; i++) {
      Serial.print(F(" 0x"));
      Serial.print(pkg.data[i]);
    }

Все остальное от пользователя спрятано, поддержка сети, Web интерфейс, маршрутизация

Честно говоря выкладывать пока не планировал, пока еще в начале пути. Воспринимай как мой черновик. Я просто github использую как хранилище своего кода. Пока только для отладки.

На выходе должно быть как обещались раньше. Как в библиотеке CAN, которая от тебя скрывает контроллер. Наша либа скрывает протокол. Все те фишки которые мы городили спрячутся в библиотеку. А дальше пиши логику работы модуля и говори что на какой адрес кидать. Как работает сеть от тебя скрыто.

riv
Offline
Зарегистрирован: 20.07.2017

Так же реализовал маршрутизацию между сетями.

У меня есть например контроллер фанкойла у него Modbus, который я использую как экран, термостат и реле для управления радиатора, включением кондея и вентиляцией. Так вот его можно опросить с соседнего контроллера просто по адресу 100. https://ru.aliexpress.com/item/4000189402896.html?spm=a2g0v.12010612.8148356.4.40f3265aYyv0iM

MaksVV
Offline
Зарегистрирован: 06.08.2015

а где настройка , что должно быть на узле? конфигурация тобишь. Мое видение такое, идеально было бы написать программу на компе которая будет конфигурировать узел по юсб, какие датчики у него и т.д.