Skocz do zawartości

Szukam sprawdzonej biblioteki do MPU6050


Pomocna odpowiedź

Napisano

witam...walcze z mpu6050, sprawdzalem najpopularniejsze biblioteki i nie dziala...jedynie biblioteka adafruiit dziala choc nie do konca, mam dwa moduly, jesli podlacze stary to normalnie sie komunikuje z biblioteka, jesli podczas pracy wyciagne stary z plytki stykowej i wepne nowy mpu to dziala...jesli zresetuje esp to juz nie ma komunikacji z nowym mpu...oba mpu maja ten sam adres 0x68...moze ktos wyprobowac ta biblioteke u siebie? zalezy mi na tej wersji bo ma wszystko czego potrzebuje... https://github.com/jarzebski/Arduino-MPU6050

19 minut temu, farmaceuta napisał:

moze ktos wyprobowac ta biblioteke

Takie ogólne sprawdzanie nie ma sensu - tysiące osób już ją wykorzystywało.

Zainteresuj się tą biblioteką, jako jedna z niewielu potrafi wykorzystać wewnętrzny DMP układu.

  • Lubię! 1
  • Pomogłeś! 1

@jand już miałem tą bibliotekę tylko okrojoną wersję...nie dzialala...to co podałeś to zbiór wielu bibliotek i nie mogłem tego zainstalować...dopiero po wycięciu odpowiednich plików i wklejeniu do pierwszego folderu IDE przełkneło👍 no i działa na obu mpu👍 

Czym jest to DMP? Jaką ma przewagę nad zwykłym odczytem raw??

15 minut temu, farmaceuta napisał:

Czym jest to DMP? Jaką ma przewagę nad zwykłym odczytem raw??

DMP jest dodatkowym procesorem wbudowanym w MPU6050, który np. może  dostarczyć  gotowe kąty. Nie potrzeba się samemu męczyć z filtrem komplementarnym, czy filtrem Kalmana. 

  • Pomogłeś! 1
2 godziny temu, farmaceuta napisał:

jesli zresetuje esp to juz nie ma komunikacji z nowym mpu

Nic dziwnego - MPU został prawdopodobnie w jakimś dziwnym stanie w połowie transmisji.

Taki kawałek kodu gdzieś podejrzany:

int I2C_ClearBus() {
#if defined(TWCR) && defined(TWEN)
        TWCR &= ~(_BV(TWEN)); //Disable the Atmel 2-Wire interface so we can control the SDA and SCL pins directly
#endif

        pinMode(SDA, INPUT_PULLUP); // Make SDA (data) and SCL (clock) pins Inputs with pullup.
        pinMode(SCL, INPUT_PULLUP);

  // delay(2500);  // Wait 2.5 secs. This is strictly only necessary on the first power
  // up of the DS3231 module to allow it to initialize properly,
  // but is also assists in reliable programming of FioV3 boards as it gives the
  // IDE a chance to start uploaded the program
  // before existing sketch confuses the IDE by sending Serial data.

        boolean SCL_LOW = (digitalRead(SCL) == LOW); // Check is SCL is Low.
        if (SCL_LOW) { //If it is held low Arduno cannot become the I2C master.
                return 1; //I2C bus error. Could not clear SCL clock line held low
        }

        boolean SDA_LOW = (digitalRead(SDA) == LOW);  // vi. Check SDA input.
        int clockCount = 20; // > 2x9 clock

        while (SDA_LOW && (clockCount > 0)) { //  vii. If SDA is Low,
                clockCount--;
  // Note: I2C bus is open collector so do NOT drive SCL or SDA high.
                pinMode(SCL, INPUT); // release SCL pullup so that when made output it will be LOW
                pinMode(SCL, OUTPUT); // then clock SCL Low
                delayMicroseconds(10); //  for >5uS
                pinMode(SCL, INPUT); // release SCL LOW
                pinMode(SCL, INPUT_PULLUP); // turn on pullup resistors again
    // do not force high as slave may be holding it low for clock stretching.
                delayMicroseconds(10); //  for >5uS
    // The >5uS is so that even the slowest I2C devices are handled.
                SCL_LOW = (digitalRead(SCL) == LOW); // Check if SCL is Low.
                int counter = 20;
                while (SCL_LOW && (counter > 0)) {  //  loop waiting for SCL to become High only wait 2sec.
                        counter--;
                        delay(100);
                        SCL_LOW = (digitalRead(SCL) == LOW);
                }
                if (SCL_LOW) { // still low after 2 sec error
                        return 2; // I2C bus error. Could not clear. SCL clock line held low by slave clock stretch for >2sec
                }
                SDA_LOW = (digitalRead(SDA) == LOW); //   and check SDA input again and loop
        }
        if (SDA_LOW) { // still low
                return 3; // I2C bus error. Could not clear. SDA data line held low
        }

  // else pull SDA line low for Start or Repeated Start
        pinMode(SDA, INPUT); // remove pullup.
        pinMode(SDA, OUTPUT);  // and then make it LOW i.e. send an I2C Start or Repeated start control.
  // When there is only one I2C master a Start or Repeat Start has the same function as a Stop and clears the bus.
  /// A Repeat Start is a Start occurring after a Start with no intervening Stop.
        delayMicroseconds(10); // wait >5uS
        pinMode(SDA, INPUT); // remove output low
        pinMode(SDA, INPUT_PULLUP); // and make SDA high i.e. send I2C STOP control.
        delayMicroseconds(10); // x. wait >5uS
        pinMode(SDA, INPUT); // and reset pins as tri-state inputs which is the default state on reset
        pinMode(SCL, INPUT);
        return 0; // all ok
}

