Skocz do zawartości

Problem z Arduino UNO z czujnikiem MPU-6050(GY-521)


Pomocna odpowiedź

Witam, jestem nowy więc nie wiem czy to dobry dział na forum, ale ten najbardziej był adekwatny. Otóż mam problem z komunikacją Arduino UNO z czujnikiem MPU-6050(GY-521).

Głównie problem jest taki, że przy wykorzystywaniu biblioteki pana Jarzębskiego i po odpaleniu serial monitora, wyskakuje błąd:

CheckWiringJarzebski.thumb.PNG.6ba126388cd7b3aec84eda16897bf826.PNG

Pomimo iż, podłączyłem zgodnie z poradnikami, czyli VCC do 5V, SCL do SCL(Bądź A5), SDA do SDA(Bądź A4) oraz INT do pinu Digital 2. 

Ta sama sytuacja następuje przy wykorzystaniu biblioteki Jeffa Rowberga I2Cdev, tak samo próbowałem podpinać i nadal ten sam błąd: 

ConnectionFailedL2Cdev.thumb.PNG.bcd4cd69cb83d6e664257a43e1cd6c50.PNG

Co dziwne, czujnik jest sprawny ponieważ gdy chce wyświetlić surowe dane, to nie ma problemu i mogę je z niego normalnie odczytać.

Edytowano przez MRT141
Link to post
Share on other sites

@MRT141 witam na forum 🙂 Czy do układu masz podłączone coś jeszcze? Jak wygląda problem, który działa poprawnie (i wyświetla surowe dane)?

Link to post
Share on other sites

Jeśli możesz odczytać surowe dane - co zwraca odczyt z rejestru WHO_AM_I (czyli 0x75)?

Link to post
Share on other sites
(edytowany)
24 minuty temu, Treker napisał:

@MRT141 witam na forum 🙂 Czy do układu masz podłączone coś jeszcze? Jak wygląda problem, który działa poprawnie (i wyświetla surowe dane)?

Nie, mam podłączony jedynie MPU-6050, zaczynam zabawę z tym wszystkim i na razie chciałem potestować jak on sam działa. 

A co do kodu, który wyświetla surowe dane to proszę bardzo:

// I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files
// for both classes must be in the include path of your project
#include "I2Cdev.h"
#include "MPU6050.h"

// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
// is used in I2Cdev.h
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
    #include "Wire.h"
#endif

// class default I2C address is 0x68
// specific I2C addresses may be passed as a parameter here
// AD0 low = 0x68 (default for InvenSense evaluation board)
// AD0 high = 0x69
MPU6050 accelgyro;
//MPU6050 accelgyro(0x69); // <-- use for AD0 high

int16_t ax, ay, az;
int16_t gx, gy, gz;



// uncomment "OUTPUT_READABLE_ACCELGYRO" if you want to see a tab-separated
// list of the accel X/Y/Z and then gyro X/Y/Z values in decimal. Easy to read,
// not so easy to parse, and slow(er) over UART.
#define OUTPUT_READABLE_ACCELGYRO

// uncomment "OUTPUT_BINARY_ACCELGYRO" to send all 6 axes of data as 16-bit
// binary, one right after the other. This is very fast (as fast as possible
// without compression or data loss), and easy to parse, but impossible to read
// for a human.
//#define OUTPUT_BINARY_ACCELGYRO


#define LED_PIN 13
bool blinkState = false;

void setup() {
    // join I2C bus (I2Cdev library doesn't do this automatically)
    #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
        Wire.begin();
    #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
        Fastwire::setup(400, true);
    #endif

    // initialize serial communication
    // (38400 chosen because it works as well at 8MHz as it does at 16MHz, but
    // it's really up to you depending on your project)
    Serial.begin(38400);

    // initialize device
    Serial.println("Initializing I2C devices...");
    accelgyro.initialize();

    // verify connection
    Serial.println("Testing device connections...");
    Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");

    // configure Arduino LED pin for output
    pinMode(LED_PIN, OUTPUT);
}

