Почему я получаю только значения -1 на последовательном мониторе при взаимодействии с MPU 6050?

Я пытаюсь протестировать мою плату Seeeduino XIAO (совместимую с Arduino) с датчиком IMU, MPU 6050. В основном меня интересуют значения акселерометра и гироскопа.

Но когда я запускаю свой код Arduino на XIAO, я получаю только значения -1 на последовательном мониторе. Когда я впервые тестировал MPU 6050 на smoke, я действительно видел обычные значения X, Y, Z (например, 123, -456 и т. Д.), Но они исчезли после нескольких показаний. Как микроконтроллер, так и микросхемы IMU могут включаться, поскольку они оба отображают светодиодную подсветку. Кажется, что XIAO показывает синий светодиодный индикатор, когда он передает / принимает данные, но я не совсем уверен, что это то, что происходит.

MPU 6050 обменивается данными через I2C, поэтому я подключил Vcc к 3,3 В на XIAO, так как я где-то читал, что MPU 6050 работает на 3,3 В, Gnd - на Gnd, SCL - на вывод 5 на XIAO, SDA - на вывод 4, а вывод INT - на вывод 2 (не уверен, что я нужен пин INT или нет, но я читал, что это помогло очистить буфер, я думаю). Затем я подключаю XIAO к USB-порту 5V моего ноутбука. Также не уверен, нужно ли мне подключаться к 3,3 В или 5 В от MPU к XIAO.

Есть идеи, почему я получаю значения -1? Я также иногда получаю значения 0, но в основном - 1. Вот фрагмент выходных данных, которые я получаю на последовательном мониторе:

12:06:32.476 -> AccX = 0 || AccY = 0 || AccZ = 0 || Temp = 36.53 || GyroX = 0 || GyroY = 0 || GyroZ = 0
12:06:32.578 -> AccX = 0 || AccY = 0 || AccZ = 0 || Temp = 36.53 || GyroX = 0 || GyroY = 0 || GyroZ = 0
12:06:32.681 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:33.057 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:33.159 -> AccX = 0 || AccY = 0 || AccZ = 0 || Temp = 36.53 || GyroX = 0 || GyroY = 0 || GyroZ = 0
12:06:33.465 -> AccX = 0 || AccY = 0 || AccZ = 0 || Temp = 36.53 || GyroX = 0 || GyroY = 0 || GyroZ = 0
12:06:33.566 -> AccX = 0 || AccY = 0 || AccZ = 0 || Temp = 36.53 || GyroX = 0 || GyroY = 0 || GyroZ = 0
12:06:33.738 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:33.841 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:34.014 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:34.390 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:34.492 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:34.596 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:34.699 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:34.903 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:36.378 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:36.480 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:36.584 -> AccX = 0 || AccY = 0 || AccZ = 0 || Temp = 36.53 || GyroX = 0 || GyroY = 0 || GyroZ = 0
12:06:37.064 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:37.710 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:38.122 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:38.257 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:38.393 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:38.529 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1
12:06:38.664 -> AccX = -1 || AccY = -1 || AccZ = -1 || Temp = 36.53 || GyroX = -1 || GyroY = -1 || GyroZ = -1

Вот код, который я нашел на каком-то учебном сайте: https://www.electronicshub.org/getting-started-arduino-mpu6050 /

#include<Wire.h>
const int MPU6050_addr=0x68;
int16_t AccX,AccY,AccZ,Temp,GyroX,GyroY,GyroZ;
void setup(){
  Wire.begin();
  Wire.beginTransmission(MPU6050_addr);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);
  Serial.begin(9600);
}
void loop(){
  Wire.beginTransmission(MPU6050_addr);
  Wire.write(0x3B);
  Wire.endTransmission(false);
  Wire.requestFrom(MPU6050_addr,14,true);
  AccX=Wire.read()<<8|Wire.read();
  AccY=Wire.read()<<8|Wire.read();
  AccZ=Wire.read()<<8|Wire.read();
  Temp=Wire.read()<<8|Wire.read();
  GyroX=Wire.read()<<8|Wire.read();
  GyroY=Wire.read()<<8|Wire.read();
  GyroZ=Wire.read()<<8|Wire.read();
  Serial.print("AccX = "); Serial.print(AccX);
  Serial.print(" || AccY = "); Serial.print(AccY);
  Serial.print(" || AccZ = "); Serial.print(AccZ);
  Serial.print(" || Temp = "); Serial.print(Temp/340.00+36.53);
  Serial.print(" || GyroX = "); Serial.print(GyroX);
  Serial.print(" || GyroY = "); Serial.print(GyroY);
  Serial.print(" || GyroZ = "); Serial.println(GyroZ);
  delay(100);
}

