Codificação compatível com Arduino 19: Interface de um acelerômetro ADXL345 usando I2C

Codificación compatible con Arduino 19: interfaz de un acelerómetro ADXL345 usando I2C

En el tutorial anterior cubrimos el bus I2C. en Arduino. También aprendimos cómo usar la biblioteca de cables para comunicarnos con circuitos interintegrados o dispositivos I2C usando placas Arduino.

El bus I2C se utiliza habitualmente en sensores digitales. Al utilizar esta interfaz, se pueden conectar cientos de dispositivos esclavos con solo dos cables. Cada dispositivo, ya sea maestro o esclavo I2C, requiere solo dos canales para conectarse al bus.

Aunque se trata de un protocolo de comunicación de datos lento, su simplicidad convierte al bus I2C en una de las interfaces más populares entre los sensores digitales. Normalmente, los sensores sólo utilizan otras interfaces de comunicación (como UART o SPI) cuando la comunicación full-duplex es estrictamente necesaria. De lo contrario, I2C es la interfaz serie de facto para todos los sensores digitales.

Algunos ejemplos de sensores que utilizan un bus I2C/TWI incluyen: acelerómetro ADXL345, giroscopio L3G4200D, magnetómetro MC5883L, sensor de presión BMP180 y RTC DS1307.

En este tutorial, aprenderemos cómo conectar un acelerómetro ADXL345. Sensor con Arduino usando el bus I2C/TWI.

El acelerómetro ADXL345
ADXL345 es un acelerómetro MEMS de tres ejes sensor. También es digital Sensor inercial que utiliza un diseño de acelerómetro capacitivo.

Las características incluyen:

  • Un rango seleccionable por el usuario de hasta +/-16 g
  • Una resolución de salida máxima de 13 bits.
  • Una sensibilidad de 3,9 mg/LSB
  • Una velocidad de datos de salida máxima de 3200 Hz

El sensor tiene interfaces I2C y SPI para comunicarse con controladores u computadoras.

El ADXL345 mide la aceleración estática debida a la gravedad y la aceleración dinámica resultante del movimiento o impacto. Se puede utilizar para detectar aceleración lineal en tres ejes, detectando la inclinación y caída libre de un objeto.

Hay dos pines de interrupción junto con las interfaces I2C y SPI en el sensor. Aquí es donde se pueden mapear varias funciones de detección integradas, como caída libre, toque simple y toque doble. El ADXL345 también puede detectar la presencia o falta de movimiento relativo comparando los valores de aceleración con umbrales definidos por el usuario.

Como sensor digital, el ADXL345 tiene registros integrados que se pueden leer y escribir para configurar ajustes y leer valores de aceleración. Ofrece cuatro rangos de medición: +/-2g, +/-4g, +/-8g y +/-16g.

El rango de medición predeterminado es +/-2g, que se puede utilizar para detectar una aceleración de hasta 19,6 m/s2 en cualquier dirección a lo largo de cada eje.

Las resoluciones máximas son:

  • 10 bits para +/-2g
  • 11 bits para +/-4g
  • 12 bits para +/-8g
  • 13 bits para un rango de +/-16 g

La resolución predeterminada es de 10 bits. Para el rango +/-2g (predeterminado), permite una sensibilidad de 3,9 mg/LSB. La velocidad de datos predeterminada es 100 Hz. Todas estas configuraciones se pueden cambiar o configurar escribiendo datos en los registros integrados del ADXL345. Un controlador/computadora puede leer la aceleración simplemente leyendo los valores de los registros 0x32 a 0x37.

Interfaz ADXL345 con Arduino
El sensor ADXL345 tiene interfaces I2C y SPI para comunicarse con cualquier controlador o computadora. El sensor admite SPI de tres y cuatro cables. Además de estas interfaces en serie, los pines de interrupción del sensor se pueden interconectar directamente con los canales de E/S digitales del controlador/computadora.

Dado que Arduino también admite bus I2C y SPI, ADXL345 se puede conectar a Arduino usando cualquiera de ellos. En este tutorial, usaremos el bus I2C.

Los pines Arduino I2C no están internamente en ALTO. Sin embargo, el sensor ADXL345 normalmente está disponible como un módulo, donde los pines I2C del sensor ya están integrados en ALTO. Por tanto, podemos conectar directamente los pines I2C del sensor ADXL345 al puerto I2C de la placa Arduino.

