Pular para o conteúdo principal

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!

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
  3. Bom dia, amigo.
    Gostaria de saber qual a biblioteca que vc usou para seu projeto.
    Estou tendo problemas, acredito que, com a biblioteca que estou usando juntamente com o acelerometro e o DUE. No MEGA 2650 e o UNO funciona tudo certinho mas quando tento usar no DUE não vai.
    Valeu muito obrigado.

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Controlando LED via Bluetooth utilizando o Módulo HC-05

Hoje abordaremos uma breve demonstração de conexão do Módulo Bluetooth HC-05 Master/Slave com um dispositivo externo, e após a conexão utilizar o dispositivo para controlar um LED. A Placa Base utilizada como controladora é a Arduino Uno , que foi utilizada em conjunto com o Protoshield compatível com a mesma. Todos os itens utilizados podem ser adquiridos em nossa loja . Note que o Módulo Bluetooth HC-05 Master/Slave possui níveis de tensão de alimentação e operação diferentes, sendo que pode ser alimentado com  uma tensão entre 3,3v e 6v (no projeto foi alimentado com 5v, direto de um dos pinos do Arduino Uno ), mas a sua tensão de operação é de 3,3v. IMPORTANTE:    O Arduino consegue reconhecer a tensão de 3,3v no terminal RX como nível lógico alto, mas somente fornece 5v no terminal Tx como nível lógico alto. Portanto, se for utilizar os terminais Rx e Tx para a comunicação com os terminais Tx e Rx do HC-05,  o terminal Tx do HC-05 pode ser conectado diretamente ao ter

Como programar com Programador KIT 3.5 para PIC

Nesta postagem iremos falar sobre o Programador KIT 3.5 O Programador KIT 3.5 é um programador para microcontroladores PIC bastante completo, até o momento compatível com  mais de 600 dispositivos da linha de microcontroladores da Microchip, incluindo a nova linha dsPIC. (Confira aqu i a lista com os microcontroladores compatíveis com o Kit 3.5) Permite a programação diretamente na placa (ICSP) ou então através de conectores ZIF (não inclusos). Detalhe para a interface ICSP Com ele é possível gravar (programar), ler, verificar e copiar os códigos dos microcontroladores, através do software gratuito PicKit 3 Programmer ( instruções de uso ), uma vez que ele é totalmente compatível com o PICkit3. Lembrando que este software é apenas para a gravação do arquivo HEX no seu microcontrolador, sendo que é necessário gerar esse arquivo em um compilador de sua escolha. Além disso, é possível utilizá-lo como ferramenta de depuração (debug) através do software MPLAB. Caract

Utilizando o Programador USB para PIC K150

Nessa postagem iremos demonstrar a utilização do Programador USB para PIC K150 O gravador possui um soquete do tipo ZIF (ZIF - Zero Insertion Force - é um soquete com uma alavanca, que permite a colocação e a retirada dos microcontroladores sem risco de danificar seus terminais) para a programação dos microcontroladores. Conta também com um conector para a programação ICSP (In Circuit Serial Programming, que será abordada futuramente em outra postagem, pois é necessário que se faça algumas adaptações no circuito a ser programado). O programador é controlado pelo PIC16F628A, e no site do fabricante do gravador é possível encontrar informações sobre como atualizar o firmware do gravador, para possibilitar a gravação de mais dispositivos. Instalação do Programador USB para PIC K150 Se você estiver utilizando o Windows 7/Vista/XP, o driver deve ser instalado normalmente, sem que seja necessária a interferência do usuário. Caso esteja utilizando o Windows 8/8.1, o processo é um po