Arduino UARTS Автоматическая адресация ведомых устройств

Я использую эту последовательную топологию для подключения своих ведомых устройств Act ATmega328p (Arduino) к ведущему ESP32.

Всего 10 подчиненных устройств ATmega328p и один ведущий:

последовательная топология

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

Чтобы решить проблему "динамической адресации", я думаю об этом:

Первые ведомые устройства будут подключены и отправят ведущему его адрес по умолчанию (например: 0xFF) Мастер проверит, используется ли адрес, а затем ответит устройству с первым доступным адресом (например: 0x01). Ведомый получит ответ от ведущего и установит внутреннюю переменную с новым адресом (возможно, будет хорошей идеей сохранить переменную в EEPROM, например M24C02: введите здесь описание ссылки) Начиная со следующего цикла ЦП, мастер будет последовательно запрашивать у всех перечисленных ведомых устройств (например) выполнить аналоговое чтение, используя этот рабочий процесс:

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

Новая идея и концепция

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

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

Это может быть хорошим (и динамичным) методом решения проблемы, о том, как я могу реализовать это последовательное включение питания?

, 👍3

Обсуждение

Я бы, наверное, решил проблему с помощью шины I2C. Каждое ведомое устройство I2C будет иметь внешние входы для определения уникального адреса. Для 30 устройств вам потребуется 5 входных контактов на каждой плате STM для определения адреса. Возможно, это не то, что вы ищете, поэтому посмотрите на мое второе предложение. Вторым решением может быть использование шины SPI, где ESP32 будет связываться с устройствами с помощью сигнала выбора микросхемы (CS, SS). Проблему с отсутствием пинов на мастер-комплекте разработки (ESP32) я бы решил, например, с помощью расширителя I2C., @JSC

Я забыл упомянуть, что ваше решение, в отличие от моего, нестандартно., @JSC

Я знаю человека, это нестандартное решение, но у меня есть ограничение: от ESP32 до подчиненных клиентов у меня может быть только 4-проводной кабель: Vcc, gnd, RX и TX., @Symon

В этом случае вы все равно можете использовать I2C., @JSC

Как? Пожалуйста, приведите пример: мне нужна динамическая адресация ведомых устройств, и я не могу разместить на печатной плате DIP-переключатели., @Symon

Вы не упомянули, что не можете использовать DIP-переключатели или перемычки или другие внешние сигналы на платах STM. Без внешних сигналов (на СТМ), конечно, стандартным способом не решить..., @JSC

Да, моя вина, в любом случае... спасибо, чувак :), @Symon


1 ответ


Лучший ответ:

5

Первые подчиненные устройства будут подключены и отправят мастеру свои адрес по умолчанию

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

Я предлагаю очень небольшую вариацию вашей схемы. У каждого раба есть адрес по умолчанию (0xff). При включении ничего не говорит. Рабы говорят только тогда, когда к ним обращаются.

Время от времени мастер отправляет сообщение «ping» на 0xff. Недавно установленный слейв отвечает, тогда мастер дает ему реальный адрес, и возвращается к своей работе по сбору данных датчиков. Если нет ответа полученный за пинг в течение некоторого заданного тайм-аута, мастер предполагает нет ненастроенного подчиненного устройства.

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

,

Спасибо Эдгар, ваш ответ именно то, что я искал! Я буду реализовывать так, у меня осталось два вопроса: 1.) как я могу реализовать код «ping» и управлять динамической адресацией, можете ли вы привести пример в своем посте? 2.) Вы думаете, что «условное» включение ведомых устройств (управление MOSFET от gpio для передачи Vcc относительному каскадному ведомому устройству, когда предшествующее ведомое устройство получит адрес) поможет мне избежать включения системы, а затем добавить вручную устройства по одному?, @Symon

Вам, вероятно, придется изобрести свой собственный протокол, в котором каждое сообщение, отправленное мастером, имеет адрес подчиненного устройства, тип сообщения (пинг, настройка нового адреса, запрос данных), возможно, поле данных (указанный адрес) и, возможно, контрольная сумма ., @Edgar Bonet

Да, конечно! Это может быть осуществимо без особых усилий ... единственное сомнение, которое у меня есть, касается последовательного пинга: вы предлагаете использовать такие функции, как последовательная запись и серийный.доступный? Или мне нужно реализовать какой-то тупой цикл, который прослушивает сериал в течение определенного времени?, @Symon

Для реализации тайм-аута вы можете проверить Serial.available() в течение определенного периода времени., @Edgar Bonet

Upvote, этот ответ подтверждает, что я думал!, @Symon

Вы также можете с самого начала позволить главному устройству связываться со всеми возможными подчиненными адресами в необходимом диапазоне. Таким образом, вы можете проверить, какие ведомые устройства уже подключены. Адрес, на который мастер не получает ответа в течение тайм-аута, не подключен., @chrisl

@chrisl: Насколько я понимаю, ОП хочет динамическую адресацию, потому что он не может добавлять DIP-переключатели на печатную плату и не хочет жестко запрограммировать в них адреса., @Edgar Bonet