Pages: [1] 2 3   Go Down
Author Topic: IMU 10 DOF Drotek - MPU6050  (Read 1547 times)
0 Members and 1 Guest are viewing this topic.
Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao ragazzi!
Ho acquistato questa imu per iniziare a studiare un po' sull'orientamento, ma non mi è chiara una cosa.
Sul sito forniscono gli indirizzi I2C dei singoli sensori, ho quindi pensato che questi vadano inseriti in una variabile all'interno del codice che, nel caso dell' MPU6050 dovrebbe essere MPU6050_ADDRESS. Ho fatto un po' di prove ma la comunicazione non avviene..
Ecco il codice:
Code:
// I2C device class (I2Cdev) demonstration Arduino sketch for MPU6050 class
// 10/7/2011 by Jeff Rowberg <jeff@rowberg.net>
// Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib
//
// Changelog:
//     2011-10-07 - initial release

/* ============================================
I2Cdev device library code is placed under the MIT license
Copyright (c) 2011 Jeff Rowberg

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
===============================================
*/

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

// 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"

----->QUI DOVREI DEFINIRE L'INDIRIZZO<--------

// 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;

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

#define LED_PIN 13
bool blinkState = false;

void setup() {
    // join I2C bus (I2Cdev library doesn't do this automatically)
    Wire.begin();

    // 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(9600);

    // 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 for
    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);

    // 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);

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

Qualcuno in grado di darmi una dritta? Come vedete sono completamente a terra!
Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 266
Posts: 21662
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Prova con lo sketch I2C scanner e vedi quali indirizzi ci sono presenti sul bus.
https://github.com/brokenlcd/Arduino-Sketches/blob/master/I2C_scanner/I2C_scanner.pde
Ciao Uwe
Logged

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
Scanning...
I2C device found at address 0x69  !
I2C device found at address 0x77  !
done
Non dovrei averne 3 di indirizzi?
0x69 suppongo sia quello dell'MPU, nella libreria ho visto infatti che l'indirizzo di defaul è 68 mentre si usa 69 se AD0 è high.
Ho quindi provato ad inserire #define MPU6050_ADDRESS_AD0_HIGH    ma niente, magari sbaglio proprio la sintassi..

I collegamenti dovrebbero essere giusti: 5V e massa a quelli arduino, SDA ed SCL rispettivamente agli analogici 4 e 5. I collegamenti per il potenziale non dovrei mai averli cambiati che io ricordi, quindi mi sentirei di escludere la possibilità di qualche danno legato ad un errore fatto su questi ultimi.

Se può servire, questo è l'output del codice dell'MPU:
Code:
Initializing I2C devices...
Testing device connections...
MPU6050 connection failed
a/g: 0 0 0 0 0 0
a/g: 0 0 0 0 0 0
a/g: 0 0 0 0 0 0
a/g: 0 0 0 0 0 0
a/g: 0 0 0 0 0 0
a/g: 0 0 0 0 0 0
[...]

Logged

Tuscany
Offline Offline
Edison Member
*
Karma: 77
Posts: 2110
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma un semplice
#define MPU6050_ADDRESS 0X69
Logged

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma un semplice
#define MPU6050_ADDRESS 0X69
Già provato, ma rimane uguale.

Ho provato anche l'altimetro con un altro codice:
Code:
#include <Wire.h>
//#include <DebugUtils.h>
#include <MS561101BA.h>

MS561101BA baro = MS561101BA();

void setup() {
  Wire.begin();
  Serial.begin(9600);
  delay(1000);

  // Suppose that the CSB pin is connected to GND.
  // You'll have to check this on your breakout schematics
  baro.init(MS561101BA_ADDR_CSB_LOW);
}