El ADXL345 puede recibir energía de la salida de alimentación de 5 V del Arduino. Este diagrama de circuito muestra la interfaz ADXL345 con Arduino.

I2C en Arduino
La mayoría de las placas Arduino tienen al menos un módulo I2C, al que se puede acceder a través de uno o más puertos. Una placa Arduino puede servir como maestra y esclava I2C. Sin embargo, para leer datos de un sensor digital como el ADXL345, el Arduino debe programarse como maestro I2C. También se puede programar para comunicarse con dispositivos I2C/TWI utilizando la biblioteca de cables.

  • Configure Arduino como maestro I2C llamando a Wire.begin sin argumentos.
  • El maestro Arduino puede configurar la frecuencia del reloj I2C utilizando el método Wire.setClock si es necesario modificar la velocidad del reloj.
  • Arduino puede transmitir datos a un esclavo (como ADXL345 para configurar los ajustes) llamando a los métodos Wire.beginTransmission, Wire.write y Wire.endTransmission.
  • Arduino también puede solicitar datos de un esclavo usando el método requestFrom y recuperar los datos solicitados usando los métodos Wire.available y Wire.read.

Hablando con el ADXL345 usando Arduino
Cada dispositivo esclavo I2C debe tener una dirección I2C única. El ADXL345 tiene un pin de dirección ALT que se puede conectar para configurar la dirección I2C de este sensor digital. Si el pin ALT ADDRESS está configurado en ALTO en un módulo, la dirección I2C de 7 bits para el dispositivo será 0x1D, seguida del bit R/W.

Esto se traduce en 0x3A para escritura y 0x3B para lectura. Si el pin ALT ADDRESS está conectado a tierra, la dirección I2C de 7 bits para el dispositivo es 0x53 (seguida del bit R/W). Esto se traduce en 0xA6 para escritura y 0xA7 para lectura.

En un módulo, el pin ALT ADDRESS ya está en ALTO o BAJO. La dirección I2C del sensor ADXL345 utilizado en este tutorial es 0x53. Al utilizar esta dirección, Arduino puede acceder al sensor en el bus I2C.

Arduino necesita leer y escribir datos en los registros ADXL345 para configurar los ajustes (incluido el rango de medición de configuración, la velocidad de transferencia de datos, la sensibilidad y la resolución) y leer los valores de aceleración.

A continuación se muestra una tabla de estos registros:

Al escribir datos en el ADXL345, el sensor se puede direccionar mediante el método Wire.beginTransmission. Se debe enviar el primer byte que indica el registro ADXL345 (donde se escribirán los datos) seguido del byte de datos utilizando el método Wire.write. La transmisión se completa solo cuando se llama al método Wire.endTransmission.

Al leer datos del ADXL345, el sensor debe direccionarse mediante el método Wire.beginTransmission. El primer byte que indica el registro ADXL345 (donde se leerán los datos) debe ser escrito por el maestro Arduino en el bus I2C utilizando el método Wire.write.

Esta transmisión solo se completa cuando se llama al método Wire.endTransmission. Los datos cero se envían junto con la dirección del registro cuando es necesario leerlos del registro ADXL345. E inmediatamente después de direccionar el registro a leer, el maestro Arduino debe realizar una llamada al método Wire.requestFrom para leer el valor del registro seleccionado.

Configuración del sensor ADXL345
A continuación se detallan algunos pasos simples para configurar el sensor ADXL345 para comunicación en serie.

1. Configure el modo de energía y la velocidad de transferencia de datos escribiendo en el registro 0x2C. Este registro tiene estos bits:

Si el bit LOW_POWER se establece en 0, el ADXL345 funciona en modo normal. Si se establece en 1, el ADXL345 funciona en modos de energía reducida donde hay mayor ruido.

Los bits D3 a D0 seleccionan la velocidad de transferencia de datos según esta tabla:

2. Configure el formato de datos escribiendo en el registro 0x31. Tiene estos bits:

Si el bit de AUTOPRUEBA se establece en 1, se aplicará una fuerza de autoprueba al sensor, lo que provocará un cambio en los datos de salida. Si se establece en 0, se desactivará la intensidad de la autoprueba.

Si el bit SPI se establece en 1, el ADXL345 usa el modo SPI de tres cables. Si se establece en 0, utiliza el modo SPI de cuatro cables.

Si el bit INT_INVERT se establece en 0, establece las interrupciones en ALTO activo y si se establece en 1, establece las interrupciones en BAJO activo.
Si el bit FULL_RES se establece en 1, el sensor genera un valor de resolución completa (10 bits para +/- 2 g; 11 bits para +/- 4 g; 12 bits para +/- 8 g; 13 bits para +/- 8 g; 13 puntas para +/- 8 g /- 16 g). De lo contrario, si se establece en 0, se utilizará el valor predeterminado de 10 bits.

Si el bit de justificación se establece en 1, los valores de aceleración en los registros 0x32 a 0x37 están justificados a la izquierda. Si se establece en 0, estos valores están justificados a la derecha.

La siguiente imagen muestra el formato de los registros de valores de datos con justificaciones izquierda y derecha y las posiciones del LSB o MSB para diferentes rangos de medición.

Los bits de rango D1 y D0 seleccionan el rango de medición de acuerdo con esta tabla:

3. Configure las funciones de ahorro de energía escribiendo en el registro 0x2D, ​​que tiene estos bits:

Si el bit de enlace se establece en 1, las funciones de actividad e inactividad están enlazadas en serie (lo que significa que la función de actividad se retrasará hasta que se detecte la función de inactividad). Si se establece en 0, ambas funciones serán simultáneas. La función inactiva se refiere a una situación en la que la aceleración está por debajo del valor THRESH_INACT (o el registro 0x25) durante al menos el tiempo indicado por TIME_INACT (el registro 0x26).

Si el bit de enlace está configurado y el bit AUTO_SLEEP está establecido en 1, se habilita la funcionalidad de suspensión automática. En este modo, el ADXL345 cambia automáticamente al modo de suspensión si la función de suspensión está habilitada y se detecta inactividad. Si la actividad también está habilitada, el ADXL345 se despierta automáticamente del modo de suspensión después de detectarla y vuelve a funcionar a la velocidad de datos de salida establecida en el registro BW_RATE.

Si el bit AUTO_SLEEP se establece en 0, deshabilita el cambio automático al modo de suspensión. Si el bit de enlace no está configurado, la función AUTO_SLEEP está deshabilitada y la configuración del bit AUTO_SLEEP no tendrá ningún impacto en el funcionamiento del dispositivo.

Si el bit de medida se establece en 1, el ADXL345 funciona en modo de medición. Si se establece en 0, el ADXL345 funciona en modo de espera.

Si el bit de suspensión se establece en 1, el ADXL345 funcionará en modo de suspensión. Si se establece en 0, el ADXL345 funciona en modo normal. El modo de suspensión suprime DATA_READY, detiene la transmisión de datos a FIFO y cambia la frecuencia de muestreo a la especificada por los bits de habilitación.

En el modo de suspensión, solo se puede utilizar la función de actividad. Los bits de habilitación controlan la frecuencia de lectura en modo de suspensión según esta tabla:

Lectura de aceleración ADXL345
La aceleración sobre:

  • El eje X se lee de los registros 0x32 y 0x33.
  • El eje Y se lee de los registros 0x34 y 0x35
  • El eje Z se lee de los registros 0x36 y 0x37.

Los valores brutos son 16 bits divididos en dos para completar el formulario. La resolución, justificación izquierda/derecha de los valores y rango de medida se definen según el valor registrado en el registro 0x31 del ADXL345.

En cualquier rango de medición se puede seleccionar una resolución de 10 bits. El valor de aceleración de 10 bits se puede ajustar hacia la izquierda o hacia la derecha. Si el valor se ajusta hacia la derecha, se pueden obtener valores de aceleración de 10 bits enmascarando el segundo byte (que se lee desde 0x33 para el eje x, 0x35 para el eje y y 0x37 para el eje z). ) - con 0x03, desplazándolo hacia la derecha ocho veces. Luego, los dos bytes se combinan (0x32 y 0x33; 0x34 y 0x35; 0x36 y 0x37) en un entero de 16 bits.

Si el valor se ajusta hacia la izquierda, se pueden obtener valores de aceleración de 10 bits desplazando el primer byte hacia la derecha (que se lee desde 0x32 para el eje x, 0x34 para el eje y y 0x36 para el eje z). -axis) seis veces, enmascarando el segundo byte (que se lee desde 0x33 para el eje x, 0x35 para el eje y y 0x37 para el eje z) con 0x3F para un byte temporal. Su byte temporal se desplaza hacia la izquierda dos veces, sumando el byte temporal al primer byte. Luego, mueva el primer byte hacia la izquierda seis veces y combine los dos bytes (0x32 y 0x33; 0x34 y 0x35; 0x36; y 0x37) para obtener un entero de 16 bits.

Este valor de 10 bits oscilará entre 0 y 1024. La aceleración se mide en ambas direcciones a lo largo del eje. Por lo tanto, si el valor es mayor que 511, réstale 1024 para obtener un valor negativo que indica la otra dirección del eje.

Para una resolución de 10 bits, el valor de aceleración en una unidad de gravedad se puede derivar multiplicando este valor por 4 mg (0,004) para un rango de +/- 2 g, 7,8 mg (0,0078) para +/- 4 g, 15,6 mg (0,0156) para +/- 8 g o 31,25 mg (0,03125) para +/- 16 g.

Si la resolución seleccionada es de 11 bits para el rango +/- 4g y los valores de aceleración están configurados correctamente, se pueden obtener valores de aceleración de 11 bits enmascarando el segundo byte (leído desde 0x33 para el eje x, 0x35 para el eje y y 0x37 para el eje z) – con 0x07, desplazándolo hacia la derecha ocho veces y combinando los dos bytes (0x32 y 0x33; 0x34 y 0x35; 0x36; y 0x37) en un entero de 16 bits.

Si la resolución seleccionada es de 11 bits para el rango +/- 4g y los valores de aceleración están configurados a la izquierda, se pueden obtener valores de aceleración de 11 bits desplazando el primer byte hacia la derecha (leído desde 0x32 para el eje x, 0x34 para el eje y y 0x36 para el eje z) cinco veces, enmascarando el segundo byte (leído de 0x33 para el eje x, 0x35 para el eje y y 0x37 para el eje z ) con 0x1F para un byte temporal. Luego, desplace el byte temporal hacia la izquierda tres veces, agregue el byte temporal al segundo byte, desplace el segundo byte hacia la izquierda cinco veces y finalmente combine los dos bytes (0x32 y 0x33; 0x34 y 0x35; 0x36; y 0x37). a un entero de 16 bits.

Este valor de 11 bits oscilará entre 0 y 2048. La aceleración se mide en ambas direcciones a lo largo del eje. Por lo tanto, si el valor es mayor que 1023, réstele 2048 para obtener un valor negativo, que indica la otra dirección del eje.

Para una resolución de 11 bits para el rango +/- 4 g, el valor de aceleración en la unidad de gravedad se puede derivar multiplicando este valor por 3,9 mg (0,0039).

Si la resolución seleccionada es de 12 bits para el rango +/- 8g y los valores de aceleración están configurados correctamente, se pueden obtener valores de aceleración de 12 bits enmascarando el segundo byte (leído desde 0x33 para el eje x, 0x35 para el eje y y 0x37 para el eje z) – con 0x0F, desplazándolo hacia la derecha ocho veces y combinando los dos bytes (0x32 y 0x33; 0x34 y 0x35; 0x36; y 0x37) en un entero de 16 bits.

Si la resolución seleccionada es de 12 bits para el rango +/- 8g y los valores de aceleración están configurados a la izquierda, se pueden obtener valores de aceleración de 12 bits desplazando el primer byte hacia la derecha (leído desde 0x32 para el eje x, 0x34 para el eje y y 0x36 para el eje z) cuatro veces, enmascarando el segundo byte (leído de 0x33 para el eje x, 0x35 para el eje y y 0x37 para el eje z ) con 0x0F para un byte temporal. Luego, desplace el byte temporal hacia la izquierda cuatro veces, agregue un byte temporal al primer byte, desplace el segundo byte hacia la izquierda cuatro veces y combine los dos bytes (0x32 y 0x33; 0x34 y 0x35; 0x36; y 0x37) para obtenga un entero de 16 bits.

