• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Jak używać bno085/8x
#1
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 
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"));
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości