Проблема с устройствами Arduino Uno 2 I2C

i2c

У меня есть два устройства I2C, подключенных к Arduino Uno: RTC и интерфейс OBD (см. ссылки ниже). SCL/SDA обоих устройств подключены параллельно к SCL/SDA (соответственно) Uno. Моя проблема: когда я устанавливаю время на RTC (используя либо опцию автоустановки, либо явно), оно возвращает странные показания, например, дату, переведенную на 4 дня назад, часы, переведенные на 2 часа назад и т. д. Это происходит даже с базовым скетчем RTC по умолчанию.

Я попробовал два RTC (один DS1307 и один, ссылка на который приведена ниже): оба ведут себя одинаково странно. Я попробовал 2 конфигурации: 1) БЕЗ подтягивающих резисторов на обоих устройствах, 2) два подтягивающих резистора 10 кОм на ОБОИХ устройствах. В обеих ситуациях возникают ошибки RTC. Если я отсоединяю датчик OBD от SCL/SDA, RTC показывает правильное время. Если я отсоединяю RTC, OBD сам по себе (работает нормально. Прежде чем я потрачу больше времени на эксперименты: есть ли какие-нибудь советы, как решить эту проблему с подтягивающим резистором (если это то, что нужно)?

Adafruit DS3231 Precision RTC

Интерфейс OBD Freematics

, 👍1


2 ответа


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

5

Я полагаю, что вы используете библиотеку Adafruit, поскольку это URL-адрес продукта, который вы опубликовали.

Если так, то в RTClib.h:

#define DS1307_ADDRESS  0x68
#define DS3231_ADDRESS  0x68

И на странице продукта OBD:

OBD I2C Address: 0x68

MEMS I2C Address: 0x62

Что, очевидно, вызывает конфликт.

Похоже, что у них фиксированный адрес I2C (некоторые устройства настраиваются через программное обеспечение, другие — через внешние контакты). Поэтому решением будет использовать другие RTC, другие OBD (или изменить их адрес) или использовать разветвитель шины, или использовать микроконтроллер с более чем одной шиной I2C.

,

Спасибо, верно подмечено, я изучу этот вопрос. Почему бы не сделать устройства I2C с небольшой, встроенной, припаиваемой перемычкой, чтобы быстро задать адрес, отличный от адреса по умолчанию? Риторический вопрос..., @MrSparkly

Ну, так и есть, просто не у всех есть эта функция :), @Wesley Lee


0

Если у кого-то такая же проблема: оказывается, у Adafruit есть мультиплексор как раз для этой цели. Также есть LTC4316, который (якобы) преобразует адреса I2C на лету.

Мультиплексор Adafruit TCA9548A I2C

LTC4316

,