Este valor de 12 bits oscilará entre 0 y 4096. La aceleración se mide en ambas direcciones a lo largo del eje. Por lo tanto, si el valor es mayor que 2047, réstele 4096 para obtener un valor negativo, que indica la otra dirección del eje.

Para una resolución de 12 bits para el rango de +/- 8 g, el valor de aceleración en la unidad de gravedad se puede derivar multiplicando este valor por 3,9 mg (0,0039).

Si la resolución seleccionada es de 13 bits para el rango +/- 16g y los valores de aceleración están configurados correctamente, se pueden obtener valores de aceleración de 13 bits enmascarando el segundo byte (leído desde 0x33 para el eje x, 0x35 para el eje y y 0x37 para el eje z) – con 0x1F, desplazándolo hacia la derecha ocho veces y combinando los dos bytes (0x32 y 0x33; 0x34 y 0x35; 0x36; y 0x37) en un entero de 16 bits.

Si la resolución seleccionada es de 13 bits para el rango +/- 16g y los valores de aceleración están configurados a la izquierda, se pueden obtener valores de aceleración de 13 bits desplazando el primer byte hacia la derecha (leído desde 0x32 para el eje x, 0x34 para el eje y y 0x36 para el eje z) tres veces, enmascarando el segundo byte (leído de 0x33 para el eje x, 0x35 para el eje y y 0x37 para el eje z) – con 0x03 para un byte temporal, desplace el byte temporal hacia la izquierda cinco veces, agregue un byte temporal al primer byte, desplace el segundo byte hacia la izquierda tres veces y combine los dos bytes (0x32 y 0x33; 0x34 y 0x35; 0x36; y 0x37) a un entero de 16 bits.

Este valor de 13 bits oscilará entre 0 y 8192. La aceleración se mide en ambas direcciones a lo largo de un eje. Por lo tanto, si el valor es mayor que 4.095, réstele 8.192 para obtener un valor negativo, que indica la otra dirección del eje.

Para una resolución de 12 bits para el rango de +/- 16 g, el valor de aceleración en la unidad de gravedad se puede derivar multiplicando este valor por 3,9 mg (0,0039).

Detección de inclinación del ADXL345
El valor de aceleración obtenido en unidades de gravedad puede variar de +2 g a -2 g, de +4 g a -4 g, de +8 g a -8 g o de +16 g a -16 g, según el rango de medición seleccionado.

El valor de aceleración incluye tanto la aceleración estática debida a la gravedad como la aceleración dinámica debida al movimiento o choque.

Esta imagen muestra los valores de aceleración en unidades de gravedad debida a la gravedad:

La inclinación del sensor se puede detectar mediante el signo y el valor de la aceleración en los ejes x, y, z. Cuando solo actúa aceleración estática sobre el sensor ADXL345, el valor de la aceleración a lo largo de un eje determinado será aproximadamente +1g o -1g.

Al examinar la señal y el valor de aceleración en todos los ejes, se puede determinar la orientación exacta del sensor ADXL345 en un marco de tres ejes. La forma en que se expresa la orientación del sensor (como el grado tangente a los planos axiales) y cómo se utiliza la orientación para alguna aplicación de control electrónico (como apuntar el dispositivo o controlar el movimiento tridimensional de un sistema) depende del usuario. programa.

Configuración del ADXL345 para +/- 2 g, resolución de 10 bits y aceleración de lectura usando Arduino
El siguiente boceto de Arduino configura el sensor ADXL345 para un rango de medición de +/- 2 gy utiliza una resolución de 10 bits. El script lee los datos de aceleración de cada uno de los ejes y los convierte en unidades de gravedad.

Los valores de aceleración en los ejes x, y y z son de 10 bits y están justificados a la derecha. En consecuencia, los valores se derivan de registros de 16 bits. En resolución de 10 bits, el valor de la aceleración en la unidad de gravedad se obtiene multiplicando por 4 mg, es decir, multiplicando por 0,004.

Resultados
El valor de la aceleración en diferentes ejes en relación con las diferentes orientaciones del sensor ADXL345 se puede ver en este vídeo:

En el próximo tutorial, aprenderemos cómo usar la interfaz SPI en Arduino.

(tagsToTranslate)Arduino

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.