IMU 10 DOF Drotek - MPU6050

ma un semplice
#define MPU6050_ADDRESS 0X69

Brunello:
ma un semplice
#define MPU6050_ADDRESS 0X69

Già provato, ma rimane uguale.

Ho provato anche l'altimetro con un altro codice:

#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:

/*
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 :sweat_smile:

Nessuno riesce ad aiutarmi? :frowning:
Ho finito ora la sessione di esami e vorrei usufruire di questa settimana per fare qualcosina !

Prova con quest'altra versione dello scanner --> Arduino Playground - I2cScanner
Usa i metodi della libreria Wire non non direttamente quelli della libreria twi.

// --------------------------------------
// 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
}
I2C Scanner
Scanning...
I2C device found at address 0x69  !
I2C device found at address 0x77  !
done

Stessa cosa di prima!

Sul sito Drotek è riportato

Adresses I2C des capteurs:
MPU6050 -> 105
MS5611 -> 119
HMC5883 -> 30

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

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

Guglielmo

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 :wink:

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:

#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:

#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);
}
a/g:   0   0   0   0   0   0

PaoloP:
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 :wink:

Ma.. ma.. =(
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..

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.

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

Sulla pagina linkata vedo 3 indirizzi:

I2C address of sensors:

MPU6050 -> 105

MS5611 -> 119

HMC5883 -> 30

Essi sono in esadecimale $69, $77 e $1E.
Se uno dei 3 sensori non risponde o sono diversi gli indirizzi oppure potrebbe essere difettoso.

Quindi quello che non risponde è il HMC5883

Qui se ne parla, ma è un post vecchio e l'utente pare non sia attivo da allora. Inoltre l'unico codice che cita è quello di fabio varesano che mi sa che è uguale al mio..

Ribadendo che stai facendo lavorare il tutto FUORI dalle specifiche (guardate i datasheet e vedrete che .... MS5611 ha una tensione di alimentazione MASSIMA di 4.0V ... e, come sapete dai massimi occorre stare lontani, tanto è vero che danno la massima operativa a 3.6V, mentre il HMC5883 riporta una tensione di alimentazione MASSIMA di 4.8V e operativa massima di 3.6) ... il che sarà prima o poi causa di guasti (@Nid: il loro disegno d'uso è sbagliato), comunque ...

... se guardate lo schema di montaggio vedete che la gestione del HMC5883 è demandata al MPU6050 ... difatti, i pin SDL e SDA del HMC5883, non sono collegati assieme a tutti gli altri a SCL_3.3 e SDA_3.3, ma bensì alle entrate ausiliarie del MPU6050 SDA_AUX e SCL_AUX ... quindi ... il HMC5883 NON lo vedi tu sul bus I2C, ma ne legge i dati la MPU6050.

Per i dettagli ... QUI da pagina 26 in poi ... :slight_smile:

Guglielmo

P.S. : Ovviamente le alimentazioni, sulla scheda sono giustamente portate a 3.3V ... il problema è che SCL e SDA non possono gestire tensioni sopra la tensione di alimentazione ... ovvero sopra i massimi su indicati ovvero sopra i 3.3V visto che a 3.3V i chip sono alimentati ...

Ah ... non per nulla, sullo schema ... i pin si chiamano SCL_3.3 e SDA_3.3 ... perché vanno fatti lavorare a 3.3V :wink:

Guglielmo

gpb01:
... il che sarà prima o poi causa di guasti (@Nid: il loro disegno d'uso è sbagliato), comunque ...

Complimentoni a loro e ai loro schemi di collegamento. E poi ci lamentiamo dei cinesi :grin:

gpb01:
Ah ... non per nulla, sullo schema ... i pin si chiamano SCL_3.3 e SDA_3.3 ... perché vanno fatti lavorare a 3.3V :wink:

Guglielmo

Quindi andava messo qualcosa tra i pin scl ed sda e quelli di arduino no?
Un semplice partitore di tensione sarebbe andato bene?

E quindi come la metto con quelli della drotek? :cold_sweat:
Eventualmente avete qualche scheda migliore da consigliarmi che integri tutto?

Mi sa che Guglielmo ha colto nel segno perché sempre nella pagina linkata si legge ad un certo punto in un esempio di codice:

 #define MPU6050_ADDRESS 0X69
  #define MPU6050_I2C_AUX_MASTER // MAG connected to the AUX I2C bus of MPU6050

Che parrebbe confermare quanto detto sul ruolo dell'MPU6050 che fa da interfaccia dell'altro sensore.