En esta sección aprenderás a programar un sensor acelerómetro de 3 ejes. El objetivo es medir la aceleración estática de la gravedad detectando la inclinación, el movimiento o cualquier actividad aplicada al sensor.
Sensor ADXL345
El ADXL345 es un acelerómetro de 3 ejes pequeño, delgado y de baja potencia con medición de alta resolución (13 bits) de hasta ±16 g. Los datos de salida digital tienen un formato de complemento a dos de 16 bits y se puede acceder a ellos a través de una interfaz digital SPI (3 o 4 hilos) o I2 C.
El ADXL345 es ideal para aplicaciones de dispositivos móviles. Mide la aceleración estática de la gravedad en aplicaciones de detección de inclinación, así como la aceleración dinámica resultante del movimiento o impacto. Su alta resolución (4 mg/ LSB) permite medir cambios de inclinación inferiores a 1,0°.
Se proporcionan varias funciones especiales de detección. Los sensores de actividad e inactividad detectan la presencia o falta de movimiento y si la aceleración en cualquier eje excede un nivel establecido por el usuario. La detección de toque detecta toques simples y dobles. La detección de caída libre detecta si el dispositivo está cayendo. Estas funciones se pueden asignar a uno de los dos pines de salida de interrupción.

Especificaciones y características
- Voltaje de funcionamiento : 3 V a 5 V
- 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
- 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
Respuesta de salida vs orientación a la gravedad

Circuito de conexión

Programación
Inicialmente se colocan los parámetros para la comunicación I2C.
#use i2c(Master, Fast, sda=PIN_B0, scl=PIN_B1,force_sw, stream=ADXL345_stream)//parametros I2C
Incluimos la librería del sensor ADXL345.
#include "ADXL345.c"
Se inicializan los parámetros para el sensor.
ADXL345_init();
Puedes seleccionar la resolución del sensor o puedes dejarlo por defecto en 2g.
setRangeSetting(2);// 2g, 4g, 8g, 16g
Existes dos opciones de medición en el sensor:
Con la primera función se obtienen los 10bits o 13bits de información de la medición del sensor. Se utilizan variables de 16bits con signo.
signed int16 x, y, z;
readAccel(&x, &y, &z);
Con la segunda función se obtienen los datos que representan la medición de la fuerza g. Se utilizan variables flotantes.
float gx, gy, gz;
readG(&gx, &gy, &gz);
readAccel(&x, &y, &z);//Valor de 10bits o 13bits
sprintf(texto,"X: %05ld",x);
OLED_DrawText(1,1,texto,1);
sprintf(texto,"Y: %05ld",y);
OLED_DrawText(1,10,texto,1);
sprintf(texto,"Z: %05ld",z);
OLED_DrawText(1,20,texto,1);
readG(&gx, &gy, &gz);//Valor de Fuerza de gravedad
sprintf(texto,"X: %f",gx);
OLED_DrawText(1,35,texto,1);
sprintf(texto,"Y: %f",gy);
OLED_DrawText(1,45,texto,1);
sprintf(texto,"Z: %f",gz);
OLED_DrawText(1,55,texto,1);
OLED_Display();//Muestra la informacion en la pantalla
Código completo
#FUSES NOMCLR
#use i2c(Master,Fast, sda=PIN_B0, scl=PIN_B1,force_sw, stream=OLED_stream)//parametros I2C
#use i2c(Master, Fast, sda=PIN_B0, scl=PIN_B1,force_sw, stream=ADXL345_stream)//parametros I2C
#define SH1106_128_64 //DEFINE EL MODELO DE LA PANTALLA OLED
//#define SSD1306_128_64
#include "OLED_I2C.c" //libreria oled I2C
#include "ADXL345.c"
void main()
{
OLED_Begin();
OLED_ClearDisplay();
ADXL345_init();
setRangeSetting(2);// 2g, 4g, 8g, 16g
signed int16 x, y, z;
float gx, gy, gz;
char texto[125];
while(TRUE)
{
readAccel(&x, &y, &z);//Valor de 10bits o 13bits
sprintf(texto,"X: %05ld",x);
OLED_DrawText(1,1,texto,1);
sprintf(texto,"Y: %05ld",y);
OLED_DrawText(1,10,texto,1);
sprintf(texto,"Z: %05ld",z);
OLED_DrawText(1,20,texto,1);
readG(&gx, &gy, &gz);//Valor de Fuerza de gravedad
sprintf(texto,"X: %f",gx);
OLED_DrawText(1,35,texto,1);
sprintf(texto,"Y: %f",gy);
OLED_DrawText(1,45,texto,1);
sprintf(texto,"Z: %f",gz);
OLED_DrawText(1,55,texto,1);
OLED_Display();//Muestra la informacion en la pantalla
}
}
