Skocz do zawartości

Pomocna odpowiedź

Napisano (edytowany)

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

@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)?

(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

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

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
(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

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? 

  • Lubię! 1

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...