• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

AHT10+RTC DS3231+MPU6050

Vypra

Member
В аппарате за неимением свободных пинов подключил к RTC DS3231 датчик AHT10 по шине I2C. Все работает.
Но есть еще задача сюда же подключить гиродатчик MPU6050. Тогда работает или AHT10 или MPU6050. Поочередно сбоят.
Адреса подключения:
DS3231: 0х68 и 0х57 (память),
AHT10: 0х38
MPU6050: 0х69 (соединил AD0 на VCC, чтоб адрес по умолчанию 0х68 не перекликался с DS3231)

Но тут загвоздка. В библиотеке MPU6050 есть такие строки:
Код:
// Register names according to the datasheet.
// According to the InvenSense document
// "MPU-6000 and MPU-6050 Register Map
// and Descriptions Revision 3.2"
...
#define MPU6050_INT_ENABLE         0x38   // R/W
...
#define MPU6050_EXT_SENS_DATA_14   0x57   // R
...
#define MPU6050_SIGNAL_PATH_RESET  0x68   // R/W  Используется для сброса аналоговых и цифровых сигналов датчиков
...
#define MPU6050_MOT_DETECT_CTRL    0x69   // R/W
Думаю поэтому не работает.
Что можно сделать, как обойти эти адреса?
 

Vypra

Member
Как перевести AHT10 и MPU6050 в сон? Может пробуждать, брать данные и снова в сон?
 

pvvx

Активный участник сообщества
Даташит:
The slave address of the MPU-60X0 is b110100X which is 7 bits long. The LSB bit of the 7 bit address is determined by the logic level on pin AD0. This allows two MPU-60X0s to be connected to the same I2 C bus.
When used in this configuration, the address of the one of the devices should be b1101000 (pin AD0 is logic low) and the address of the other should be b1101001 (pin AD0 is logic high).

Адрес ведомого устройства MPU-60X0 - b110100X в 7 битном представлении. Бит LSB 7-битного адреса определяется логическим уровнем на выводе AD0. Это позволяет двум MPU-60X0 подключаться к одной шине I2C.
При использовании двух микросхем на одной шине адрес одного из устройств должен быть b1101000 (вывод AD0 - низкий логический уровень), а адрес другого должен быть b1101001 (вывод AD0 - высокий логический уровень).


Вы приводите адреса регистров (Register names) микросхемы MPU-60X0, а не её адрес на шине.
Кроме того MPU-60X0 имеет вторую линию I2C и сама может читать по ней внешние датчики и автоматически помещать результат в FIFO или одиночным опросом в спец. свои регистры. Это программируется в ней.
 

Vypra

Member
Значит причина в другом. Возможно провода. Хотя 20 см для I2C нормально. Попробую укоротить минимально.
 

pvvx

Активный участник сообщества
Значит причина в другом. Возможно провода. Хотя 20 см для I2C нормально. Попробую укоротить минимально.
Причина в очередной, наверно уже более сотой на данном форуме теме о кривой либе i2c на ESP.
 

pvvx

Активный участник сообщества
Пока рано говорить. Установлено Fixed built-in I2C driver for Arduino ESP8266 core
Это статья не о чем, от очередного Ардуинщика.
Большинство случаев, по чему не работает в том, что написан неверный алгоритм и не правильно выставлены ACK при чтении или записи некоторых чипов.
Чипы в Arduino применяются старые, глючных разработок, которые не пошли в производство. Куда-то их сплавлять то надо...
Но суть не в этом - некоторые чипы не позволяют читать один байт или 3 или как вам нравится. У них есть конкретный цикл, описанный в их доках, к примеру на чтение только по 5 байт. Если его прервали или нарушили, то шина SDA будет опушена этим устройством пока SCL не даст необходимых тиков до завершения цикла указанной последовательности байт.
Вся беда не либах, а в головах Ардуинщиков.
 

enjoynering

Well-known member
Будьте осторожны с автором Vypra - он часто не договаривает по незнанию. Прежде чем помогать требуйте все - весь код, схему и тд. Например может 3 страницы пытать форум почему у него ds18b20 через раз работает. А по итогу оказывается, что у ds18b20 в место 4.7Ком стоит 10Ком.
 

pvvx

Активный участник сообщества
Будьте осторожны с автором Vypra - он часто не договаривает по незнанию. Прежде чем помогать требуйте все - весь код, схему и тд.
В данной теме нет никакого смыслу выпытывать что-то. MPU6050 по default опрашивается очень интенсивно, до тысячи блоков замеров из FIFO в сек. Если ESP не успевает вычитывать, то сбой FIFO. А ещё надо по той-же шине читать другие чипы... Но в Ардуино либы писаны без понимания того, что на шине может быть много устройств и требуется их править. Но кто-же ныне из Ардуинщиков полезет в чужие либы и как это сделать в амбразуре Arduino? Подключив VS или какую другую студию - это уже не Ардуино, а извращение - если уже работаете нативным СИ/С++, то нафига ардуино?
Да ESP такой ногодрыг в I2C только с MPU с трудом тянет и итог понятен заранее - без изменения либ и настроек с понижением частоты заполнения FIFO у MPU6050 ничего хорошего не выйдет, впрочем что и наблюдаем.
 
Сверху Снизу