Wywołujesz w setup() gdzieś na początku, w każdym razie przed Wire.begin()

 

  • Lubię! 1
  • Pomogłeś! 1
2 godziny temu, farmaceuta napisał:

jesli podczas pracy wyciagne stary z plytki stykowej i wepne nowy

Wymiana modułów pod napięciem nie jest dobrą praktyką. Nie mamy kontroli nad kolejnością pojawiania się napięć na poszczególnych nóżkach i może się pojawić sekwencja której moduł nie lubi.

  • Lubię! 1
49 minut temu, jand napisał:

Wymiana modułów pod napięciem nie jest dobrą praktyką. Nie mamy kontroli nad kolejnością pojawiania się napięć na poszczególnych nóżkach i może się pojawić sekwencja której moduł nie lubi.

No tak tak, ja to rozumiem, tak tylko z pośpiechu zamieniałem...po resecie, czy resecie napięcia nowy mpu nie działał...może to klon klona, bo rozmiarem oba mpu się różnią (chip) 

@ethanak spróbuję wieczorem jak odpalę kompa 👍

@jand a polecisz coś dla HMC5883? Bo tutaj też mam problemy z bibliotekami...akurat te w których nie ma kalibracji chodzą...☹️ 

Ta od Ciebie (i2cdev) ma obsługę hmc, ale jest strasznie uboga w funkcje...próbowałem dołożyć prostą kalibrację (skopiowaną od Jarzębski) ale nie wiele to pomogło...kompas dalej przekłamuje...🤔

  • 1 miesiąc później...
(edytowany)
Dnia 8.06.2025 o 16:55, jand napisał:
Dnia 8.06.2025 o 16:32, farmaceuta napisał:

Czym jest to DMP? Jaką ma przewagę nad zwykłym odczytem raw??

DMP jest dodatkowym procesorem wbudowanym w MPU6050, który np. może  dostarczyć  gotowe kąty. Nie potrzeba się samemu męczyć z filtrem komplementarnym, czy filtrem Kalmana. 

Tak tylko lekko związane z tematem. W tyle głowy miałem (odkąd zajrzałem na stronę BMI160) bibliotekę Boscha do integracji żyroskopu i akcelerometru i w sumie niedawno sprawdziłem, no jest. Nawet nadaje się na handel, licencja pozwala, ale tylko ze sprzętem Boscha (w sumie nie zagłębiałem się, może wystarczy przylutować układ od nich, ale go nie używać, byle był :D). Wykorzystuje filtr Kalmana, jest kalibracja (półautomatyczna powiedzmy). Tylko są ograniczenia, np. 100 Hz wejścia/wyjścia, tylko akcelerometr i żyroskop. No i biblioteka jest pre-kompilowana - tylko ARM CortexM0(+)/1/2/3/4/7/33 jakieś A. Na pierwszy rzut oka działa elegancko, jeśli nie potrzebujesz magnetometru. Nie interesuje ją z jakiego układu surowe dane pochodzą, byle były metry na sekundę kwadrat i radiany na sekundę. Wypluwa kwaterniony i kąty Eulera (te zaś nas interesują najbardziej :D). Pracuje ona na mikrokontrolerze, ale jest okrojoną wersją tej co działa na inteligentnych czipach IMU, jak np. BHI360. Nie sprawdzałem jak sprawdza się np. przy robocie balansującym, itp. Za darmo to uczciwa cena.

Edytowano przez matsobdev

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...