I just began using the ADXL345 using the basic code provided here and was getting results output to the Serial Monitor.
// Add the SPI library so we can communicate with the ADXL345 sensor
#include <SPI.h>
// Assign Chip Select to pin 10
int CS = 9;
// 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()
{
Serial.begin(9600);
// Initiate an SPI communication instance
SPI.begin();
// Configure the SPI connection for the ADXL345
SPI.setDataMode(SPI_MODE3);
// Setup 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 +/- 2G range by writing
// 0x00 to the DATA_FORMAT register.
writeRegister(DATA_FORMAT, 0x00);
// Put the ADXL345 into Measurement Mode by writing 0x08 to
// the POWER_CTL register.
writeRegister(POWER_CTL, 0x08);
}
void loop()
{
// Reading 6 bytes of data starting at register DATAX0 will
// retrieve the x,y,z acceleration values
// The results of the read operation will get stored to the values[] buffer.
readRegister(DATAX0, 6, values);
// 10-bit acceleration values are stored as bytes.
// 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(100);
}
// This function will write a value to a register
// 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 address 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);
}
I changed
//Print the results to the terminal.
Serial.print(x, DEC);
into
//Print the results to the terminal.
Serial.print(x);
in order to see what the value of x was without being converted. When I did this the serial monitor began printing all 0,0,0.
Now when I reupload the original code it does not work and first outputs -53,-53,-53 and then continuously prints 0,0,0.
I've tried pressing the reset button on the board, unplugging it, and switching the chip select pin just hoping for something to work again.
Is there some significance to the initial -53,-53,-53 reading, and is there anything I can do to troubleshoot this?
Thanks