Последовательный монитор прекращает печать данных

У меня есть датчик IMU (MPU 6050), подключенный к arduino UNO. Распиновка следующая:

MPU6050 --> Arduino
Vcc --> Vcc
Земля --> Земля
СКЛ --> А5
ПДД --> А4

(Без использования подтягивающих резисторов)

Я использую библиотеку MPU6050 Джеффа Роуберга для получения данных с датчика. Для проверки датчика я использую пример скетча raw value из библиотеки. Я получаю показания как для акселерометра, так и для гироскопов.

Проблема в том, что через некоторое время последовательный монитор просто перестает печатать данные. Я пытался разобраться, но не смог решить проблему. Это может быть связано с одной из двух причин:

  1. MPU6050 перестает выдавать значения датчиков
  2. Возникла проблема с последовательным монитором

Насколько я понял, датчик выдает значения, потому что при перезапуске последовательного монитора данные снова начинают печататься на последовательном мониторе и прекращают печататься через тот же промежуток времени, что и до перезапуска монитора.

Я пробовал последовательный монитор arduino IDE и гипертерминал. В обоих случаях данные перестают печататься через некоторое время.

Есть идеи, что заставляет последовательный монитор прекращать печатать данные? Это датчик или последовательный монитор?

Помощь была бы очень признательна. Спасибо заранее.

, 👍1

Обсуждение

Скорее всего, это блокировка I2C при чтении с MPU6050. Повторное открытие последовательного монитора сбрасывает Arduino. Проверьте провода (I2C не любит длинные провода) и добавьте подтягивающие резисторы 3,3 кОм к проводам I2C (если они не предусмотрены платой MPU6050). Внутренние подтягивающие резисторы Arduino *не* подходят для I2C., @Majenko

Пожалуйста, выложите скетч. Это также может быть проблема со строкой/выделением памяти., @Mikael Patel

@Majenko Сработало. Не могу поверить, но изменение длины провода действительно сработало. Раньше я использовал очень длинные провода, укоротил длину, но это не сработало, поэтому я укоротил длину еще больше. На этот раз последовательный монитор не остановился. Я не могу понять, какое влияние длина провода оказывает на процесс коммуникации. Кажется нелогичным. Еще раз спасибо за помощь., @Ahmad Tariq

Наоборот - это совершенно логично. Длинные провода = большая антенна = улавливает шум. Слабые подтяжки = шум, который легко мешает связи. Объедините эти два фактора, и у вас будет рецепт катастрофы. Исправьте один или оба, и все заработает., @Majenko

Обратите внимание, что даже при хорошей разводке код I2C, в котором отсутствует тайм-аут «отказаться и повторить попытку», является рискованным — если он будет вечно ждать подтверждения от подчиненного устройства, один-единственный неверно истолкованный бит приведет к зависанию системы., @Chris Stratton

@AhmadTariq Какова была первоначальная длина вашего кабеля и какова была конечная?, @bardulia

@ChrisStratton У меня похожая проблема: когда я подключаю два устройства I2C к Arduino Mega, после некоторого длительного времени выполнения (несколько дней) последовательный монитор перестает работать. Есть ли способ записать сообщение об ошибке, чтобы проверить, связана ли проблема с этим тайм-аутом?, @bardulia


1 ответ


2

У меня была точно такая же ситуация.
Сначала я начал проверять переполненность FIFO MPU6050, затем экспериментировал с установкой различной тактовой частоты для связи I2C, пытался настроить подтягивающие резисторы, как рекомендовано. Наконец, вот решение, которое сработало для меня. По сути, я просто отключил INT-пин от MPU6050.

Теперь схема такая:
(МПУ) -> (Arduino)

AD0 -> GND
SDA -> A4 (Без подтягивания)
SCL -> A5 (Без подтягивания)
ЗЕМЛЯ -> ЗЕМЛЯ
VCC -> 3,3 В

Я использовал этот код в качестве примера:
https://github.com/jarzebski/Arduino-MPU6050/blob/master/MPU6050_gyro_pitch_roll_yaw/MPU6050_gyro_pitch_roll_yaw.ino

из этой библиотеки:
https://github.com/jarzebski/Arduino-MPU6050

,