Как определить физическое местоположение в топологии гирляндной цепи/шины RS-485?

Я пытаюсь построить «гирляндную цепочку», используя несколько приемопередатчиков Arduino и MAX485. На всех платах есть датчик температуры. Батарея 9 В питает все платы в цепочке.

Я пытаюсь найти способ определить физическое расположение различных плат в гирляндной цепочке, например, boardA = первая, boardD = вторая, boardB = третья и т. д.

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

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

Я думал измерить падение напряжения/тока как показатель того, насколько близко/далеко они находятся от мастера. Тем не менее, я не уверен, что падение достаточно велико или АЦП в Arduino достаточно точен.

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

Редактировать, 2018-10-14

Больше разъяснений; скажите, что у вас есть следующий пример:

Пример топологии шины

Все ведомые платы установлены в режим «прослушивания» и ждут вызова от ведущего. Мастер запускает цикл запроса, чтобы определить, какие ведомые устройства находятся на шине. Он запрашивает A, B, C, D, E и т. д. Подчиненные устройства проверят вызов ведущего. Чтобы это работало, мне нужно будет присвоить уникальное имя/адрес в программном обеспечении каждому ведомому устройству, что совершенно нормально.

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

Это что-то похожее на Максим DS28EA00 ? Заметьте, меня интересует не только температура. Я использую датчики температуры в качестве доказательства концепции. Я мог бы использовать его для измерения давления, ускорения и т. д.

@Transitor В этом случае гирляндная цепочка = партийная линия или топология шины. Я не знаю, смогу ли я подключить RS-485 последовательно. Если да, могу ли я собирать имя каждого устройства по мере прохождения через них данных? Недостатком этого является то, что если одна ведомая плата выходит из строя, остальная часть линии тоже умирает.

Из руководства по проектированию TI RS-485

Руководство по проектированию TI RS-485

@stark Можете ли вы подробнее рассказать об идее цифровой булавки? Обратите внимание, что все доски разнесены на 1-3 метра.

@Энди, он же Энди, можешь рассказать подробнее? Может ли это работать в шинной топологии?

@TimWescott Это топология шины. Может быть, я неправильно использовал термин гирляндная цепочка? Можно ли сделать настоящую гирляндную цепочку с RS-485?

Пожалуйста, отредактируйте свой вопрос, чтобы объяснить, подключены ли устройства к сети параллельно или последовательно. Если данные проходят через каждое устройство последовательно, то возможна их автоматическая адресация. Если нет, то вам нужно добавить некоторые средства для установки уникального адреса для каждого.
Можно ли использовать цифровые входные контакты? Имейте два разъема на каждой станции. Во-вторых, это жесткое физическое местоположение.
Создайте сигнал, который представляет физическое местоположение; сделать этот сигнал доступным для каждого ведомого устройства; прочитать подчиненные данные; интерпретировать местоположение.
Для меня RS485 подразумевает шину. Это автобус или настоящая гирлянда? (То есть в шине все приемопередатчики подключены к одной и той же паре проводов. В гирляндной цепочке каждый процессор имеет «восходящий» порт и «нисходящий» порт и управляет связью между портами).
(почти серьезно) прикрепите к каждому устройству видеокамеру и штрих-код перед ней. Упростите систему, если вы найдете более простой способ чтения данных из среды, не подверженной ошибкам.
Хе-хе, это будет самое дорогое решение, учитывая, что я хочу иметь 30 ведомых плат ;)
Да, и я забыл упомянуть, что окончательный дизайн будет находиться под водой. Вот почему я хочу сделать это с помощью программного обеспечения или некоторого внутреннего оборудования на плате.
Есть один похожий способ, достаточно дешевый. Но патент находится на рассмотрении, так что мне очень жаль...
Это приятно слышать, но пройдет несколько лет, прежде чем он выйдет на рынок. Мне нужно решение сейчас :)

Ответы (2)

Это автобусная конструкция. По определению не имеет значения, где физически расположено каждое устройство.

Если вам нужна географическая адресация, вы можете попробовать этот подход:

  1. Подключите мастер-узел на одном из концов шины.

  2. Каждый узел должен иметь дополнительный провод (то есть один входной и один выходной провод), который идет к соседним узлам (подойдет простой GPIO).

  3. Когда этот провод имеет определенное состояние (по умолчанию) — узел молчит и игнорирует весь трафик.

  4. При включении каждый узел не имеет адреса. Мастер подключает дополнительный провод к низкому (или высокому) уровню, активируя первый узел на шине. Отправляет команду «установить адрес» на шину (у которой нет адреса назначения) — конечно, только первый узел действует на это сообщение.

  5. Мастер отправляет «линию включения управления» узлу 1 (у которого теперь есть адрес), это заставляет узел 2 прослушивать шину.

  6. Мастер снова отправляет команду «установить адрес» (которая игнорируется узлом 1, потому что у него уже есть адрес), которая устанавливает адрес устройства 2.

  7. Промойте и повторите для всех узлов.

Отличная идея! Никакого дополнительного оборудования, только еще один кабель. 1) Как вы думаете, может ли расстояние между платами быть проблемой для сигнала GPIO? 2) На шаге 5 вы имеете в виду, что мастер сообщает узлу 1 установить для GPIO, подключенного к узлу 2, низкий (или высокий) уровень, а мастер устанавливает высокий (или низкий) уровень в GPIO для узла 1? Снова отличный ответ, я должен попробовать.
1. Если это медленный GPIO, расстояние не должно быть проблемой. Просто позаботьтесь о том, чтобы каким-то образом защитить вход и выход (например, резисторами), потому что в противном случае шум от кабеля может соединиться с вашим Vcc (через встроенные диоды защиты от электростатического разряда). 2. На шаге 5 я имею в виду, что мастер сообщает узлу 1 включить линию управления узла 2, затем настраивает адрес узла 2, затем сообщает узлу 2 включить линию управления узла 3 и т. д. Вы можете реализовать логику различными способами, например . «игнорировать все» или «принять любой адрес».

Ищите 1Wire, если вы заинтересованы в измерении температуры, с множеством датчиков тут и там! https://www.maximintegrated.com/en/app-notes/index.mvp/id/148 Это не RS485, но его проще реализовать. И используйте небольшую программу, чтобы включить каждый узел 1Wire один за другим и прочитать его идентификатор, тогда у вас будет таблица физических идентификаторов по сравнению с логическими, конечно, вы можете сделать то же самое с RS485, но вам потребуется больше проводов! В этом случае у вас должна быть небольшая схема рядом с каждым датчиком, поэтому каждый раз, когда вы включаете свою схему, такая поясняющая таблица строится в мастере.