Você está na página 1de 6

https://groups.google.com/forum/#!

topic/floripa-hackerspace/VsAo6s4l3l8

Opa,

Só pra dar uma atualizada no projeto:


- O acelerômetro que temos é o MMA7361 da Freescale[1] montada pela lcsoft[2].
- Alimentamos o acelerômetro com os 3.3V da placa do Arduino.
- A referência do conversor analógico-digital do Arduino (AREF) foi
ligada nos mesmos 3.3V de alimentação.
- As saídas do acelerômetro foram ligadas nas entradas A0, A1 e A2 do Arduino.
- As saídas do acelerômetro são radiométricas (um valor nulo de saída é Vdd/2).
- O acelerômetro foi configurado para ±1.5g, então temos uma variação
de saída de 0.8V/g, o que corresponde a um valor de 248 da leitura do
Arduino.
- Portanto, uma leitura nula deveria acusar 512. 1g seria 760 e -1g seria 264.

Acontece que apareceu um offset muito grande em cada um dos eixos.


Tentei desenvolver algum jeito de determinar o offset de cada eixo,
mas não consegui. Aqui estão alguns valores que obtivemos orientando o
acelerômetro de 6 jeitos diferentes (lembrando que a magnitude dos 3
vetores deveria sempre ser 1g: a gravidade):
X Y Z
481.9570 520.5160 692.5450
479.5410 277.3670 426.1980
478.9130 768.3110 468.9560
469.8040 509.9370 199.2210
233.0760 527.1970 454.9440
722.2080 525.3270 440.0410

Cada valor desses deve ter 512 reduzido e o resultado dividido por 248
para obter o valor em g. Por exemplo:
(692.5450-512)/248 = 0.728g

A equação que eu acredito que deveria ser solucionada é:


1 = sqrt( (X+offX)^2 + (Y+offY)^2 +(Z+offZ)^2 )

na qual offX, offY e offZ são os offsets de cada eixo. Isso é supondo
que o erro de cada eixo se limita a um valor de offset. Se alguém
tiver uma sugestão para encontrarmos os offsets, por favor nos avise
=)

Outros problemas que analisamos foram a taxa de amostragem e


transferência. O acelerômetro diz que sua taxa de amostragem é de
11kHz. Porém, a taxa de amostragem analógica padrão do Arduino é
~9kHz. Sendo que temos três eixos, poderíamos amostrar os 3 em ~3kHz.
É necessário filtrar o ruído dos dados lidos, o que acarreta um certo
peso computacional. A ideia final que tivemos foi fazer o avr
funcionar somente para a amostragem e transferência dos dados pela
serial para o computador, e um programa no computador faria os
cálculos de deslocamento. Assim o avr poderia se concentrar em fazer
medições com precisão (tendo uma taxa de amostragem bem fixa, o que
ajuda nos cálculos) e transferir os dados para o computador.

Outro problema que tem que ser muito bem tratado é o fato de termos
que integrar duas vezes para obter a posição, e integração só
amplifica ruído. E mais um problema é o número de graus de liberdade
que o sensor vai ter. Se ele tiver que se mexer em todas as direções e
puder girar em volta de qualquer eixo, teremos um problema muito maior
para resolver, e que provavelmente precisará de um IMU[3] com pelo
menos acelerômetro e giroscópio.

Ramiro
[1] http://www.sparkfun.com/datasheets/Components/General/MMA7361L.pdf
[2] http://www.lctech-inc.com/Hardware/Detail.aspx?id=053796b3-3b90-4fe5-8588-
7b5d14bc0512
[3] http://en.wikipedia.org/wiki/Inertial_measurement_unit

Como medir velocidade e deslocamento a partir de um acelerômetro

Como alguns de vocês já sabem, estou na fase de formulação da minha tese de mestrado. E uma das

principais necessidades do meu projeto é a medida da velocidade e posicionamento de determinado

objeto em movimento (em outra oportunidade explico melhor o que estou desenvolvendo). E é claro que,

quando surgiu essa necessidade, não tive dúvidas de que um acelerômetro seria uma solução bastante

interessante para o meu problema.

Como não encontrei na internet muitas informações em português sobre esses dispositivos, resolvi

escrever este post para ajudar aqueles que, com um inglês não muito bom, estão tentando entender um

pouco sobre o assunto.

