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.
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.
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.
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!
essa programação e as ligações se enquadram para arduíno Uno também?
ResponderExcluirOla. Boa Noite!
ResponderExcluirEstou desenvolvendo um programa que necessita que o acelerômetro detecte queda livre.
Como faço ?
Obrigado. Urgentemente.
Bom dia, amigo.
ResponderExcluirGostaria 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.