Плата управления реле I2C от двух Arduino Uno
Как я могу заставить несколько главных устройств Arduino работать с одним устройством I2C? Поскольку оба главных устройства находятся на расстоянии 20 м от подчиненного устройства,
Я использую релейную плату I2C для подключения к двум платам Arduino, необходимо подключить устройство I2C и создать на его основе метод двустороннего переключения.
Любые предложения здесь будут вам очень полезны.
@Nate Pulkar, 👍3
Обсуждение3 ответа
Вам нужно работать в режиме мульти-мастера. Это поддерживаемая конфигурация I2C, однако API Arduino ее не поддерживает.
При этом каждый мастер определяет, произошел ли конфликт, и останавливает передачу, если он произошел, чтобы затем повторить попытку позже.
Аппаратное обеспечение Arduino может это сделать, а программное обеспечение — нет. Вам придется обойти программное обеспечение и самостоятельно управлять интерфейсом I2C (или найти лучшую библиотеку, чем библиотека Wire, которая поддерживает несколько главных устройств).
Эй, а что если вместо Arduino я буду использовать ESP8266 или ESP32? Кроме того, если я выберу Arduino, то любой пакет микросхем будет полезен для достижения такого режима?, @Nate Pulkar
Библиотека Wire
не имеет полной поддержки нескольких мастеров (насколько я помню). Вы можете присоединиться к шине в качестве ведомого и стать ведущим, используя функции ведущего на время этих передач (при выполнении endTransmission()
начинается передача I2C в ведущем стиле. Когда она закончится, библиотека изменится снова стать рабом). Но у вас возникнут проблемы, если два мастера отправят сообщение одновременно.
Протокол I2C включает в себя метод, называемый арбитражем шины. Когда два главных устройства одновременно пишут на шину, тот, кто первым запишет на шину 1
, должен отказаться от передачи и снова стать подчиненным. К сожалению, похоже, что библиотека Wire
этого не реализует.
Таким образом, вы можете не столкнуться с проблемами, пока мастер не отправит сообщения одновременно. В зависимости от того, что также нужно делать Arduino, вы можете выйти из такого состояния, используя сторожевой таймер для сброса обоих мастеров, когда они там застряли.
Или вы пытаетесь найти хорошую библиотеку I2C/TwoWire, которая работает для Arduino и имеет реализованный арбитраж шины.
Примечание: 20 м — довольно большое расстояние для I2C. Он предназначен для коротких расстояний, в основном на одной и той же печатной плате (отсюда он и называется Inter Integrated Circuit, сокращенно IIC или I2C). Возможно, у вас не возникнут проблемы, но вы должны иметь это в виду. Шина будет иметь большую емкость, и вам могут потребоваться мощные подтягивающие резисторы.
Ответы Маженко и Крисла, на мой взгляд, слишком оптимистичны.
Дистанция в 20 метров невозможна. Шина I2C может быть 20 см или 50 см.
Не существует библиотеки, поддерживающей мультимастерную шину для Arduino Uno.
Вам придется сменить проект. Сделайте одну плату Arduino Мастером и позвольте Мастеру получать данные с другой платы, а Мастер записывает на плату реле. Вам нужен автобус, способный преодолевать такое расстояние, или используйте беспроводную связь. У шины RS-485 проблем с 20 метрами нет. У Adafruit есть несколько модулей RFM69, с ними не должно возникнуть проблем с длиной 20 метров.
Существуют чипы, которые преобразуют сигналы шины I2C в дифференциальные сигналы, которые можно использовать с витой парой (например, с дешевым сетевым кабелем Cat5). Дифференциальное соединение I2C SparkFun позволяет легко разместить устройство I2C на большем расстоянии.
(Спасибо @PimV за это дополнение).
У Sparkfun есть «дифференциальная коммутационная плата I2C», которая обеспечивает расстояние до 100 футов ([ссылка](https://www.sparkfun.com/products/14589)., @PimV
@PimV да, это хорошие модули. Они создают сигнал, аналогичный RS-485, по витой паре. Если сетевой кабель используется и правильно подключен, проблем с длиной 20 метров возникнуть не должно., @Jot
Привет, плата дифференциального I2C кажется лучшей идеей. Но возможно ли, что вместо использования порта Ethernet я смогу использовать 2 кабеля и на больших расстояниях?, @Nate Pulkar
Простой сетевой кабель Cat5 стоит дешево и соответствует определенным характеристикам кабеля витой пары. Чип PCA9615 на чипах Sparkfun лучше всего работает с кабелем Ethernet. Использование любых двух кабелей (по два провода каждый плюс GND) сомнительно. Если этот кабель не экранирован, он может улавливать слишком много электрических помех. Если этот кабель экранирован, емкость относительно земли может быть слишком высокой. В кабеле длиной 20 метров может случиться многое., @Jot
- Последовательная связь между несколькими устройствами (или ардуино)
- I2C связь между Arduino Uno и Nodemcu32-s (ESP32)
- Варианты протокола для обмена данными между Arduino и ESP8266
- Альтернатива LCD-дисплеям UART/I2C?
- Доступ к мультиплексным контактам I2C и UART STM32F103 в arduino IDE
- Как назвать датчики температуры вместо адреса печати с помощью датчиков ds2482-100 и ds18b20 - Справка
- Попытка понять узкое место частоты дискретизации датчика
- qMenuSystem Oled I2C не может заставить его работать
Зачем вам использовать дорогое устройство с неподходящим интерфейсом и без поддержки, когда существуют сотни релейных модулей, использующих простые логические уровни?, @Milliways
Да, существуют релейные модули TTL почти идентичного форм-фактора, и вы можете купить их менее чем за 10% от цены платы OP. По какой причине вам нужен I2C из-за большого расстояния между главным и подчиненным?, @MichaelT
Привет, MichaelT! На самом деле я ищу решение, позволяющее использовать реле I2C на большем расстоянии и установить приоритет главного устройства (Arduinos) для работы в соответствии с требованиями., @Nate Pulkar