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