Является ли I2C хорошим вариантом для передачи данных на расстояние более 200 метров по кабелю?
Подходит ли I2C для такого применения или есть другие протоколы? Я знаю, что существуют такие модули, как эти, для расширения диапазона I2C, и я планирую использовать этот (P82B96).
Я хотел бы использовать частоту 100 кГц для I2C и использовать кабели DMX длиной 20 м, соединенные последовательно.
Итак, есть ли альтернатива, более адаптированная для передачи данных с Arduino на Arduino по кабелю?
EDIT: Решение здесь — CAN, поскольку он позволяет иметь несколько устройств на шине. Но если это простая связь между двумя arduino, то используйте RS-232. Решение, предложенное @Dmitry Grigoryev и @Joe S
Заранее спасибо.
@Storca, 👍1
Обсуждение2 ответа
Лучший ответ:
С I2C вы вряд ли получите надежную связь по кабелю длиной более 1 м. Для справки, вот таблица, показывающая, чего можно добиться с помощью обычного RS-232:
Length (m) Maximum Baud Rate
1600 600
800 1200
400 2400
200 4800
100 9600
50 19,200
25 38,400
16 57,600
8 115,200
Итак, если вам не нужна скорость передачи данных 100 кГц, вы можете использовать обычный RS-232 (который стоит дешево). Если RS-232 недостаточно быстр для вас, рассмотрите более сложные решения. RS-485 — это одна из возможностей. Другая возможность — CAN, которая поддерживает топологии до 500 м при 100 кГц. Ключевое отличие CAN в том, что это шина, а это значит, что все устройства будут использовать одну и ту же пару проводов.
Следует отметить, что обычный RS-232 использует сигналы +/-12 В, а не 5 В, как последовательные интерфейсы Arduino., @Craig
Проблема в том, что я управляю несколькими устройствами на шине, и они должны иметь возможность отправлять данные обратно «ведущему», а RS-232 не приспособлен для такого использования, но CAN, похоже, имеет такую функциональность., @Storca
@Storca CAN более сложен (вам придется иметь дело с приоритетом сообщений, арбитражем шины и т. д.), но его определенно стоит изучить, если ваш проект достаточно сложен. Кстати, [это](https://www.aliexpress.com/wholesale?catId=0&initiative_id=SB_20180624020644&SearchText=arduino+can) показывает, как выглядят типичные трансиверы CAN., @Dmitry Grigoryev
I2C, пожалуй, худший возможный выбор для этого типа связи. Вместо этого вам следует использовать что-то вроде RS-485 (который, кстати, использует DMX) с дифференциальной сигнализацией.
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отправить строку на мастер с помощью i2c
- Как выбрать альтернативные контакты I2C на ESP32?
- Что означает в I2C «NACK получен»?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Несколько датчиков I2C с одинаковым адресом
I2C предназначен для очень коротких расстояний. Емкость длинных кабелей делает сигнал непригодным для использования. Существуют другие стандарты связи, разработанные для больших расстояний, которые в основном используют дифференциальные сигналы. Вы не получите такой сигнал из самого Arduino, но вам понадобятся некоторые периферийные устройства, которые это сделают., @Kwasmich
И некоторые из этих периферийных устройств можно контролировать с помощью I2C,, @ratchet freak
@Kwasmich Так что же такое «другие стандарты связи, разработанные для больших расстояний»? :), @Storca
Что-то вроде RS-485 может быть излишним. Но RS-232 (вариант 12 В) также рассчитан на большие расстояния, чем I2C., @Kwasmich
Кроме того, 1Wire был разработан для больших расстояний., @Kwasmich
В данном случае лучше всего подойдет RS-485 или CAN., @Joe S