Прилагается моя текущая настройка электроники. Да, я знаю, что мне следовало бы использовать макетную плату, но в то время у меня ее не было с собой. Соединение было нестабильным, так что, возможно, это сбило показания с толку.

, 👍1

Обсуждение

-1 - это обычно все единицы, а 0 - это все нули. Таким образом, похоже, что вы не получаете никаких данных. Похоже, что код настроен для устройства I2C с адресом 0x68. 6050 можно настроить так, чтобы он отображался по этому адресу или по адресу 0x69. К чему подключен вывод 9 микросхемы 6050?, @st2000

О, хорошо. Я запустил код сканирования устройства i2c, который я нашел в Интернете, и он сказал, что адрес с номером 0x68 доступен вместе с остальным адресным пространством. 6050 имеет только 8 контактов., @rmutalik

Я не уверен, что означает "запуск кода сканирования устройства i2c". Похоже, что сканирование ничего не обнаружило в 0x68 и, таким образом, указало, что адрес был доступен. Кстати, чип 6050 имеет 24 контакта. Плата, на которую припаян чип 6050, имеет 8 контактов. Для получения дополнительной помощи вам нужно сообщить нам, откуда вы взяли эту плату. Поскольку нам нужна схема платы, чтобы хорошо разобраться в этом., @st2000

Да, сканирование показало, что адрес с номером 0x68 был доступен. О, хорошо. Diymore 6DOF MPU-6050 GY-521. Это название правления., @rmutalik

Быстрый взгляд вокруг, и я не могу найти схему. Если вы знаете, где его найти, пожалуйста, дайте нам знать. Я действительно нашел [этот проект] (https://www.instructables.com/GY-521-MPU6050-3-Axis-Acceleration-Gyroscope-6DOF -/) что вы и делаете, только они используют настоящую плату Arduino Uno. Теперь я задаюсь вопросом, является ли СЯО настолько совместимым, насколько это необходимо для этого проекта., @st2000

Схема и плата выглядят следующим образом: https://www.theengineeringprojects.com/wp-content/uploads/2019/02/mpu6050.jpg, @rmutalik

Спасибо @rmutalik, но схема больше похожа на изображение в ответе "Может быть несколько вопросов, которые следует рассмотреть:". В качестве instructables.com проект, на который я ссылался в этом ответе, связан точно так же, как и ваш проект (и при условии, что проект работает) Я бы посоветовал вам попытаться следовать инструкциям этого проекта при использовании Arduino Uno. Опять же, это не первый случай, когда новая плата Arduino ведет себя не так, как оригинальная Arduino Uno., @st2000

Хорошо, спасибо, я попробую это сделать, а затем отвечу на этот пост своими выводами., @rmutalik


1 ответ


1

Возможно, потребуется рассмотреть несколько вопросов:

  1. В спецификации 6050 мы видим, что 6050 можно настроить так, чтобы он отображался по адресу 0x68 или 0x69. На фотографии, похоже, нет подключения к контакту (AD0?). который может управлять адресом 6050. Код, по-видимому, ожидает 6050 по адресу 0x68. (Примечание: плата, на которую поставляется 6050, уже может решить эту проблему, включив подтягивающий или опускающий резистор.)

  2. Шине I2C обычно требуются подтягивающие резисторы на линиях передачи данных и синхронизации, поскольку все драйверы обычно имеют тип open collector. Вот часть рисунка из документа спецификации 6850:

(Примечание: плата, на которую поставляется 6050, уже может решить эту проблему, включив 2 подтягивающих резистора.)

  1. Поищите рабочий проект, который будет таким же или почти таким же, как ваш. Вот проект, в котором используется та же плата 6050, подключенная к Arduino Uno.

  2. Подумайте, действительно ли библиотеки и другое вспомогательное программное обеспечение абстрагируют ваше оборудование XIAO (в данном случае процессор SAMD21CortexM0 +) (в реальном Arduino Uno используется процессор ATmega328P). Это не первый случай, когда попытка эмулировать Arduino с использованием других и более мощных процессоров приводит к неожиданному поведению рабочих скетчей.

  3. Наконец, по-видимому, существует множество схем, многие из которых имеют регуляторы LDO от 5 до 3,3 вольт, а некоторые и без них. Возможно, даже с регулятором низкого напряжения подача на плату напряжения 3,3 В не приведет к подаче напряжения 3,3 В на микросхему 6050. Это может привести к проблемам. Но питание платы без регулятора напряжением 5 вольт может привести к повреждению микросхемы 6050. Вот одна из найденных схем:

(Примечание: На этой схеме линии данных и синхронизации расположены высоко на плате. И вывод 9 (AD0) чипа 6050 вытянут низко.)

,