segunda-feira, 27 de outubro de 2014

Módulo Acelerômetro MMA7361



Neste artigo iremos fazer testes de funcionamento do acelerômetro MMA7361. Os acelerômetros são usado para medir aceleração. São baseados na segunda lei de newton que implica que a força resultante aplicada a um corpo produz uma aceleração diretamente proporcional. Portanto, nos acelerômetros eletrônicos, temos uma resposta elétrica quando aplicamos uma variação na posição do dispositivo, que é na verdade uma variação mecânica. Assim temos no mercado acelerômetros com princípios de funcionamento diferentes e inúmeros tipos de aplicações.

A seguir, alguns exemplos de aplicações típicas de acelerômetros:

  • Disparo de Air Bags;
  • Sensores biomédicos;
  • Navegação de aeronaves;
  • Correções de inclinação em embarcações;
  • Brinquedos como videogames;
  • Sensores de vibração para aplicações industriais;
  • Alarmes veiculares;
  • Telefones celulares e computadores de mão como tablets.
Os acelerômetros encontrados no mercado hoje podem ser do tipo resistivo, capacitivo, de fibra ótica ou piezelétrico.

Algumas características do MMA7361

O MMA7361L é de baixo consumo, com perfil capacitivo  micro usinado com sinal condicionado, tem um filtro passa-baixa  de 1  polo, com compensação de temperatura, selftest, detecção de 0g que detecta queda livre e duas opções de sensibilidade. Inclui o modo sleep que é útil em sistemas portáteis alimentados por bateria.

Este acelerômetro trabalha com até três dimensões de espaço. Em geral os fabricantes denominam estes espaços como X, Y e Z, e suas direções são definidas no datasheet do fabricante. Em geral o eixo Z deveria trabalhar alinhado paralelamente à direção da aceleração da gravidade na Terra. Os eixos X e Y apontam perpendicularmente ao eixo Z e são também perpendiculares entre si. Em outras palavras, fazendo uma figuração com um objeto real, o eixo Z estaria para a altura do objeto, assim como o eixo X estaria para a largura e o eixo Y para a profundidade.

A faixa de medição deste acelerômetro é de ±5000 g.

A saída está no formato analógico.

Alguns pinos do MMA7261

0g-Detect - O sensor oferece uma função que provê um sinal lógico alto quando o módulo está com os três eixos em 0g. É uma função importante na detecção de queda livre e é usado na proteção física de discos magnéticos como HD em notebooks.

Self Test - Esta função  permite a verificação da integridade mecânica e elétrica do acelerômetro a qualquer momento. É uma função importante quando o acelerômetro é usado na preservação de discos rígidos que deve ter sua integridade preservada ao longo de sua vida útil. Ou ainda para verificar se está corretamente soldado e que as conexões galvânicas estão perfeitas. Esta função deve ser ativada com o módulo de cabeça para baixo. Quando este teste é iniciado, uma força eletrostática é aplicada em cada eixo (x, y e z) causando uma deflexão. O eixo x e y são defletidos ligeiramente e o eixo z é defletido para 1 g. Este procedimento garante que o módulo está funcionando.

g-Select - Esta função permite a seleção entre duas sensibilidades disponíveis dependendo do nível lógico aplicado neste pino (g-select). Para nível lógico 0 temos 206 mV/g e para nível 0 temos 800 mV/g. A sensibilidade pode ser alterada a qualquer momento. Com o pino flutuando temos o mesmo
que se estivesse em nível lógico 0.

Sleep Mode - Colocando este pino em nível lógico baixo o módulo entra em sleep mode que é uma condição de baixo consumo com consumo mínimo de 3 µA. As saídas são desligadas.

Diagrama de blocos simplificado do acelerômetro


Layout recomendado pelo fabricante (já incluso no módulo)




Já com os capacitores e um regulador de tensão que permite o módulo ser alimentado tanto com 5V (pino 5V) tanto com 3,3V (pino 3V3), ou seja, está pronto para uso.

Teste e algoritmo utilizado


No teste que se segue amarramos o módulo em uma fan cooler de 12 x 12 cm para podermos ver de uma maneira qualitativa as vibrações nas três direções que acontecem quando o ventilador é ligado.


Módulo amarrado ao ventilador e conectado ao Arduino Due



Conexões físicas do módulo ao Arduino DUE


   MMA7361 | Arduino Due
