Accelerometer ADXL345

Post Reply
Ivan
Posts: 4
Joined: Wed Mar 07, 2012 3:09 pm

Accelerometer ADXL345

Post by Ivan » Wed Mar 07, 2012 3:20 pm

Hi,I'm using arduino IDE to program the accelerometer ADXL345, I have 5 accelerometers, but 2 of them give me values differents, How can I know if the accelerometers are damaged or if need different method to calibrate ?
Thanks.

User avatar
techsupport
Site Admin
Posts: 210
Joined: Sat Mar 03, 2012 2:32 pm

Re: Accelerometer ADXL345

Post by techsupport » Wed Mar 07, 2012 3:43 pm

Ivan wrote:Hi,I'm using arduino IDE to program the accelerometer ADXL345, I have 5 accelerometers, but 2 of them give me values differents, How can I know if the accelerometers are damaged or if need different method to calibrate ?
Thanks.
Hi, Ivan, thank for your post, please kindly try the following code. :)

Code: Select all

//Add the SPI library so we can communicate with the ADXL345 sensor
#include <SPI.h>

//Assign the Chip Select signal to pin 10.
int CS=10;

//This is a list of some of the registers available on the ADXL345.
//To learn more about these and the rest of the registers on the ADXL345, read the datasheet!
char POWER_CTL = 0x2D;	//Power Control Register
char DATA_FORMAT = 0x31;
char DATAX0 = 0x32;	//X-Axis Data 0
char DATAX1 = 0x33;	//X-Axis Data 1
char DATAY0 = 0x34;	//Y-Axis Data 0
char DATAY1 = 0x35;	//Y-Axis Data 1
char DATAZ0 = 0x36;	//Z-Axis Data 0
char DATAZ1 = 0x37;	//Z-Axis Data 1

//This buffer will hold values read from the ADXL345 registers.
char values[10];
//These variables will be used to hold the x,y and z axis accelerometer values.
int x,y,z;

void setup(){ 
  //Initiate an SPI communication instance.
  SPI.begin();
  //Configure the SPI connection for the ADXL345.
  SPI.setDataMode(SPI_MODE3);
  //Create a serial connection to display the data on the terminal.
  Serial.begin(9600);
  
  //Set up the Chip Select pin to be an output from the Arduino.
  pinMode(CS, OUTPUT);
  //Before communication starts, the Chip Select pin needs to be set high.
  digitalWrite(CS, HIGH);
  
  //Put the ADXL345 into +/- 4G range by writing the value 0x01 to the DATA_FORMAT register.
  writeRegister(DATA_FORMAT, 0x01);
  //Put the ADXL345 into Measurement Mode by writing 0x08 to the POWER_CTL register.
  writeRegister(POWER_CTL, 0x08);  //Measurement mode  
}

void loop(){
  //Reading 6 bytes of data starting at register DATAX0 will retrieve the x,y and z acceleration values from the ADXL345.
  //The results of the read operation will get stored to the values[] buffer.
  readRegister(DATAX0, 6, values);

  //The ADXL345 gives 10-bit acceleration values, but they are stored as bytes (8-bits). To get the full value, two bytes must be combined for each axis.
  //The X value is stored in values[0] and values[1].
  x = ((int)values[1]<<8)|(int)values[0];
  //The Y value is stored in values[2] and values[3].
  y = ((int)values[3]<<8)|(int)values[2];
  //The Z value is stored in values[4] and values[5].
  z = ((int)values[5]<<8)|(int)values[4];
  
  //Print the results to the terminal.
  Serial.print(x, DEC);
  Serial.print(',');
  Serial.print(y, DEC);
  Serial.print(',');
  Serial.println(z, DEC);      
  delay(500); 
}

//This function will write a value to a register on the ADXL345.
//Parameters:
//  char registerAddress - The register to write a value to
//  char value - The value to be written to the specified register.
void writeRegister(char registerAddress, char value){
  //Set Chip Select pin low to signal the beginning of an SPI packet.
  digitalWrite(CS, LOW);
  //Transfer the register address over SPI.
  SPI.transfer(registerAddress);
  //Transfer the desired register value over SPI.
  SPI.transfer(value);
  //Set the Chip Select pin high to signal the end of an SPI packet.
  digitalWrite(CS, HIGH);
}

//This function will read a certain number of registers starting from a specified address and store their values in a buffer.
//Parameters:
//  char registerAddress - The register addresse to start the read sequence from.
//  int numBytes - The number of registers that should be read.
//  char * values - A pointer to a buffer where the results of the operation should be stored.
void readRegister(char registerAddress, int numBytes, char * values){
  //Since we're performing a read operation, the most significant bit of the register address should be set.
  char address = 0x80 | registerAddress;
  //If we're doing a multi-byte read, bit 6 needs to be set as well.
  if(numBytes > 1)address = address | 0x40;
  
  //Set the Chip select pin low to start an SPI packet.
  digitalWrite(CS, LOW);
  //Transfer the starting register address that needs to be read.
  SPI.transfer(address);
  //Continue to read registers until we've read the number specified, storing the results to the input buffer.
  for(int i=0; i<numBytes; i++){
    values[i] = SPI.transfer(0x00);
  }
  //Set the Chips Select pin high to end the SPI packet.
  digitalWrite(CS, HIGH);
}
Your real trustworthy partner in China!!
Email: forum@geeetech.com

Ivan
Posts: 4
Joined: Wed Mar 07, 2012 3:09 pm

Re: Accelerometer ADXL345

Post by Ivan » Wed Mar 07, 2012 5:54 pm