void loop() {
  float temperature = NULL, pression = NULL;
  Serial.print("temp: ");
  while(temperature == NULL) {
    temperature = baro.getTemperature(MS561101BA_OSR_4096);
  }
  Serial.print(temperature);
 
  Serial.print(" degC pres: ");
  while(pression == NULL) {
    pression = baro.getPressure(MS561101BA_OSR_4096);
    //Serial.println(baro.lastTempConv);
    //Serial.println(baro.lastPresConv);
    //Serial.println("aaa");
  }
  Serial.print(pression);
  Serial.println(" mbar");
}

L'output si è ora stabilizzato dopo 15 minuti a temp: 14.28 degC pres: 1634.59 mbar
Il termometro sembra essere coerente con le temperature interne ed esterne. ma i dati della stazione metereologica di torino indicano una pressione di 974.5 hPa.

Non ne vuole sapere neanche il magnetometro, i valori rimangono sempre uguali:
Code:
/*
An Arduino code example for interfacing with the HMC5883

by: Jordan McConnell
 SparkFun Electronics
 created on: 6/30/11
 license: OSHW 1.0, http://freedomdefined.org/OSHW

Analog input 4 I2C SDA
Analog input 5 I2C SCL
*/

#include <Wire.h> //I2C Arduino Library

#define address 0x1E //0011110b, I2C 7bit address of HMC5883

void setup(){
  //Initialize Serial and I2C communications
  Serial.begin(9600);
  Wire.begin();
 
  //Put the HMC5883 IC into the correct operating mode
  Wire.beginTransmission(address); //open communication with HMC5883
  Wire.send(0x02); //select mode register
  Wire.send(0x00); //continuous measurement mode
  Wire.endTransmission();
}

void loop(){
 
  int x,y,z; //triple axis data

  //Tell the HMC5883 where to begin reading data
  Wire.beginTransmission(address);
  Wire.send(0x03); //select register 3, X MSB register
  Wire.endTransmission();
 
 
 //Read data from each axis, 2 registers per axis
  Wire.requestFrom(address, 6);
  if(6<=Wire.available()){
    x = Wire.receive()<<8; //X msb
    x |= Wire.receive(); //X lsb
    z = Wire.receive()<<8; //Z msb
    z |= Wire.receive(); //Z lsb
    y = Wire.receive()<<8; //Y msb
    y |= Wire.receive(); //Y lsb
  }
 
  //Print out values of each axis
  Serial.print("x: ");
  Serial.print(x);
  Serial.print("  y: ");
  Serial.print(y);
  Serial.print("  z: ");
  Serial.println(z);
 
  delay(250);
}
(anche qui ho provato a cambiare gli indirizzi con 30,69,77..)


Insoma non posso prendere nessun dato da questa IMU smiley-sweat
Logged

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nessuno riesce ad aiutarmi? smiley-sad
Ho finito ora la sessione di esami e vorrei usufruire di questa settimana per fare qualcosina !
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7126
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Prova con quest'altra versione dello scanner --> http://playground.arduino.cc/Main/I2cScanner
Usa i metodi della libreria Wire non non direttamente quelli della libreria twi.

Code:
// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//

#include <Wire.h>