==========================
      X ---|--- A1
      Y ---|--- A2
      Z ---|--- A3
  Sleep ---|--- 3V3
     5V ---|--- 5V
    GND ---|---GND
==========================

Algoritmo Utilizado


#define qtd 1024

//Inicializa variáveis
int x[qtd];
int y[qtd];
int z[qtd];
int i;
int j;


long x_sum = 0;
long x_off = 0;
long y_sum = 0; 
long y_off = 0;
long z_sum = 0;
long z_off = 0;

void setup() {
  Serial.begin(4800);
}

void loop() {
  Serial.println("Iniciado Calculo de Offset.");
  Serial.println("   ");

  for (i = 0; i < 1024; i++) {
    x_off = x_off + analogRead(A1);
    y_off = y_off + analogRead(A2);
    z_off = z_off + analogRead(A3);
  }
  x_off = x_off >> 10;
  y_off = y_off >> 10;
  z_off = z_off >> 10;
  Serial.println("Offset Calculado!");
  delay(2000);
  Serial.println("Coletando dados...");
  delay(2000);

  for (i = 0; i < qtd; i++) {
    for (j = 0; j <= 1024; j++) {
      x_sum = x_sum + analogRead(A1);
      y_sum = y_sum + analogRead(A2);
      z_sum = z_sum + analogRead(A3);
    }

    x_sum = (x_sum >> 10);
    x_sum = x_sum  - x_off;
    
    y_sum = (y_sum >> 10);
    y_sum = y_sum  - y_off;
    
    z_sum = (z_sum >> 10);
    z_sum = z_sum  - z_off;

    if ((x_sum  <= 20) && (x_sum  >= -20))
      x_sum = 0;
    if ((y_sum  <= 20) && (y_sum  >= -20))
      y_sum = 0;
    if ((z_sum  <= 20) && (z_sum  >= -20))
      z_sum = 0;  

    x[i] = x_sum;
    y[i] = y_sum;
    z[i] = z_sum;

  }

  // imprime -inicio
  Serial.println("Eixo X");
  for (i = 0; i < qtd; i++)
    Serial.println(x[i]);
  Serial.println("Eixo Y");
  for (i = 0; i < qtd; i++)
    Serial.println(y[i]);
  Serial.println("Eixo Z");
  for (i = 0; i < qtd; i++)
    Serial.println(z[i]);
  // imprime -fim

  while (1) {}

}


O algoritmo acima faz o seguinte:

1- Faz um cálculo de offset. Este offset é uma normalização das saídas X, Y e Z para termos um referencial zero, chamado de offset. Este valor será subtraído das próximas medições portanto ele define as saídas como zero quando o acelerômetro estiver parado. Como isto foi feito? Para garantir uma coleta de dados mais realista, quando o módulo é ligado, o software colhe os valores de saída para todos os eixos 1024 vezes e faz uma média destes valores. Esta média será o valor de offset. A média também funciona como um filtro para ruídos mecânicos. Após terminado o cálculo do offset, imprimi-se na serial a frase 'Offset Calculado!', aguarda alguns segundo para dar tempo de ligar o ventilador, e prossegue com a coleta de dados.

2- Após o ventilador ser ligado, inicia-se a coleta de dados que também é baseada na média aritmética dos valores colhidos com uma amostragem de 1024 elementos.

3- Subtrai-se o valor de offset. E coloca uma janela de valor ±20 unidades que será considerado como zero. Ou seja, todo valor colhido entre -20 e 20, após a subtração de offset, é considerado como zero.

4- E por fim, imprime os valores colhidos na serial.

Após isto ser feito, copiamos e colamos os valores colhidos numa planilha eletrônica e geramos um gráfico para cada eixo. Os resultados são os gráficos que se seguem.

Gráfico do eixo X que teve maior variação, ou seja, a direção em que o ventilador mais vibrou.





Gráfico do eixo Y com uma variação menor que no eixo X mas ainda apresentou alguma variação para valores negativos.



Gráfico do eixo Z mostrando que não houve vibração neste sentido.



É isso, com este algoritmo simples já podemos testar o módulo MMA7361.

Até o próximo artigo!

2 comentários:

  1. essa programação e as ligações se enquadram para arduíno Uno também?

    ResponderExcluir
  2. Ola. Boa Noite!
    Estou desenvolvendo um programa que necessita que o acelerômetro detecte queda livre.
    Como faço ?
    Obrigado. Urgentemente.

    ResponderExcluir