Go Down

Topic: Ayuda con 9dof GY_85 ITG3205 + ADXL345 + HMC5883L (Read 1 time) previous topic - next topic


Buenos dias, soy nuevo en el foro y despues de mucho buscar no pude encontrar una solucion a mi problema...
les cuento, tengo un arduino nano y un gy_85 que compre de dx.com

despues de seguir este tutorial http://www.rcgroups.com/forums/showthread.php?t=1677559 pude hacer andar todo eso, pero me gustaria usar ese codigo para tener toda la data de los 9 sensores en la terminal para usar con otros programas. El problema es que los codigos que encontre (despues de varias horas de busqueda) casi siempre me dan error, o tengo que hacer malabares para que anden de una vercion de arduino IDE o la anterior.

Alguien me puede ayudar a entender el codigo de ese thread, porque se me hace imposible segur donde es que estan los adress de los sensores para llamarlos a todos por i2c

Por el momento tengo 2 chips andando, pero en sketchs separados, tambien me gustaria si alguien puede ayudarme a recompilar estos 2 sketchs en uno solo

dejo el codigo usado aca


Code: [Select]
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
  //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

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

  //Tell the HMC5883 where to begin reading data
  Wire.send(0x03); //select register 3, X MSB register

//Read data from each axis, 2 registers per axis
  Wire.requestFrom(address, 6);
    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(" ");
  Serial.print("Y ");
  Serial.print(" ");
  Serial.print("Z ");
  Serial.print(" ");

Code: [Select]
#include <Wire.h>

#define DEVICE (0x53)    //ADXL345 device address
#define TO_READ (6)        //num of bytes we are going to read each time (two bytes for each axis)

byte buff[TO_READ] ;    //6 bytes buffer for saving data read from the device
char str[512];                      //string buffer to transform data before sending it to the serial port

void setup()
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output
  //Turning on the ADXL345
  writeTo(DEVICE, 0x2D, 0);     
  writeTo(DEVICE, 0x2D, 16);
  writeTo(DEVICE, 0x2D, 8);

void loop()
  int regAddress = 0x32;    //first axis-acceleration-data register on the ADXL345
  int x, y, z;
  readFrom(DEVICE, regAddress, TO_READ, buff); //read the acceleration data from the ADXL345
   //each axis reading comes in 10 bit resolution, ie 2 bytes.  Least Significat Byte first!!
   //thus we are converting both bytes in to one int
  x = (((int)buff[1]) << 8) | buff[0];   
  y = (((int)buff[3])<< 8) | buff[2];
  z = (((int)buff[5]) << 8) | buff[4];
  //we send the x y z values as a string to the serial port
  sprintf(str, "%d %d %d", x, y, z); 
  Serial.print(10, BYTE);
  //It appears that delay is needed in order not to clog the port

//---------------- Functions
//Writes val to address register on device
void writeTo(int device, byte address, byte val) {
   Wire.beginTransmission(device); //start transmission to device
   Wire.send(address);        // send register address
   Wire.send(val);        // send value to write
   Wire.endTransmission(); //end transmission

//reads num bytes starting from address register on device in to buff array
void readFrom(int device, byte address, int num, byte buff[]) {
  Wire.beginTransmission(device); //start transmission to device
  Wire.send(address);        //sends address to read from
  Wire.endTransmission(); //end transmission
  Wire.beginTransmission(device); //start transmission to device
  Wire.requestFrom(device, num);    // request 6 bytes from device
  int i = 0;
  while(Wire.available())    //device may send less than requested (abnormal)
    buff[i] = Wire.receive(); // receive a byte
  Wire.endTransmission(); //end transmission

Tengo que tener a ambos corriendo en el mismo sketch para hacer lo que quiero

espero me puedan ayudar, Gracias, Andres


Resuelto :)

Code: [Select]

#include "Wire.h"

#include "I2Cdev.h"
#include "ADXL345.h"
#include "HMC5883L.h"
#include "ITG3200.h"

HMC5883L mag;
ITG3200 gyro;

int16_t mx, my, mz;
int16_t gx, gy, gz;

// class default I2C address is 0x53
// specific I2C addresses may be passed as a parameter here
// ALT low = 0x53 (default for SparkFun 6DOF board)
// ALT high = 0x1D
ADXL345 accel;

int16_t ax, ay, az;

#define LED_PIN 13 // (Arduino is 13, Teensy is 6)
bool blinkState = false;

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

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

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

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

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

          Serial.println("Testing device connections...");
    Serial.println(mag.testConnection() ? "HMC5883L connection successful" : "HMC5883L connection failed");


void loop() {
    // read raw accel measurements from device
    accel.getAcceleration(&ax, &ay, &az);
        mag.getHeading(&mx, &my, &mz);
            gyro.getRotation(&gx, &gy, &gz);

    // display tab-separated accel x/y/z values
    Serial.print("accelga ");
    Serial.print(ax); Serial.print(" ");
    Serial.print(ay); Serial.print(" ");
    Serial.print(az); Serial.print(" ");
    Serial.print("magenta ");
    Serial.print(mx); Serial.print(" ");
    Serial.print(my); Serial.print(" ");
    Serial.print(mz); Serial.print(" ");
    Serial.print("gyroska ");
    Serial.print(gx); Serial.print(" ");
    Serial.print(gy); Serial.print(" ");
    Serial.print(az); Serial.print(" ");

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

Go Up

Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

via Egeo 16
Torino, 10131