Durante minhas pesquisas, encontrei um Application Note da Freescale muito interessante onde eles

mostram um algoritmo bem simples para transformarmos a aceleração captada pelo acelerômetro em

velocidade e/ou espaço. E são as informações deste documento da Freescale que eu vou tentar resumir

aqui para vocês.

Para começar vamos tentar definir o que é um acelerômetro. Os acelerômetros são dispositivos que

captam variações de aceleração e as transformam em um sinal elétrico analógico. Eles são baseados na

Segunda Lei de Newton que diz que uma força aplicada a uma determinada massa gera uma aceleração

diretamente proporcional à esta força (F=m.a). Então, dentro do acelerômetro existe uma massa

“conhecida”. Sabendo-se qual foi a força aplicada sobre ela, torna-se possível o cálculo da aceleração.

Não vou me prender muito nesses detalhes porque a internet está cheia desse tipo de informação.

A maneira mais fácil de compreendermos como podemos converter aceleração em velocidade e espaço é

fazendo uma revisão das nossas queridas física e matemática.


Sabemos que se integrarmos a aceleração a(t), obteremos a velocidade v(t) e que se integrarmos a

velocidade v(t), obteremos o deslocamento s(t), ou seja:

Outra coisa que devemos lembrar é que a integral de uma função nada mais é do que a área formada

abaixo do seu gráfico e que esta área pode ser calculada dividindo-a em n retângulos cuja largura tende a

zero e em seguida somando-se a área de cada um desses retângulos, conforme ilustra a figura abaixo.

Visto isso, deduzimos que podemos então amostrar em intervalos fixos o sinal vindo do acelerômetro e

assim montar a área de cada retângulo amostrado para daí conseguirmos encontrar a velocidade a partir

da soma de cada uma dessas áreas.

No entanto ao fazermos isso é criado um erro de amostragem conforme mostrado na figura a seguir:
Se no seu sistema, precisão não for um item de extrema importância, é possível que esse erro seja

desprezível. Mas no caso do meu projeto, por exemplo, esse tipo de erro é inadmissível. Estão como

resolver esse problema?

Bom, uma idéia é a seguinte: ao invés de dividirmos a área em retângulos podemos dividi-la em

retângulos e triângulos como mostrado na próxima figura:

A área total de cada divisão pode ser obtida pela soma da Área 1 com a Área 2 conforme mostra a
fórmula a seguir:
Com esta nova abordagem, temos agora uma aproximação muito melhor do valor da velocidade a partir

da aceleração.

Isso resolvido, nos deparamos com outro probleminha básico: como saberemos se temos uma aceleração

(aceleração positiva) ou uma desaceleração (aceleração negativa)? Esta é outra pergunta fácil de ser

respondida. Os acelerômetros trabalham com um sinal de saída que varia de 0 a V dd volts, onde

Vdd dependerá das suas especificações, ou seja, ele apresenta apenas valores positivos de saída.

Quando parados, eles fornecem um offset de saída que dependerá da sua posição. Se ele estiver

perfeitamente paralelo à superfície da terra, sua saída será de de V dd/2. Sabendo-se isso, para obtermos

os valores positivos e negativos da aceleração basta deduzirmos que para valores abaixo de V dd/2, temos

acelerações negativas e que para valores acima de V dd/2 temos acelerações positivas. Em outras

palavras, se subtrairmos o sinal vindo do acelerômetro do valor de offset (V dd/2), teremos certinho os

valores positivos e negativos da aceleração. Isso pode ser observado no esquema abaixo:

Na figura abaixo temos um exemplo de um sinal amostrado a partir de um acelerômetro. Nela A1

representa uma aceleração positiva e A2 representa uma aceleração negativa.

Até agora falamos apenas de encontrarmos o valor da velocidade a partir da aceleração. Vocês devem
estar se perguntando: Mas e o deslocamento? Pois é, como falei no inicio do post, o espaço nada mais é

do que a integral dupla da aceleração, ou seja, se é o deslocamento que queremos, teremos que tomar a
velocidade encontrada e integrá-la utilizando novamente a fórmula apresentada no início

(árean=amostran…).

Abaixo temos um exemplo da transformação da aceleração em velocidade e deslocamento:

É assim que se faz…

Espero que esse tutorial tenha sido útil a vocês.

Um forte abraço e até a próxima.

Você também pode gostar