Гироскоп MPU6050 не дает надежных показаний
Он дает надежные показания в течение нескольких секунд, а затем становится ненадежным.
Мой код Arduino таков:
#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 sendVector(float x, float y, float z) {
Serial.print(x, 4);
Serial.print("|");
Serial.print(y, 4);
Serial.print("|");
Serial.println(z, 4);
}
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);
//Серийный.print(AccY);
//Serial.print(AccZ);
//Serial.print(" || Temp = "); Serial.print(Temp/340.00+36.53);
//Serial.print(" || GyroX = ");
//Serial.println(GyroX);
//Serial.print(" || GyroY = ");
//Serial.println(GyroY);
//Serial.print(" || GyroZ = ");
//Serial.println(GyroZ);
sendVector(GyroX, GyroY, GyroZ);
delay(100);
}
Приведенное выше отправляет данные в единство, которое управляет объектом. Объект работает с гироскопом, а затем за счет случайных показаний вращается быстро и хаотично.
@Jsavs00, 👍-1
Обсуждение1 ответ
Я не думаю, что вы дали достаточно информации, чтобы помочь вам отладить это, но я могу попытаться дать несколько советов:
Сначала убедитесь, что чип работает правильно
Используйте монитор графиков Arduino и пример программы, чтобы увидеть поведение чипа и значения во времени; убедитесь, что проблема не в чипе
Во-вторых, убедитесь, что вы правильно интерпретируете значения
MPU6050 выводит 16-битные данные, но не имеет 16-битного разрешения, это означает, что младшие биты данных являются случайным, бессмысленным шумом и должны игнорироваться/отбрасываться.
Если вы предполагаете, что все 16 бит содержат достоверные данные, а ваш код достаточно чувствителен, чтобы на него могли повлиять эти младшие биты, вы увидите нестабильные случайные данные.
В-третьих, рассмотрите другие (возможные) препятствия
Попробуйте увеличить скорость последовательной передачи данных, возможно, вы отнимаете слишком много времени и таким образом создаете проблемы.
Возможно, вы выходите из синхронизации при чтении с чипа, если отправляются дополнительные данные, вы можете создать отставание в буфере и начать интерпретировать сообщения неправильно, потому что вы читаете часть одного и часть другой. Попробуйте использовать библиотеку для общения с чипом, которую использовали другие люди и которая, как известно, работает; это может удалить ошибки, к которым вы не обращаете внимания, или ошибки, с которыми столкнется каждый, но они уже исправлены в библиотеке!
- Как очистить буфер FIFO на MPU6050?
- Почему MPU6050 DMP не инициализируется, но я могу получить необработанные значения ускорения от MPU6050
- Взаимодействие MPU6050 с Arduino через S-функцию Simulink
- Проводка для Arduino Mega и нескольких MPU 6050/Gy 521
- Почему значение регистра чтения и записи гироскопа MPU6050 равно 0x08 для полной шкалы 500 градусов в секунду?
- Проблема прерывания библиотеки MPU6050 Arduino Jeff Rowberg
- Проблема с библиотекой MPU6050
- Arduino Mega и ошибочные значения гироскопа
Взгляните на алгоритм объединения датчиков AHRS, который дает вам значения кватернионов / крена, тангажа и рыскания, а также делает значения более стабильными., @Twometer