MPU6050 funguje přes wire.h NE přes I2Cdev.h

Odpovědět
Uživatelský avatar
Caster
Příspěvky: 380
Registrován: 11 zář 2019, 09:02
Reputation: 0

MPU6050 funguje přes wire.h NE přes I2Cdev.h

Příspěvek od Caster » 29 pro 2019, 17:19

Zkouším vzorový příklad Arduino and MPU6050 Accelerometer and Gyroscope Tutorial na svém Arduino Mini Pro 8 MHz 3.3V a MPU6050 breakout board.

První příklad s knihovnou wire.h, bez přerušení, funguje úplně v pohodě. Na sériovém monitoru vidím data z MPU6050 a pomocí Processing mohu virtuálně otáčet objektem v prostoru.

Když zkusím druhý příklad, knihovna I2Cdev.h a propojím INT pin MPU6050 s D2 pinem Arduina, sériový monitor vypíše:

Initializing I2C devices...
Testing device connections...
MPU6050 connection failed

Send any character to begin DMP programming and demo:
Initializing DMP...
Checking hardware revision...
Revision @ user[16] [6] = 0
Resetting memory bank selection to 0...
>*********** atd

Podle doporučení v programu jsem pro Arduino Pro Mini snížil rychlost terminálu na 19200 bit/s (doporučeno max. 38400 bit/s) a odkomentoval jsem řádek #define OUTPUT_TEAPOT

Nemůže být problém v rychlosti I2C pro Arduino Mini Pro 8Mhz 3.3V viz:

Kód: Vybrat vše

// 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
Netuším také, kde je definována proměnná I2CDEV_IMPLEMENTATION.
Všechny knihovny mám správně naistalovány v adresáři C:\Users\Honza\Documents\Arduino\libraries\MPU6050\src, překlad a nahrání programu funguje bez chyb.

Zkoušel jsem také snížit rychlost I2C na 100 kHz, to ale nepomohlo:

Kód: Vybrat vše

void setup() {
    // join I2C bus (I2Cdev library doesn't do this automatically)
    #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
        Wire.begin();
        Wire.setClock(100000); // 400kHz I2C clock. Comment this line if having compilation difficulties
    #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
        Fastwire::setup(100, true);
    #endif
Nějaký nápad, v čem může být problém ? Četl jsem, že některé MPU6050 posílají jiný identifikační kód, než očekává knihovna I2C viz:

looks like 'Connection Failed' simply queries the device_id (from the WHO AM I Register 0x75. My chip answers with 0x72 not the expected 0x34. Just ignore the 'issue' (or comment it out) and it should work

Bez analyzátoru I2C to ale nemám šanci zjistit.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: MPU6050 funguje přes wire.h NE přes I2Cdev.h

Příspěvek od ondraN » 30 pro 2019, 08:34

https://www.laskarduino.cz/sl-usb8ch-lo ... lu--24mhz/
Ideální prosředek na zjišťování podobných problémů za hubičku ;)

Uživatelský avatar
Caster
Příspěvky: 380
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: MPU6050 funguje přes wire.h NE přes I2Cdev.h

Příspěvek od Caster » 30 pro 2019, 08:56

Díky za tip, snad to zvládne i 3.3 Voltu.

Uživatelský avatar
Caster
Příspěvky: 380
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: MPU6050 funguje přes wire.h NE přes I2Cdev.h

Příspěvek od Caster » 30 pro 2019, 18:10

Trochu jsem pokročil i bez analyzátoru. Zjistil jsem, že program na dotaz Who I Am očekává v knihovně MPU6050.cpp

Kód: Vybrat vše

bool MPU6050::testConnection() {
    return getDeviceID() == 0x34;
}
0x34 je identifikace MPU6050 na adrese 75h bity 1-6 (68h). Přečetl jsem, že můj MPU6050 tam má ale uloženo 0x39 (72h). Přepsal jsem tedy hodnotu výše z 0x34 na 0x39 a program mi již v pohodě hlásí: "MPU6050 connection successful".

Podobný zádrhel asi bude ve vlastním použití DMP (Digital Motion Processor), prověřím a dám vědět ;-).

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů