Sensor Acelerómetro ADXL345 «detecta movimiento», Pic C Compiler

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);

Finalmente, una vez que obtenemos los datos los podemos mostrar en la pantalla OLED. 

Utiliza la pantalla OLED SH1106 o SSD1306


      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

   }

}
Scroll al inicio