void setup()
{
  Wire.begin();

  Serial.begin(9600);
  Serial.println("\nI2C Scanner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknow error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}
« Last Edit: February 26, 2014, 06:02:42 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
I2C Scanner
Scanning...
I2C device found at address 0x69  !
I2C device found at address 0x77  !
done

Stessa cosa di prima!
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7126
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sul sito Drotek è riportato
Quote
Adresses I2C des capteurs:
MPU6050 -> 105
MS5611 -> 119
HMC5883 -> 30

Quindi gli indirizzi esadecimali: 0x69, 0x77, 0x1E.
Quindi 2 su 3 rispondono.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Switzerland
Online Online
Faraday Member
**
Karma: 114
Posts: 5962
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma ... guardando i datasheet ... non mi sembra che gli input siano 5V tolerant ... hai messo degli adattatori di livello su SCL e SDA ?  Perché , secondo me, collegando come fanno vedere loro, si danneggiano solo i componenti ...  smiley-roll

Guglielmo
Logged

Search is Your friend ... or I am Your enemy !

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7126
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Purtroppo ha ragione Guglielmo. La I2C deve lavorare a 3V3 e i pin non sono 5V tolerant.
Sul sito non è ben specificato.
Io contatterei la Drotek per contrattare un cambio della scheda.

EDIT: Con la nuova scheda fatti regalare anche uno di questi --> http://www.drotek.fr/shop/en/home/37-i2c-level-shifter.html  smiley-wink
« Last Edit: February 26, 2014, 06:46:14 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si, ma a parte il fatto che uno dei due non risponde non riesco a comunicarci..

Ricapitolo:
 
Il barometro MS5611 che sta al 0x77 mi sa che mi da dei dati un po' incoerenti:
Code:
#include <Wire.h>
//#include <DebugUtils.h>
#include <MS561101BA.h>

MS561101BA baro = MS561101BA();

void setup() {
  Wire.begin();
  Serial.begin(115200);
  delay(1000);

  // Suppose that the CSB pin is connected to GND.
  // You'll have to check this on your breakout schematics
  baro.init(MS561101BA_ADDR_CSB_LOW);
}

void loop() {
  float temperature = NULL, pression = NULL;
  Serial.print("temp: ");
  while(temperature == NULL) {
    temperature = baro.getTemperature(MS561101BA_OSR_4096);
  }
  Serial.print(temperature);
 
  Serial.print(" degC pres: ");
  while(pression == NULL) {
    pression = baro.getPressure(MS561101BA_OSR_4096);
    //Serial.println(baro.lastTempConv);
    //Serial.println(baro.lastPresConv);
    //Serial.println("aaa");
  }
  Serial.print(pression);
  Serial.println(" mbar");
}

Posizionandolo sul davanzale della finestra dopo un po' (almeno 10 minuti) la temperatura non rimane stabile.. Ora tende ad abbassare, ora tende ad alzare.. Aveva raggiunto i 7° ma ora sta a 9. Mentre la pressione fa la stessa cosa tra i 1660 e 1679 mbar
A torino dovrei avere 5.4°C e 988hPa
La cosa strana è che comunque la differenza di temperatura entrandolo e uscendolo la rileva, quindi comunque funziona..


L'MPU6050 gyro+acc invece non da niente:
Code:
#include "Wire.h"

// 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"

// 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;

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

#define LED_PIN 13
bool blinkState = false;

void setup() {
    // join I2C bus (I2Cdev library doesn't do this automatically)
    Wire.begin();

    // 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(115200);

    // 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 for
    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);

    // 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);

    // blink LED to indicate activity
    blinkState = !blinkState;
    digitalWrite(LED_PIN, blinkState);
}
Code:
a/g:   0   0   0   0   0   0
Logged

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Purtroppo ha ragione Guglielmo. La I2C deve lavorare a 3V3 e i pin non sono 5V tolerant.
Sul sito non è ben specificato.
Io contatterei la Drotek per contrattare un cambio della scheda.

EDIT: Con la nuova scheda fatti regalare anche uno di questi --> http://www.drotek.fr/shop/en/home/37-i2c-level-shifter.html  smiley-wink

Ma.. ma..  smiley-cry
Eppure li avevo letti un pochino quelli dei singoli componenti, pensavo che poi la scheda facesse il resto!!

Dite di contattare la drotek? Io l'avevo comprata da ebay..
Logged

Offline Offline
Full Member
***
Karma: 3
Posts: 115
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi sembra di aver letto che la mpu 6050 ha dei pin xda e xcl dove possono essere collegati altri sensori via 2 wire, non vorrei sbagliare ma può essere una possibilità . Si spiegherebbe anche perchè  non vedi l' altro sensore.
Logged

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 87
Posts: 4958
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma sul loro sito c'e' questa immagine con Arduino Mini Pro 5V:

Mi sembra che la board abbia di suo un regolatore, mentre i singoli chip sono a 3v3
Logged

my name is IGOR, not AIGOR

Pages: [1] 2 3   Go Up
Jump to: