У меня есть 2 микроконтроллера Arduino, к каждому из которых подключена сеть устройств I2C (у одного есть 2 АЦП, а у другого - ЖК-дисплей и RTC). Как я могу использовать соединение I2C для передачи значений, полученных первым uC от АЦП ко второму? Оба uC являются ведущими на своих шинах I2C. Я думал сделать программный I2C на втором uC и подключить его как подчиненный к первому (чтобы второй контроллер имел 2 порта I2C: один аппаратный и один программный). Проблема в том, что я не могу найти программную библиотеку I2C, которая работает как ведомая. Все мастера.
Жду ваших идей.
Вопрос в том, могу ли я создать 2 сети I2c, используя один Arduino Mega2560? Один в качестве ведущего на аппаратном порту для связи с ЖК-дисплеем и RTC и один в качестве ведомого на программном порту на 2 других парах контактов (для SCL и SDA) для получения данных от другого ведущего Arduino...
Проанализировав все данные, я пришел к выводу, что 2 шины I2C не могут быть связаны друг с другом. К внешнему порту I2C, который у меня есть на UC для сбора данных, я подключу другую Arduino в качестве ведомой, которая будет получать информацию и передавать ее с помощью беспроводного адаптера (вероятно, NRF24N01). Таким образом, мне не нужно иметь провода от моего солнечного контроллера к Arduino, который сообщает о производстве на веб-сайт pvoutput.
Из комментариев вы хотите иметь возможность подключаться только к шине I2C на каждом из ваших отдельных проектов и передавать данные.
Wirning позволяет запускать Arduino в качестве ведущего или ведомого устройства I2C. Вы не можете запускать и ведущее, и ведомое программное обеспечение Wiring на одном микро, поскольку они оба хотят использовать аппаратное обеспечение USI, но, поскольку у вас есть только один USI, вы все равно можете подключиться только к одной шине.
Я бы предложил использовать ATTiny85 в качестве ведомого интерфейса I2C на каждой шине, а затем соединить их вместе через программный UART. Существует очень хорошая библиотека TinyWire , доступная для ATTiny85 от Adafruit… у них также есть очень маленькая плата под названием Trinket , которую вы можете использовать.
Существует множество доступных плат ATTiny85 (например, Digispark), которые можно подключить к среде программирования Arduino, поэтому это должен быть простой и дешевый способ создания подчиненного устройства I2C.
Хотя некоторые могут сказать, что это излишество, это было бы чрезвычайно просто реализовать и не потребовало бы каких-либо модификаций оборудования для вашего проекта.
IIC не является хорошим выбором для одноранговой связи.
Вероятно, самый простой способ подключения к микроконтроллерам — это UART. Обратите внимание, что предусмотрен отдельный и асинхронный канал в каждом направлении. Вы также не привязаны к стандартной скорости передачи данных. Используйте что-то быстрое, что может быть получено непосредственно от обоих часов. Вы можете легко сделать MBaud или больше между UART на одной плате.
Особенно, если вы увеличиваете скорость передачи данных, может быть хорошей идеей реализовать управление потоком. Некоторые микроконтроллеры UARTS имеют встроенный RTS/CTS, но даже если нет, такую возможность легко добавить в прошивку. Убедитесь, что получатель может буферизовать как минимум столько символов, сколько есть в аппаратном FIFO отправителя. Таким образом, линия управления потоком может использоваться в отправителе, чтобы просто не записывать больше данных в оборудование. Микроконтроллеры, как правило, имеют небольшие выходные FIFO UART (обычно всего один или два, редко более 4), так что это не большая проблема.
Все, что сказано, смотрите здесь , как соединить две платы Arduino Uno (одну главную и одну подчиненную) с помощью шины I2C.
То, что предложил @olin, вам следует рассмотреть.
Если вам нужны два режима I2C (главный и подчиненный), тогда читайте дальше.
Arduino может быть настроен как ведущий или ведомый в любой момент времени. Итак, я бы попробовал это. Плата Arduino, которая должна выполнять обе роли (назовем ее Arduino A), по умолчанию может быть настроена как ведомая. Таким образом, Arduino не пропустит ни одной команды от Arduino B (arduino, который всегда будет мастером).
Arduino A может сам решить, когда изменить свою роль на Master . Это зависит от периодических интервалов, из которых он должен считывать данные. Как только данные считываются с датчиков или данные записываются на ЖК-дисплей, Arduino A снова может взять на себя роль ведомого устройства.
Одна загвоздка заключается в том, что, хотя Arduino A взял на себя роль ведущего, Arduino B не может взаимодействовать с Arduino A. Это можно решить разными способами:
Рассмотрите http://www.gammon.com.au/i2c , если это полезно. Есть хорошая информация о конфигурациях. Все на одной странице. Пожалуйста, не заблудитесь во время навигации.
Наконец, факторы, влияющие на решение логики, — это требования вашего собственного приложения. Частота обмена данными, которая может быть время от времени или непрерывной, критическое время отклика, не меньшее количество ресурсов, которые хотелось бы сэкономить, на случай, если кто-то решит также внедрить ведомое устройство I2C.
ст2000
Михай