Можно ли использовать несколько датчиков I2C с Arduino без мультиплексора I2C?
У меня есть датчик IMU и датчик температуры Bluerobotics, оба имеют разные адреса I2C.
Я хочу интегрировать оба устройства с Arduino UNO. Я знаю, что могу сделать это с помощью мультиплексора I2C, но сейчас у меня нет к нему доступа.
Можно ли интегрировать их с arduino без мультиплексора, т.е. просто подключив их параллельно к контактам A4 и A5 Arduino? (Это не сработало, хотя, когда я пытался, датчик температуры выдавал значения, но значения датчика IMU были только нулями на последовательном мониторе Arduino)
Я нашел несколько видеороликов об этом на YouTube, в некоторых из них к датчикам подключались подтягивающие резисторы, но этот метод, похоже, не работает.
Поэтому, прежде чем углубляться в это, я хотел бы знать, возможно ли вообще обойтись без мультиплексора, потому что мое время драгоценно, так как у меня есть крайний срок проекта.
@ssmalik, 👍4
Обсуждение2 ответа
во-первых, вы сказали, что у них разные адреса I2C, поэтому вам не нужен I2C мультиплексор, мультиплексор I2C используется только при наличии более одного устройства с одинаковым адресом I2C и см. мультиплексор Adafruit I2C как говорится:
Наконец-то появился способ подключить до 8 устройств I2C с одинаковым адресом к одному микроконтроллеру
это означает, что он может обрабатывать 8 устройств с одинаковым адресом, но в вашем случае адреса уже разные, так зачем вам мультиплексор I2C.
ваша проблема требует глубокого изучения отладки, вы можете приобрести себе дешевый логический анализатор, такой как это дешевые 10$ Анализатор клонов saleae, чтобы увидеть, какие данные на самом деле помещаются в шину, анализатор сделает вашу отладку намного проще, чем вы думаете, как показано на рисунке ниже, полученном с сайта официальный сайт saleae, а также этот дешевый клон saleae отлично работает с программным обеспечением logic, предлагаемым от saleae:
но что касается вашей проблемы, я предполагаю, что это связано с подтягивающими резисторами и паразитной емкостью между двумя шинами, читая из файл спецификации I2C, в разделе 7.1 есть уравнение минимального и максимально допустимого подтягивающих резисторов в зависимости от узлов, подключенных к шине:
Rp(мин) = (Vdd - Vol(max)) / Iol
Rp(max) = tr / (0,8473 * Cb)
где Vdd
– 5 В при использовании Arduino, tr
– максимальное время нарастания, зависящее от микроконтроллера, Cb
– расчетная емкость шины и вы можете получить это из таблицы данных каждого компонента в вашей линии шины, поскольку для Arduino его емкость указана в техническое описание на странице 264, говорящее
Емкость для каждого контакта ввода-вывода Ci — 10 пФ
другие символы вы можете получить из спецификаций I2C, упомянутых выше, но ваша проблема связана с подтягивающими резисторами, я думаю, и вы не можете знать это без отладки. Я рекомендую вам использовать логические анализаторы.
Но когда я подключаю резисторы 4,7 кОм к линиям SDA и SCL и Vcc, который входит в этот диапазон, экран последовательного монитора становится полностью белым и не показывает значения. И когда я не подключаю резистор, датчик температуры дает правильные значения, но датчик IMU дает фиксированные и неправильные значения. Датчик температуры, который я использую, представляет собой модуль, модуль быстрого реагирования Bluerobotics Celsius, а датчик IMU (MPU 9250) представляет собой «голый датчик», а не модуль. Может ли проблема быть из-за этого? может быть, модуль температуры уже имеет встроенный подтягивающий резистор, а датчик IMU - нет?, @ssmalik
@ssmalik, если вы добавляете внешние подтягивающие резисторы, обязательно отключите внутренние подтягивающие резисторы Arduino (Atmega328p), потому что, если на одной шине есть более одного подтягивающего резистора с разными значениями, это приведет к ошибкам при чтении данных на шине также решение проблемы требует отладки с использованием таких вещей, как логические анализаторы, как я уже сказал, @abdo Salm
Поскольку вы не дали ссылок, я зашел в сеть и проверил их. Убедитесь, что модули I2C не имеют подтягивающих резисторов. Если это так, обратите внимание на значение. Отрегулируйте внешний вид так, чтобы подтягивание к 3V3 составляло около 3,1 кОм. Вам понадобится преобразователь уровня как для модуля IMU, так и для датчика температуры Bluerobotics, они оба являются кабанами 3V3. Хорошие новости: один набор переводчиков уровней будет работать для обоих. Помните, что вам потребуются подтяжки с обеих сторон переводчиков, проверьте, так как не все это делают.
Поскольку вы только начинаете, вы можете выбрать одну из прекрасных микросхем 3V3 из серий плат Arduino или ESP. Простое правило начальной точки для подтяжки на I2C: 3,1 КБ для 3V3 и 4,7 КБ для 5 В. Дайте нам знать, как у вас дела.
Плохая новость: возможно, вы повредили одну или обе платы I2C напряжением 5 В.
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отправить строку на мастер с помощью i2c
- Как выбрать альтернативные контакты I2C на ESP32?
- Что означает в I2C «NACK получен»?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Несколько датчиков I2C с одинаковым адресом
Да, I2C — это шина, предназначенная для подключения нескольких устройств i2c через одну и ту же шину, если устройства i2c имеют разные адреса i2c. Если вы можете прочитать датчик температуры, но не IMU, запустите сканер i2c, чтобы увидеть, сможете ли вы сначала его обнаружить. Вам обязательно понадобятся подтягивающие резисторы на обеих линиях i2c, если в вашем Arduino или ваших датчиках их нет., @hcheung
также спросил на форуме Arduino https://forum.arduino.cc/t/is-it-possible-to-use-multiple-i2c-sensors-with-arduino-without-an-i2c-multiplexer/1027277, @Juraj