Почему я получаю только значения -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);
}
Прилагается моя текущая настройка электроники. Да, я знаю, что мне следовало бы использовать макетную плату, но в то время у меня ее не было с собой. Соединение было нестабильным, так что, возможно, это сбило показания с толку.
@rmutalik, 👍1
Обсуждение1 ответ
Возможно, потребуется рассмотреть несколько вопросов:
В спецификации 6050 мы видим, что 6050 можно настроить так, чтобы он отображался по адресу 0x68 или 0x69. На фотографии, похоже, нет подключения к контакту (AD0?). который может управлять адресом 6050. Код, по-видимому, ожидает 6050 по адресу 0x68. (Примечание: плата, на которую поставляется 6050, уже может решить эту проблему, включив подтягивающий или опускающий резистор.)
Шине I2C обычно требуются подтягивающие резисторы на линиях передачи данных и синхронизации, поскольку все драйверы обычно имеют тип open collector. Вот часть рисунка из документа спецификации 6850:
(Примечание: плата, на которую поставляется 6050, уже может решить эту проблему, включив 2 подтягивающих резистора.)
Поищите рабочий проект, который будет таким же или почти таким же, как ваш. Вот проект, в котором используется та же плата 6050, подключенная к Arduino Uno.
Подумайте, действительно ли библиотеки и другое вспомогательное программное обеспечение абстрагируют ваше оборудование XIAO (в данном случае процессор SAMD21CortexM0 +) (в реальном Arduino Uno используется процессор ATmega328P). Это не первый случай, когда попытка эмулировать Arduino с использованием других и более мощных процессоров приводит к неожиданному поведению рабочих скетчей.
Наконец, по-видимому, существует множество схем, многие из которых имеют регуляторы LDO от 5 до 3,3 вольт, а некоторые и без них. Возможно, даже с регулятором низкого напряжения подача на плату напряжения 3,3 В не приведет к подаче напряжения 3,3 В на микросхему 6050. Это может привести к проблемам. Но питание платы без регулятора напряжением 5 вольт может привести к повреждению микросхемы 6050. Вот одна из найденных схем:
(Примечание: На этой схеме линии данных и синхронизации расположены высоко на плате. И вывод 9 (AD0) чипа 6050 вытянут низко.)
- Как подключить MPU9250 к NodeMCU с помощью SPI или I2C Slave?
- Изменение адреса I2C MPU-6050
- MPU6050 не выдает выход
- MPU-9250 IMU на SPI, внешнем датчике или магнитометре с использованием мастера I2C
- Использование MPU-6050 без I2C
- Почему Wire.write дважды?
- Сбой при записи данных MPU-6050 на SD-карту
- Мультиплексор Adafruit MPU-6050 и adafruit I2C
-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