Go Down

Topic: Devolver un array de una funcion (Read 1 time) previous topic - next topic

aasanchez

Estoy trabajando este codigo...
Code: [Select]

/* IMU Fusion Board - ADXL345 & IMU3000
   Example Arduino Sketch to read the Gyro and Accelerometer Data
 
   Written by www.hobbytronics.co.uk
   See the latest version at www.hobbytronics.co.uk/arduino-adxl345-imu3000
   08-Apr-2011
*/

#define GYRO 0x68         // gyro I2C address
#define REG_GYRO_X 0x1D   // IMU-3000 Register address for GYRO_XOUT_H
#define ACCEL 0x53        // Accel I2c Address
#define ADXL345_POWER_CTL 0x2D

byte buffer[12];   // Array to store ADC values
int gyro_x;
int gyro_y;
int gyro_z;
int accel_x;
int accel_y;
int accel_z;
int i;
#include <Wire.h>

void setup()
{
    Serial.begin(9600);
   
    Wire.begin();
    // Set Gyro settings
    // Sample Rate 1kHz, Filter Bandwidth 42Hz, Gyro Range 500 d/s
    writeTo(GYRO, 0x16, 0x0B);       
    //set accel register data address
    writeTo(GYRO, 0x18, 0x32);     
    // set accel i2c slave address
    writeTo(GYRO, 0x14, ACCEL);     
   
    // Set passthrough mode to Accel so we can turn it on
    writeTo(GYRO, 0x3D, 0x08);     
    // set accel power control to 'measure'
    writeTo(ACCEL, ADXL345_POWER_CTL, 8);     
    //cancel pass through to accel, gyro will now read accel for us   
    writeTo(GYRO, 0x3D, 0x28);   

}

// Write a value 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
}

void loop()
{
    // Read the Gyro X, Y and Z and Accel X, Y and Z all through the gyro
   
    // First set the register start address for X on Gyro 
    Wire.beginTransmission(GYRO);
    Wire.send(REG_GYRO_X); //Register Address GYRO_XOUT_H
    Wire.endTransmission();

    // New read the 12 data bytes
    Wire.beginTransmission(GYRO);
    Wire.requestFrom(GYRO,12); // Read 12 bytes
    i = 0;
    while(Wire.available())
    {
        buffer[i] = Wire.receive();
        i++;
    }
    Wire.endTransmission();

    //Combine bytes into integers
    // Gyro format is MSB first
    gyro_x = buffer[0] << 8 | buffer[1];
    gyro_y = buffer[2] << 8 | buffer[3];
    gyro_z = buffer[4] << 8 | buffer[5];
    // Accel is LSB first. Also because of orientation of chips
    // accel y output is in same orientation as gyro x
    // and accel x is gyro -y
    accel_y = buffer[7] << 8 | buffer[6];
    accel_x = buffer[9] << 8 | buffer[8];
    accel_z = buffer[11] << 8 | buffer[10];

    // Print out what we have
    Serial.print(gyro_x);  // echo the number received to screen
    Serial.print(",");
    Serial.print(gyro_y);  // echo the number received to screen
    Serial.print(",");   
    Serial.print(gyro_z);  // echo the number received to screen
    Serial.print(",");     
    Serial.print(accel_x);  // echo the number received to screen
    Serial.print(",");
    Serial.print(accel_y);  // echo the number received to screen
    Serial.print(",");   
    Serial.print(accel_z);  // echo the number received to screen   

    Serial.println("");     // prints carriage return
    delay(400);             // wait for a second   
}


Y funciona perfectamente, pero ahora deseo convertir el proceso de pedir la data al IMU, en una funcion ya que lo necesitare varias veces durante la ejecucion de mi codigo final, pense en hacer esto...

Code: [Select]

#define GYRO 0x68         // Direccion del Giroscopo para I2C
#define REG_GYRO_X 0x1D   // Direccion para GYRO_XOUT_H en el IMU-3000
#define ACCEL 0x53        // Direccion del Acelerometro para I2C
#define ADXL345_POWER_CTL 0x2D

byte buffer[12];   // Array para almacenar los valdores del ADC
int IMU[5];
int gyro_x;
int gyro_y;
int gyro_z;
int accel_x;
int accel_y;
int accel_z;
int i;


#include <Wire.h>

void setup(){
  Serial.begin(9600);

  Wire.begin();
  // Configuramos el Giroscopo
  // Velocidad de Muestreo 1kHz, Filtro de ancho de banda 42Hz, Rango del Girospoco 500 d/s
  writeTo(GYRO, 0x16, 0x0B);       
  //Establecer la direccion del acelerometro
  writeTo(GYRO, 0x18, 0x32);     
  //Setear el acelerometro como esclavo
  writeTo(GYRO, 0x14, ACCEL);     

  // Ajuste el modo de paso a través de Accelerometro para que podamos encenderlo
  writeTo(GYRO, 0x3D, 0x08);     
  // establecer el control de aceleración poder para 'medir'
  writeTo(ACCEL, ADXL345_POWER_CTL, 8);     
  //cancelar el pasar a través del acelerometro, el Giroscopo ahora leerá aceleración para nosotros
  writeTo(GYRO, 0x3D, 0x28);   

}

// Funcion para escribir un valor en una direccion en un dispositivo especifico
void writeTo(int device, byte address, byte val) {
  Wire.beginTransmission(device); // Comienza la transmision
  Wire.send(address);             // Envia la direccion
  Wire.send(val);                 // Envia el valor
  Wire.endTransmission();         // Finaliza la transmision
}

int getIMU(){
  int IMUtemp[5];
  // Read the Gyro X, Y and Z and Accel X, Y and Z all through the gyro
  // First set the register start address for X on Gyro 
  Wire.beginTransmission(GYRO);
  Wire.send(REG_GYRO_X); //Register Address GYRO_XOUT_H
  Wire.endTransmission();

  // New read the 12 data bytes
  Wire.beginTransmission(GYRO);
  Wire.requestFrom(GYRO,12); // Read 12 bytes
  i = 0;
  while(Wire.available()){
    buffer[i] = Wire.receive();
    i++;
  }
  Wire.endTransmission();

  //Combine bytes into integers
  // Gyro format is MSB first
  IMUtemp[0] = buffer[0] << 8 | buffer[1];
  IMUtemp[1] = buffer[2] << 8 | buffer[3];
  IMUtemp[2] = buffer[4] << 8 | buffer[5];
  // Accel is LSB first. Also because of orientation of chips
  // accel y output is in same orientation as gyro x
  // and accel x is gyro -y
  IMUtemp[3] = buffer[7] << 8 | buffer[6];
  IMUtemp[4] = buffer[9] << 8 | buffer[8];
  IMUtemp[5] = buffer[11] << 8 | buffer[10];
  return IMUtemp;
}

void loop(){
  IMU = getIMU();
}


Pero me arroja el siguiente resultado...
Quote

Arduino.cpp: In function 'int getIMU()':
Arduino.cpp:89:10: error: invalid conversion from 'int*' to 'int'
Arduino.cpp: In function 'void loop()':
Arduino.cpp:93:16: error: incompatible types in assignment of 'int' to 'int [5]'


Alguien puede orientarme en por que da este error???


aasanchez

basicamente necesito algo como esto

Code: [Select]

void valores(){
    int a() = {14,2,4,5,6,7};
    return a
}


como puedo hacer algo asi... y como acceder a esa funcion... y que me retorne un array...

Go Up