void loop() {
    // read raw accel/gyro measurements from device
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

    // these methods (and a few others) are also available
    //accelgyro.getAcceleration(&ax, &ay, &az);
    //accelgyro.getRotation(&gx, &gy, &gz);

    #ifdef OUTPUT_READABLE_ACCELGYRO
        // display tab-separated accel/gyro x/y/z values
        Serial.print("a/g:\t");
        Serial.print(ax); Serial.print("\t");
        Serial.print(ay); Serial.print("\t");
        Serial.print(az); Serial.print("\t");
        Serial.print(gx); Serial.print("\t");
        Serial.print(gy); Serial.print("\t");
        Serial.println(gz);
    #endif

    #ifdef OUTPUT_BINARY_ACCELGYRO
        Serial.write((uint8_t)(ax >> 8)); Serial.write((uint8_t)(ax & 0xFF));
        Serial.write((uint8_t)(ay >> 8)); Serial.write((uint8_t)(ay & 0xFF));
        Serial.write((uint8_t)(az >> 8)); Serial.write((uint8_t)(az & 0xFF));
        Serial.write((uint8_t)(gx >> 8)); Serial.write((uint8_t)(gx & 0xFF));
        Serial.write((uint8_t)(gy >> 8)); Serial.write((uint8_t)(gy & 0xFF));
        Serial.write((uint8_t)(gz >> 8)); Serial.write((uint8_t)(gz & 0xFF));
    #endif

    // blink LED to indicate activity
    blinkState = !blinkState;
    digitalWrite(LED_PIN, blinkState);
}

 

A to jest wynik: 

rawDataMPU.thumb.PNG.6b660882d1db9dc92f721c363f90865d.PNG

14 minut temu, ethanak napisał:

Jeśli możesz odczytać surowe dane - co zwraca odczyt z rejestru WHO_AM_I (czyli 0x75)?

Przepraszam, ale nie zagłębiałem się w dokumentację tego wszystkiego. To po prostu kod z gotowych przykładów, a o surowe dane chodziło mi o to co powyżej podałem.

Edytowano przez MRT141
Link to post
Share on other sites

Jasne.

Możesz zrobić coś takiego:

W bibliotece jarzebski w pliku MPU6050.cpp masz linijkę (ok. linii 51):

if (fastRegister8(MPU6050_REG_WHO_AM_I) != 0x68)

Wstaw przed nią np. takie coś:

Serial.println((int)fastRegister8(MPU6050_REG_WHO_AM_I), HEX);

i pokaż co wypisze przed informacją o błędnych połączeniach (o ile się nie pomyliłem).

  • Lubię! 1
Link to post
Share on other sites

Coś tu nie pasuje - czy i2cscanner w ogóle to wykrywa na adresie 0x68? Bo to że czytasz "coś" "skądś" nie oznacza jeszcze, że są to prawidłowe dane z MPU6050.

 

  • Lubię! 1
Link to post
Share on other sites
(edytowany)

@ethanak Ahhh, no to chyba wszystko jasne. Szkoda, że wcześniej nie znalazłem tego artykułu. Choć nadruk na moim nie wygląda źle. A kupowałem ze sklepu abc-rc.pl nie mam doświadczenia w takich elektronicznych sklepach, a ten wydawał się całkiem spoko. Dzięki wielkie za poświęcony czas!

154270731_142026787794848_1394230203068767207_n.thumb.jpg.86d6fb2c283c47a60000611a017f0e43.jpg

Edytowano przez MRT141
Link to post
Share on other sites

No i w bibliotece Jarzębskiego w pliku MPU6050.cpp zmieniłem 0x68 na 0x72 i zaczęło wyświetlać dane. 

if (fastRegister8(MPU6050_REG_WHO_AM_I) != 0x72)

adress0x72.thumb.PNG.2d7881a0c9e3053f35d798ed58e1a486.PNG

I mam jeszcze takie pytanie, czy ta podróbka nadaje się do czegoś sensownego? Czy jednak pokusić się o coś innego? 

Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.