INFORMACIÓN
El Acelerometro ADXL345 GY-291 realiza detección de movimiento en 3 ejes con una resolución en medición (13 bits) de hasta ± 16 g. Los datos de salida se componen de 16 bits y se puede acceder a través de la interfaz digital SPI (3 o 4 cables) o I2C.
El Acelerometro ADXL345 GY-291 es ideal para:
- Aceleración estática en las aplicaciones de detección de inclinación, su alta resolución (3,9 mg / LSB) permite medir cambios de inclinación inferiores a 1,0 °
- Aceleración dinámica resultante del movimiento o el choque.
Adicional es funcional para la detección de actividad e inactividad detectando la presencia o la falta de movimiento al comparar la aceleración en cualquier eje con los umbrales establecidos por el usuario. La detección de toques detecta los toques simples y dobles en cualquier dirección. La detección de caída libre detecta si el dispositivo se está cayendo. Estas funciones se pueden asignar individualmente a cualquiera de los dos pines de salida de interrupción.
ESPECIFICACIÓN Y CARACTERÍSTICAS
- Voltaje de funcionamiento : 3 V a 5 V
- I/O rango de voltaje: 1.7 V a 3.6V
- Chip Principal: ADXL345
- Grados de libertad (DoF): 3
- Rango de medición: ± 2 g a ± 16 g (± 2g / ± 4g / ± 8g / ± 16g.)
- Rango de temperatura (−40°C to +85°C)
- Dimensiones: 3 mm × 5 mm × 1 mm
- Peso: 2 g
- Detección:
- Caída Libre
- Actividad/Inactividad
- De un solo toque/doble toque
- Corriente:
- 40 µA in modo medición
- 0.1 µA in modo reposo
- Resolución:
- Default: 10-bit.
- Máxima: 13-bit a ±16 (manteniendo 4 mg/LSB como factor de escala en todos los rangos)
- Interfaz:
- SPI (3 o 4 hilos) a 5 MHz
- I2C (2 hilos) a 100kHz-400kHz
DOCUMENTACIÓN Y RECURSOS
INFORMACIÓN ADICIONAL
Uso de la interfaz I2C y conexión a Arduino.
Para utilizar el Acelerometro con la interfaz de I2C con Arduino solo requerimos utilizar los pines SDA y SCL ,conexión de tierras (GND) y alimentación a la placa (3.3V ).
Código prueba para ADXL345
Se presenta el siguiente código con la finalidad de que puedas probar el funcionamiento del MPU , cabe mencionar que se requiere calibración y los datos arrojados son de fabrica. Para mas información revisar el datasheet.
#include <Wire.h> //Librería para poder comunicarse con dispositivos por I2C
#define DEVICE (0x53) // Dirección del ADXL345 especificada en el datasheet para iniciar comunicación
byte _buff[6];
char POWER_CTL = 0x2D; //Registro de control
char DATA_FORMAT = 0x31;
char DATAX0 = 0x32; //X-Eje Data 0
char DATAX1 = 0x33; //X-Eje Data 1
char DATAY0 = 0x34; //Y-Eje Data 0
char DATAY1 = 0x35; //Y-Eje Data 1
char DATAZ0 = 0x36; //Z-Eje Data 0
char DATAZ1 = 0x37; //Z-Eje Data 1
void setup() {
Wire.begin();
Serial.begin(9600);
writeTo(DATA_FORMAT, 0x01); //Coloca al ADXL345 dentro +/- Rango de 4G para escribir el valor en 0x01 al registro DATA_FORMAT
writeTo(POWER_CTL, 0x08); //Coloca al ADXL345 en Mode Medición para escribir el valor en registro 0x08 al registro POWER_CTL
}
void loop() {
readAccel(); // función de lectura de la inclinación en x/y/z
delay(1000); // lecturas cada segundo
}
void readAccel() { //función de lectura de la inclinación en x/y/z
uint8_t dato = 6; //Lectura de 6 bit
readFrom( DATAX0, dato, _buff); //lectura del acelerómetro en el registro DATX0 de ADXL345
// cada eje tiene una resolución de 10 bits empezando desde LSM
// conversión de bytes a entero desde los buffer de lectura
int x = (((int)_buff[1]) << 8) | _buff[0];
int y = (((int)_buff[3]) << 8) | _buff[2];
int z = (((int)_buff[5]) << 8) | _buff[4];
//impresión de los valores de cada eje
Serial.print("x: ");
Serial.print( x );
Serial.print(" y: ");
Serial.print( y );
Serial.print(" z: ");
Serial.println( z );
}
void writeTo(byte address, byte val) { //función para escritura de datos en los registros
Wire.beginTransmission(DEVICE); // comienza la comunicación
Wire.write(address); // envía las direcciones de registros
Wire.write(val); // envió del valor
Wire.endTransmission(); // fin de la comunicación
}
void readFrom(byte address, int num, byte _buff[]) { // Funcion para la lectura de numero de bytes para las direcciones de registros en el buffer
Wire.beginTransmission(DEVICE); // comienza la comunicación
Wire.write(address); // envia la direccion que fue leida
Wire.endTransmission(); // fin de la transmisión
Wire.beginTransmission(DEVICE); // comienza la comunicación
Wire.requestFrom(DEVICE, num); // solicitud de 6 bytes al MPU
int i = 0;
while (Wire.available()) { // El MPU puede enviar menos datos que los requeridos(abnormal)
_buff[i] = Wire.read(); // recibe bytes en los guarda en el buffer
i++;
}
Wire.endTransmission(); // fin de la transmisión
}
Valoraciones
No hay valoraciones aún.