Hi, yes, I used this code and for calculate the angle, add this :

int xAng = map(x, minVal, maxVal, -90, 90);
int yAng = map(y, minVal, maxVal, -90, 90);
int zAng = map(z, minVal, maxVal, -90, 90);

x = RAD_TO_DEG * (atan2(-yAng, -zAng) + PI);
y = RAD_TO_DEG * (atan2(-xAng, -zAng) + PI);
z = RAD_TO_DEG * (atan2(-yAng, -xAng) + PI);

I have correct values with 3 accelerometers from 0 to 360 º ,but with 2 accelerometers the values are bad , Is possible that the acelerometers are damaged ?

User avatar
techsupport
Site Admin
Posts: 210
Joined: Sat Mar 03, 2012 2:32 pm

Re: Accelerometer ADXL345

Post by techsupport » Thu Mar 08, 2012 11:10 am

Ivan wrote:Hi, yes, I used this code and for calculate the angle, add this :

int xAng = map(x, minVal, maxVal, -90, 90);
int yAng = map(y, minVal, maxVal, -90, 90);
int zAng = map(z, minVal, maxVal, -90, 90);

x = RAD_TO_DEG * (atan2(-yAng, -zAng) + PI);
y = RAD_TO_DEG * (atan2(-xAng, -zAng) + PI);
z = RAD_TO_DEG * (atan2(-yAng, -xAng) + PI);

I have correct values with 3 accelerometers from 0 to 360 º ,but with 2 accelerometers the values are bad , Is possible that the acelerometers are damaged ?
we verify your code it shows error,

sketch_mar08a:0: error: 'x' was not declared in this scope
sketch_mar08a:0: error: 'minVal' was not declared in this scope
sketch_mar08a:0: error: 'maxVal' was not declared in this scope
sketch_mar08a:1: error: 'y' was not declared in this scope


Did you use the code we provide to test?
Your real trustworthy partner in China!!
Email: forum@geeetech.com

Ivan
Posts: 4
Joined: Wed Mar 07, 2012 3:09 pm

Re: Accelerometer ADXL345

Post by Ivan » Fri Mar 09, 2012 8:24 am

Hi, I take the min and max values from your code, and put these values in this code.

With this I have the angles, But this only function with some accelerometers, I don't know if the others are damaged or maybe need calibration, can you help me?

#include <SPI.h>
int CS=53;
char POWER_CTL = 0x2D; //Power Control Register
char DATA_FORMAT = 0x31;
char DATAX0 = 0x32; //X-Axis Data 0
char DATAX1 = 0x33; //X-Axis Data 1
char DATAY0 = 0x34; //Y-Axis Data 0
char DATAY1 = 0x35; //Y-Axis Data 1
char DATAZ0 = 0x36; //Z-Axis Data 0
char DATAZ1 = 0x37; //Z-Axis Data 1
char values[10];
int x,y,z,res;

int minVal = -253 ;
int maxVal = 362 ;

void setup(){
SPI.begin();
SPI.setDataMode(SPI_MODE3);
Serial.begin(9600);
pinMode(CS, OUTPUT);
digitalWrite(CS, HIGH);
writeRegister(DATA_FORMAT, 0x01);
writeRegister(POWER_CTL, 0x08);
}
void loop(){
readRegister(DATAX0, 6, values);
x = ((int)values[1]<<8)|(int)values[0];
y = ((int)values[3]<<8)|(int)values[2];
z = ((int)values[5]<<8)|(int)values[4];

int xAng = map(x, minVal, maxVal, -90, 90);
int yAng = map(y, minVal, maxVal, -90, 90);
int zAng = map(z, minVal, maxVal, -90, 90);

x = RAD_TO_DEG * (atan2(-yAng, -zAng) + PI);
y = RAD_TO_DEG * (atan2(-xAng, -zAng) + PI);
z = RAD_TO_DEG * (atan2(-yAng, -xAng) + PI);

Serial.print(x, DEC);
Serial.print(',');
Serial.print(y, DEC);
Serial.print(',');
Serial.println(z, DEC);
delay(10);
}
void writeRegister(char registerAddress, char value){
digitalWrite(CS, LOW);
SPI.transfer(registerAddress);
SPI.transfer(value);
digitalWrite(CS, HIGH);
}
void readRegister(char registerAddress, int numBytes, char * values){
char address = 0x80 | registerAddress;
if(numBytes > 1)address = address | 0x40;

digitalWrite(CS, LOW);
SPI.transfer(address);
for(int i=0; i<numBytes; i++){
values = SPI.transfer(0x00);
}
digitalWrite(CS, HIGH);
}

User avatar
techsupport
Site Admin
Posts: 210
Joined: Sat Mar 03, 2012 2:32 pm

Re: Accelerometer ADXL345

Post by techsupport » Sat Mar 10, 2012 1:37 pm

ok, could you please draw a wiring diagram, we will check it out if there someting wrong with it.
Thanks,
Your real trustworthy partner in China!!
Email: forum@geeetech.com

Ivan
Posts: 4
Joined: Wed Mar 07, 2012 3:09 pm

Re: Accelerometer ADXL345

Post by Ivan » Mon Mar 12, 2012 4:14 am

Hi, this is the diagram

Image


In the arduino mega 2560, the connection for SPI are: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS)

saboor
Posts: 1
Joined: Tue Apr 14, 2015 6:01 pm

Re: Accelerometer ADXL345

Post by saboor » Tue Apr 14, 2015 6:04 pm

Wow, lots of great info in there. Thanks for taking your time to do that.
saboor

Post Reply