sexta-feira, julho 10, 2015

Módulo Acelerômetro ADXL345 - Introdução

Continuando no estudo de sensores com conexão I2C, examino aqui um módulo que usa o acelerômetro ADXL345.


Eu comprei este módulo na Deal Extreme (este aqui, mas tem um parecido ainda mais barato). Como de costume, a documentação no site da DX é nula (o que fez alguém colocar uma avaliação bem negativa no site). Mas basta procurar por ADXL345 para achar muita informação sobre o chip. Com um pouco mais de trabalho, achei uma página sobre exatamente este módulo, a partir da qual se chega ao esquema e um exemplo para o Arduino ( que eu salvei nos arquivos do blog com o nome de ADXL345.zip).

O que é uma Acelerômetro de 3 Eixos?

 Basicamente um acelerômetro de 3 eixos mede a soma da gravidade com a aceleração, simultaneamente em três eixos ortogonais (X, Y, Z).  A unidade habitual para a aceleração é g, a aceleração da gravidade (9,8 m/s^2). Supondo que o eixo Z esteja perpendicular ao chão e não haja aceleração, a medida será (0, 0, 1). Ainda sem aceleração, mas com o sensor inclinado, a leitura corresponderá à projeção nos três eixos deste valor de 1g. Neste caso, o acelerômetro pode ser usado para medir a inclinação.

Uma outra aplicação consiste em ter o sensor montado com uma inclinação fixa e conhecida e usá-lo para medir a aceleração. Para isto é necessário descontar da leitura os valores correspondentes à gravidade.

Um acelerômetro pode ainda ser usado para detectar a queda livre ou batidas rápidas (taps).

Conexão do Módulo

O ponto de partida é a descrição dos pinos no datasheet. Temos o terra e duas entradas de alimentação; o chip opera com tensões entre 2.0 e 3.6V. A interface pode ser SPI ou I2C. No modo SPI, temos o chip select (CS, active low), os dados de entrada e saída (SDI e SDO, dá para operar em modo 3 fios usando só o SDI) e o clock (SCLK). O modo I2C usa os mesmos pinos, mas com significados diferentes. Para selecionar I2C, deve-se manter CS sempre em nível alto. SDI é o SDA (dado) e SCLK é o SCL (clock). SDO permite selecionar um endereço I2C alternativo. Por último, temos dois pinos de interrupção (INT1 e INT2).

De posse desta informação, vamos examinar o esquema do módulo. Na alimentação temos um regulador para permitir alimentar com 5V. Não existe nenhum conversor dos sinais lógicos, portanto valem os meus comentários anteriores sobre a ligação direta ao Arduino (resumindo: funciona em I2C, mas você está forçando a barra). Os dois pinos de alimentação do chip estão ligados por um resistor de 0 ohms. Ou seja, estão em curto, a não ser que você pegue um ferro de solda e tire o resistor. Resistores de pull up de 10K estão ligados a SCL, SDA e CS; SDO está ligado a terra por outro resistor de 0 ohms. Ou seja, o módulo vem configurado para operar com I2C usando o endereço alternativo (0x53). Se você quiser usar o endereço principal (0x1D) ou SPI vai ter que tirar alguns resistores.

Programação

O ADXL345 tem um monte de registradores. A explicação completa está no datasheet, comento abaixo apenas alguns:
  • POWER_CTL (0x2D): Ativa, desativa e controla o modo sleep (para economia de energia). O exemplo desliga o modo sleep e ativa o acelerômetro para medidas.
  • DATA_X0, DATA_X1, DATA_Y0, DATA_Y1, DATA_Z0 e DATA_Z (0x32 a 0x37): Leitura da aceleração. A leitura para cada eixo pode ter até 13 bits e é armazenada como 16 bits em complemento de 2, com o byte menos significativo antes do mais.
  • DATA_FORMAT (0x31): permite controlar o formato da leitura. Existem dois modos (fixo e full) e uma faixa de operação (+/- 2, 4, 8 ou 16g). No modo fixo a leitura tem sempre 10 bits e a escala varia conforme a faixa de operação. No modo full a escala é fixa (3,9mg) e o número de bits varia conforme a faixa de operação. Por exemplo, vamos considerar que a aceleração lida é 5g e a faixa é +/-8g. No modo fixo a leitura (em binário) será 0101000000 (10 bits, escala de 15.6mg) e no modo full  10100000010 (11 bits, escala de 3.9mg). Este registrador possui algumas funções adicionais, como o controle do self-test do sensor e do modo de operação do SPI (3 ou 4 fios).
  • TRESH_TAP (0x1D) e DUR (0x21) controlam a detecção de batidas rápida. TRESH_TAP é o valor mínimo da aceleração e DUR a duração máxima. A detecção de uma batida é sinalizada no registrador de status (ACT_TAP_STATUS, 0x2B) e pode gerar uma interrupção.
  • TRESH_FF (0x28) e TIME_FF (0x29) controlam a detecção de queda livre. A detecção de queda livre é sinalizada no registrador INT_SOURCE (0x30) e pode gerar uma interrupção.

Uma explicação bem detalhada (em inglês) do ADXL345 pode ser vista aqui.

Nenhum comentário: