O ADXL345 é bem adequado para medidas de aceleração estática da gravidade em aplicações tilt-sensing, bem como aceleração dinâmica resultante do movimento ou choque. Sua alta resolução (4 mG/ LSB) permite a medição de mudanças de inclinação inferiores a 1,0 °.
Várias funções especiais de detecção são fornecidas. A detecção de atividade e inatividade detecta a presença ou ausência de movimento e se a aceleração em qualquer eixo excede um nível definido pelo usuário. Detecção de queda livre detecta se o dispositivo está caindo. Estas funções podem ser mapeados para um dos dois pinos de saída de interrupção.
Este breve tutorial explica em primeiro lugar o que é um acelerômetro, e depois como ligar um para o seu Arduino usando a Biblioteca ADXL345. Estamos nos focando em um ADXL345 acelerômetro eixo triplo.
Este acelerômetro é ótimo para iniciantes, como ele tem boa variedade (até 16G), interface digital (I2C e SPI), e é bastante resistente a vibrações. É realmente fácil de usar, é necessário soldar os pinos para fazer as ligações, coisa bem simples. Ele já possui os capacitores adequados de filtragem e de afinação para você.
Um acelerômetro mede aceleração. Que pode parecer óbvio, no entanto, existem dois tipos de aceleração.
- Aceleração estática - como a gravidade - que é o que você vai usar o seu acelerômetro para medir com mais freqüência.
- Também aceleração dinâmica, que é basicamente o movimento, que normalmente fica no caminho da maioria da nossa inclinação aplicações em sensoriamento remoto.
Características:
- 2.0-3.6VDC Tensão de alimentação
- Baixa Potência: 40uA no modo de medição, 0.1uA em standby@2.5V
- Toque de Detecção / Double Tap
- Queda livre de Detecção
- SPI e I2C
Como ligar:
Arduino Pin | ADXL345 Pin |
10 | CS |
11 | SDA |
12 | SDO |
13 | SCL |
3V3 | VCC |
Gnd |
GND
|
Código de Exemplo:
//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
long tempo_anterior = 0;
long intervalo = 90; //milisegundos
unsigned long tempo_atual;
//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];
tempo_atual = millis();// o tempo atual é igual ao tempo de funcionamento do uC
if(tempo_atual - tempo_anterior > intervalo)// se o tempo atual menos o tempo anterior for maior que o intervalo com que eu quero fazer minha acao
{
tempo_anterior = tempo_atual;//tempo anterior recebe o tempo atual
//Print the results to the terminal.
Serial.print(x, DEC);
Serial.print(',');
Serial.print(y, DEC);
Serial.print(',');
Serial.println(z, DEC);
delay(10);
}
}
//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);
}
Nenhum comentário:
Postar um comentário