30-07-2026, 16:59
Miało być prosto a wyszło jak zawsze...
Jak czegoś nie rozumiem, to przepraszam nie jestem programista.
Zamówiłem bno085 i tak pisało na opakowaniu, ale na pcb pisze bno08x.
Jest podłączone pod esp32 po i2c (nie zalecane, ale komunikuje się), użyta biblioteka "SparkFun_BNO080_Arduino_Library.h"
z ta nizej miałem wiecej problemow ze statusami czujnikami
"SparkFun_BNO08x_Arduino_Library.h"
W sumie mam pytania do osób co go używały :
- czy można wyłączyć auto kalibracje
- skalibrować każdy czujnik z osoba
- zapisać raz do flash
- używać kompasu z fuzja
- wyczyścić flash
- sprawdzić czy cos jest w flash
Bo co zaobserwowałem kalibruje czujniki jest status high, zapisuje , wyłączam kalibracje po resecie mam watpliwosci czy to działa.
Kod to połączenie 2 przykładów z biblioteki, potrzebuje dobry kompas do łazika
Jak czegoś nie rozumiem, to przepraszam nie jestem programista.
Zamówiłem bno085 i tak pisało na opakowaniu, ale na pcb pisze bno08x.
Jest podłączone pod esp32 po i2c (nie zalecane, ale komunikuje się), użyta biblioteka "SparkFun_BNO080_Arduino_Library.h"
z ta nizej miałem wiecej problemow ze statusami czujnikami
"SparkFun_BNO08x_Arduino_Library.h"
W sumie mam pytania do osób co go używały :
- czy można wyłączyć auto kalibracje
- skalibrować każdy czujnik z osoba
- zapisać raz do flash
- używać kompasu z fuzja
- wyczyścić flash
- sprawdzić czy cos jest w flash
Bo co zaobserwowałem kalibruje czujniki jest status high, zapisuje , wyłączam kalibracje po resecie mam watpliwosci czy to działa.
Kod to połączenie 2 przykładów z biblioteki, potrzebuje dobry kompas do łazika
Kod:
#include <Wire.h>
#include "SparkFun_BNO080_Arduino_Library.h"
BNO080 myIMU;
float declination = 5.40; // deklinacja dla Wałbrzycha
void setup(){
Serial.begin(115200);
Wire.begin();
myIMU.begin();
myIMU.endCalibration();
myIMU.enableRotationVector(100); // 100 ms
printComand();
}
void loop(){
if(Serial.available()){
byte incoming = Serial.read();
if(incoming == 'm'){
myIMU.calibrateMagnetometer();
myIMU.enableMagnetometer(100); // 100 ms
}
if(incoming == 'a'){
myIMU.calibrateAccelerometer();
myIMU.enableAccelerometer(100); // 100 ms
}
if(incoming == 'l'){
myIMU.calibratePlanarAccelerometer();
myIMU.enableLinearAccelerometer(100);
}
if(incoming == 'g'){
myIMU.calibrateGyro();
myIMU.enableGyro(100); // 100 ms
}
if(incoming == 'e'){
myIMU.endCalibration();
myIMU.enableMagnetometer(0);
myIMU.enableAccelerometer(0);
myIMU.enableGyro(0);
myIMU.enableLinearAccelerometer(0);
}
if(incoming == 'f'){
myIMU.calibrateAll(); // Accel, Gyro, and Mag
myIMU.enableMagnetometer(100);
myIMU.enableAccelerometer(100);
myIMU.enableGyro(100);
}
if(incoming == 's'){
myIMU.saveCalibration(); //Saves the current dynamic calibration data (DCD) to memory
myIMU.requestCalibrationStatus(); //Sends command to get the latest calibration status
//Wait for calibration response, timeout if no response
int counter = 100;
while(1){
if(--counter == 0) break;
if(myIMU.dataAvailable() == true){
//for the ME Calibration Response Status byte to go to zero
if(myIMU.calibrationComplete() == true){
Serial.println("Calibration data successfully stored");
delay(1000);
break;
}
}
delay(1);
}
if(counter == 0){
Serial.println("Calibration data failed to store. Please try again.");
}
myIMU.endCalibration();
myIMU.enableMagnetometer(0);
myIMU.enableAccelerometer(0);
myIMU.enableGyro(0);
myIMU.enableLinearAccelerometer(0);
myIMU.enableRotationVector(100);
}
if(incoming == 'c'){
//Polecenie nie działa
}
if(incoming == 't'){
myIMU.tareNow();
delay(100);
myIMU.saveTare();
}
if(incoming == 'z'){
myIMU.tareNow(true);
delay(100);
myIMU.saveTare();
}
if(incoming == 'u'){
myIMU.clearTare();
delay(100);
myIMU.saveTare();
}
}
//Look for reports from the IMU
if (myIMU.dataAvailable() == true){
float x = myIMU.getMagX();
float y = myIMU.getMagY();
float z = myIMU.getMagZ();
byte accuracy = myIMU.getMagAccuracy();
float accX = myIMU.getAccelX();
float accY = myIMU.getAccelY();
float accZ = myIMU.getAccelZ();
byte accAccuracy = myIMU.getAccelAccuracy();
float accXL = myIMU.getLinAccelX();
float accYL = myIMU.getLinAccelY();
float accZL = myIMU.getLinAccelZ();
byte accAccuracyL = myIMU.getLinAccelAccuracy();
float gyroX = myIMU.getGyroX();
float gyroY = myIMU.getGyroY();
float gyroZ = myIMU.getGyroZ();
byte gyroAccuracy = myIMU.getGyroAccuracy();
float quatI = myIMU.getQuatI();
float quatJ = myIMU.getQuatJ();
float quatK = myIMU.getQuatK();
float quatReal = myIMU.getQuatReal();
byte sensorAccuracy = myIMU.getQuatAccuracy();
float heading = -myIMU.getYaw() * 180.0f / PI;
// https://www.magnetic-declination.com/?utm_source=chatgpt.com
int degrees = (int)declination;
float minutes = (declination - degrees) * 100.0f;
float declination_degrees = (degrees + (minutes / 60.0f));
heading += declination_degrees;
heading = fmod(heading, 360.0f);
if (heading < 0.0f) heading += 360.0f;
if (heading > 359.9f) heading = 0.0f;
////////////////////////////////////////////////////////////
Serial.print(x, 2);
Serial.print(F(","));
Serial.print(y, 2);
Serial.print(F(","));
Serial.print(z, 2);
Serial.print(F(","));
printAccuracyLevel(accuracy);
Serial.print(F(", "));
Serial.print(accX, 3);
Serial.print(F(","));
Serial.print(accY, 3);
Serial.print(F(","));
Serial.print(accZ, 3);
Serial.print(F(","));
printAccuracyLevel(accAccuracy);
Serial.print(F(", "));
Serial.print(accXL, 3);
Serial.print(F(","));
Serial.print(accYL, 3);
Serial.print(F(","));
Serial.print(accZL, 3);
Serial.print(F(","));
printAccuracyLevel(accAccuracyL);
Serial.print(F(", "));
Serial.print(gyroX, 3);
Serial.print(F(","));
Serial.print(gyroY, 3);
Serial.print(F(","));
Serial.print(gyroZ, 3);
Serial.print(F(","));
printAccuracyLevel(gyroAccuracy);
Serial.print(F(", "));
Serial.print(quatI, 2);
Serial.print(F(","));
Serial.print(quatJ, 2);
Serial.print(F(","));
Serial.print(quatK, 2);
Serial.print(F(","));
Serial.print(quatReal, 2);
Serial.print(F(","));
printAccuracyLevel(sensorAccuracy);
Serial.print(F(", "));
Serial.print(heading, 1);
Serial.println();
}
}
// Status aktualnej kalibracji
void printAccuracyLevel(byte accuracyNumber){
if (accuracyNumber == 0) Serial.print(F("Unreliable"));
else if (accuracyNumber == 1) Serial.print(F("Low"));
else if (accuracyNumber == 2) Serial.print(F("Medium"));
else if (accuracyNumber == 3) Serial.print(F("High"));
}
// Polecenia
void printComand(){
Serial.println(F(""));
Serial.println(F("Comand: "));
Serial.println(F(" m - calibrate Mag"));
Serial.println(F(" a - calibrate Acc"));
Serial.println(F(" l - calibrate Acc Linear"));
Serial.println(F(" g - calibrate Gyr"));
Serial.println(F(" f - calibrate Mag, Acc, Gyr"));
Serial.println(F(" e - calibrate end"));
Serial.println(F(" s - calibrate save"));
Serial.println(F(" c - calibrate clear"));
Serial.println(F(" t - tare all save"));
Serial.println(F(" z - tare z save"));
Serial.println(F(" u - tare clear"));
}
