Descripción
El ADXL345 (ADXL-345) es un acelerómetro de 3 ejes (3 DOF: x, y, z) construido a base de unos condensadores minúsculos. El proceso de fabricación se llama miocromecanizado y a los dispositivos fabricados así se les suele denotar por las siglas MEMS. El acelerómetro tiene una pequeña masa suspendida sobre unos muelles en su interior; cuando una fuerza actúa sobre él la masa se mueve, deformando alguno de los muelles. Los micro-condensadores están unidos a esta masa y, así, varía la capacidad de ellos, al variar la distancia entre sus placas.
La salida del acelerómetro es digital, siendo posible comunicarse con él vía i2c ó SPI. Este módulo, modelo GY291 (GY-291) se puede alimentar tanto a 3,3V como a 5V. El rango de medición es ajustable, para obtener una gran precisión, siendo posibles los ajustes: ± 2g / ± 4g / ± 8g / ± 16g. El convertidor ADC interno funciona con una resolución excelente de 13bits, lo que se traduce en una resolución efectiva de hasta 40mg/bit
Si se desea, el módulo ofrece dos interrupciones (INT1, INT2) que pueden configurarse para usarlas como detección de golpes, impactos o caída libre.
Conexionado (por i2c):
- Pin Vcc del ADXL345: al pin 5V de Arduino
- Pin GND del ADXL345: al pin GND de Arduino
- Pin SCL del ADXL345: Al pin A5 de Arduino UNO o NANO.
- Pin SDA del ADXL345: al pin A4 de Arduino UNO o NANO.
Nuestros acelerómetros:
- 3 ejes – analógico: ADXL335
- 3 ejes – digital: ADXL345
- 6 ejes – digital: MPU6050
- 9 ejes – digital: MPU9250
Código de ejemplo:
#include <Wire.h> const int DEVICE_ADDRESS = (0x53); // Dirección i2c del ADXL345 byte _buff[6]; //Definición de direcciones de los registros del ADXL345 char POWER_CTL = 0x2D; char DATA_FORMAT = 0x31; char DATAX0 = 0x32; //X-Axis_0 char DATAX1 = 0x33; //X-Axis_1 char DATAY0 = 0x34; //Y-Axis_0 char DATAY1 = 0x35; //Y-Axis_1 char DATAZ0 = 0x36; //Z-Axis_0 char DATAZ1 = 0x37; //Z-Axis_1 // *** CONFIGURACIÓN *** void setup() { Serial.begin(9600); // Monitor Serie a 9600bps Serial.println("Iniciado..."); Wire.begin(); writeTo(DEVICE_ADDRESS, DATA_FORMAT, 0x01); //ADXL345 ajustado en rango +/- 4g writeTo(DEVICE_ADDRESS, POWER_CTL, 0x08); } // *** CÓDIGO PRINCIPAL *** void loop() { readAccel(); //Leer datos de aceleración en ejes x, y, z delay(500); // Espera de 500s para leer de nuevo } // *** FUNCIONES *** void readAccel() { // Lectura de valores de aceleración uint8_t numBytesToRead = 6; // Número de bytes a leer: 2 para cada eje readFrom(DEVICE_ADDRESS, DATAX0, numBytesToRead, _buff); //Unir los 2 bytes de cada eje int x = (((int)_buff[1]) << 8) | _buff[0]; int y = (((int)_buff[3]) << 8) | _buff[2]; int z = (((int)_buff[5]) << 8) | _buff[4]; // Mostrar datos por monitor serie Serial.print("x: "); Serial.print( x ); Serial.print(" y: "); Serial.print( y ); Serial.print(" z: "); Serial.println( z ); } void writeTo(int device, byte address, byte val) { // Escritura de datos a través del i2c Wire.beginTransmission(device); Wire.write(address); Wire.write(val); Wire.endTransmission(); } void readFrom(int device, byte address, int num, byte _buff[]) { // Lectura datos i2c Wire.beginTransmission(device); Wire.write(address); Wire.endTransmission(); Wire.beginTransmission(device); Wire.requestFrom(device, num); int i = 0; while(Wire.available()) { _buff[i] = Wire.read(); i++; } Wire.endTransmission(); }
Más información: Hoja de datos ADXL345
Valoraciones
No hay valoraciones aún.