Como funciona o acelerômetro? Interface ADXL335 com Arduino
Você já se perguntou como seu smartphone sabe de cima para baixo! É um dos recursos mais legais dos smartphones de hoje. Todos eles têm um pequeno dispositivo chamado Acelerômetro embutido no circuito que pode sentir quando você o inclina de um lado para o outro. É assim que seu smartphone descobre automaticamente quando mudar o layout da tela de retrato para paisagem.
Os acelerômetros são amplamente usados em aplicativos sensíveis ao custo, de baixo consumo de energia, de detecção de movimento e inclinação, como dispositivos móveis, sistemas de jogos, proteção de unidade de disco, estabilização de imagem e dispositivos de esportes e saúde.
Vamos dar uma olhada mais de perto no que eles são, o que fazem e como funcionam.
Conteudo
O que é aceleração?
O brilhante cientista Isaac Newton em sua segunda lei do movimento definiu a aceleração relacionando-a com a massa e a força.
Se você tiver uma certa força (digamos, a força em sua perna ao chutá-la para fora) e aplicá-la a uma massa (uma bola de futebol), fará com que a massa acelere (a bola vai disparar para o ar) .
Força = Massa x Aceleração
Aceleração = Força / Massa
Em outras palavras, a aceleração é a quantidade de força necessária para mover cada unidade de massa.
Como funciona o acelerômetro?
Para saber como funcionam os acelerômetros, muitas vezes é útil imaginar uma bola dentro de um cubo 3D.
Suponha que o cubo esteja no espaço sideral onde tudo está sem peso, a bola simplesmente flutuará no meio do cubo.
Agora vamos imaginar que cada parede representa um eixo particular.
Se movermos repentinamente a caixa para a esquerda com aceleração 1g (Uma única força G de 1g é equivalente à aceleração gravitacional 9,8 m/s2), sem dúvida a bola vai atingir a parede X. Se medirmos a força a que a bola se aplica a parede X, podemos obter um valor de saída de 1g no eixo X.
Vamos ver o que acontece se colocarmos esse cubo na Terra. A bola simplesmente cairá na parede Z e aplicará uma força de 1g, conforme mostra a figura abaixo:
Neste caso, a caixa não está se movendo, mas ainda obtemos uma leitura de 1g no eixo Z. Isso ocorre porque a força gravitacional está puxando a bola para baixo com força de 1g.
O acelerômetro mede a aceleração estática da gravidade em aplicações de detecção de inclinação, bem como a aceleração dinâmica resultante de movimento, choque ou vibração.
Como funciona o acelerômetro MEMS?
O acelerômetro MEMS (Micro Electro Mechanical Systems) consiste em uma estrutura micro usinada construída sobre uma pastilha de silício.
Esta estrutura é suspensa por molas de polissilício. Ele permite que a estrutura desvie no momento em que a aceleração é aplicada em um determinado eixo.
Devido à deflexão, a capacitância entre as placas fixas e as placas fixadas na estrutura suspensa é alterada. Esta mudança na capacitância é proporcional à aceleração naquele eixo.
O sensor processa essa mudança na capacitância e a converte em uma tensão de saída analógica.
Visão geral do hardware do acelerômetro ADXL335
No coração do módulo está um pequeno acelerômetro MEMS de eixo triplo de baixa potência da Analog Devices com ruído extremamente baixo – ADXL335. O sensor possui uma faixa de detecção completa de ±3 g. Ele pode medir a aceleração estática devido à gravidade em aplicações de detecção de inclinação, bem como a aceleração dinâmica resultante de movimento, choque ou vibração.
O sensor funciona com alimentação entre 1,8 V a 3,6 V CC (3,3 V ideal) e normalmente consome apenas 350 µA de corrente. No entanto, um regulador de 3,3 V integrado o torna a escolha perfeita para interface com microcontroladores de 5 V, como o Arduino.
Esta placa de ensaio amigável quebra cada pino do ADXL335 em um cabeçalho de pitch de 0,1 ″ e 6 pinos. Isso inclui 3 saídas analógicas para medições dos eixos X, Y e Z, 2 pinos de alimentação e um pino de autoteste que permite verificar o funcionamento do sensor na aplicação final.
As saídas analógicas são Ratiométricas, o que significa que a saída de medição de 0g é nominalmente igual à metade da tensão de alimentação de 3,3 V (1,65 V), -3g está em 0 V e 3g está em 3,3 V com escala total entre eles.
Aqui estão as especificações completas do IC do acelerômetro ADXL335.
Tensão operacional | 1.8V – 3.6V |
Corrente operacional | 350μA (típico) |
Alcance de detecção | ±3g (Escala Completa) |
Faixa de Temperatura | −40 a +85°C |
Eixo de detecção | 3 axis |
Sensibilidade | 270 a 330mV/g (Raciométrico) |
Resistência ao choque | Up to 10,000g |
Dimensão | 4mm x 4mm x 1.45mm |
Pinagem do acelerômetro ADXL335
Antes de mergulhar na conexão e no código de exemplo, vamos primeiro dar uma olhada em seu Pinout
O pino VCC fornece energia para o acelerômetro, que pode ser conectado a 5V no Arduino.
O pino X-Out emite tensão analógica proporcional à aceleração exercida no eixo X.
O pino Y-Out emite tensão analógica proporcional à aceleração exercida no eixo Y.
O pino Z-Out emite tensão analógica proporcional à aceleração exercida no eixo Z.
O pino GND está conectado ao GND no Arduino
O pino ST (autoteste) controla o recurso de autoteste. Este recurso é discutido em detalhes no final.
Conectando o acelerômetro ADXL335 ao Arduino UNO
Agora que temos um entendimento completo de como funciona o acelerômetro ADXL335, podemos começar a conectá-lo ao nosso Arduino.
As conexões são muito fáceis. Comece colocando o acelerômetro em sua placa de ensaio. Conecte o pino VCC ao pino 5V no Arduino e conecte o pino GND ao pino terra no Arduino. Também conecte as saídas X, Y e Z aos pinos analógicos A0, A1 e A2 no Arduino.
Para obter resultados precisos, precisamos alterar a voltagem de referência analógica (AREF) do Arduino. Isso pode ser feito conectando o pino de 3,3 V no Arduino ao pino AREF.
Quando terminar, você deve ter algo semelhante à ilustração mostrada abaixo.
Então, agora que conectamos nosso acelerômetro, é hora de escrever algum código e testá-lo.
Código Arduino – Leitura do acelerômetro ADXL335
O sketch é muito simples. ele simplesmente exibe a saída do sensor calibrado em cada eixo na interface serial. Experimente o esboço, antes de começarmos sua análise detalhada.
const int xInput = A0; const int yInput = A1; const int zInput = A2; // inicializa intervalos brutos mínimos e máximos para cada eixo int RawMin = 0; int RawMax = 1023; // Faça várias amostras para reduzir o ruído const int sampleSize = 10; void setup() { analogReference(EXTERNAL); Serial.begin(9600); } void loop() { // Leia os valores brutos int xRaw = ReadAxis(xInput); int yRaw = ReadAxis(yInput); int zRaw = ReadAxis(zInput); // Converta valores brutos para 'milli-Gs " long xScaled = map(xRaw, RawMin, RawMax, -3000, 3000); long yScaled = map(yRaw, RawMin, RawMax, -3000, 3000); long zScaled = map(zRaw, RawMin, RawMax, -3000, 3000); // re-scale to fractional Gs float xAccel = xScaled / 1000.0; float yAccel = yScaled / 1000.0; float zAccel = zScaled / 1000.0; Serial.print("X, Y, Z :: "); Serial.print(xRaw); Serial.print(", "); Serial.print(yRaw); Serial.print(", "); Serial.print(zRaw); Serial.print(" :: "); Serial.print(xAccel,0); Serial.print("G, "); Serial.print(yAccel,0); Serial.print("G, "); Serial.print(zAccel,0); Serial.println("G"); delay(200); } // Pegue amostras e retorne a média int ReadAxis(int axisPin) { long reading = 0; analogRead(axisPin); delay(1); for (int i = 0; i < sampleSize; i++) { reading += analogRead(axisPin); } return reading/sampleSize; }
A imagem a seguir mostra a saída do acelerômetro no monitor serial em diferentes posições.
Explicação do código:
O sketch começa declarando os pinos de entrada analógica do Arduino aos quais os pinos de saída X, Y e Z do sensor estão conectados.
A seguir, definimos os valores mínimo e máximo que o Arduino fornecerá. Como a placa Arduino contém conversor analógico para digital de 10 bits, ela mapeará as tensões de saída do sensor entre 0 e 3,3 volts em valores inteiros entre 0 e 1023. É por isso que RawMin está definido como 0 e RawMax está definido como 1023.
A variável sampleSize diz ao Arduino para obter 10 amostras de cada conversão para obter resultados mais precisos.
const int xInput = A0; const int yInput = A1; const int zInput = A2; // inicializa intervalos brutos mínimos e máximos para cada eixo int RawMin = 0; int RawMax = 1023; // Faça várias amostras para reduzir o ruído const int sampleSize = 10;
Na função de configuração, devemos definir a referência analógica como EXTERNA, pois conectamos 3,3 V ao pino AREF no Arduino. Isso é feito chamando analogReference (EXTERNAL).
Você pode ler mais sobre a função no site oficial do Arduino. Exceto isso, inicializamos as comunicações seriais com o PC.
Aviso:
Se você falhar na chamada analogReference (EXTERNAL), você fará um curto entre a tensão de referência ativa (gerada internamente) e o pino AREF, possivelmente danificando seu Arduino.
analogReference(EXTERNAL); Serial.begin(9600);
Na função de configuração, lemos as saídas analógicas do sensor a cada 200ms. Em vez de chamar a função analogRead(), estamos chamando a função customizada ReadAxis(). Esta função apenas pega 10 amostras de conversões ADC e retorna a média.
// Leia os valores brutos int xRaw = ReadAxis(xInput); int yRaw = ReadAxis(yInput); int zRaw = ReadAxis(zInput);
Conversão de saída ADXL335 em aceleração (g)
O seguinte trecho de código é a parte mais importante do programa. Ele mapeia e converte as tensões de saída analógica do sensor em gravitacional acceleration(G).
A função map() embutida do IDE faz o mapeamento real. Portanto, quando chamamos map(xRaw, RawMin, RawMax, -3000, 3000)
, o valor de RawMin
seria mapeado para -3000, um valor de RawMax
para 3000 e os valores intermediários para valores intermediários.
Os valores -3000 e 3000 não são arbitrários. Na verdade, eles representam a aceleração gravitacional (em mili-g que é 1/1000 de a g) medida pelo sensor, isto é, ±3g (-3000 mili-g a 3000 mili-g).
Por exemplo,
- Quando o sensor gera 0 volts no eixo x, ou seja, xRaw = 0, a função map() retornará -3000, representando -3g.
- Quando o sensor gera 3,3 volts no eixo x, ou seja, xRaw = 1023, a função map() retornará 3000 representando + 3g.
- Quando o sensor gera 1,65 volts no eixo x, ou seja, xRaw = 511, a função map() retornará 0 representando 0g.
O termo Ratiométrico fará mais sentido agora, pois a tensão de saída aumenta linearmente com a aceleração ao longo do intervalo.
// Converta valores brutos para 'milli-Gs " long xScaled = map(xRaw, RawMin, RawMax, -3000, 3000); long yScaled = map(yRaw, RawMin, RawMax, -3000, 3000); long zScaled = map(zRaw, RawMin, RawMax, -3000, 3000);
Finalmente, a saída do sensor é reduzida para Gs fracionário dividindo-a por 1000 e exibida no monitor serial.
// redimensiona para Gs fracionário float xAccel = xScaled / 1000.0; float yAccel = yScaled / 1000.0; float zAccel = zScaled / 1000.0; Serial.print("X, Y, Z :: "); Serial.print(xRaw); Serial.print(", "); Serial.print(yRaw); Serial.print(", "); Serial.print(zRaw); Serial.print(" :: "); Serial.print(xAccel,0); Serial.print("G, "); Serial.print(yAccel,0); Serial.print("G, "); Serial.print(zAccel,0); Serial.println("G");
Recurso de autoteste ADXL335
O Acelerômetro ADXL335 possui um recurso de autoteste que permite verificar o funcionamento do sensor na aplicação final.
O pino ST (autoteste) no módulo controla este recurso.
Quando o pino ST é conectado a 3,3 V, uma força eletrostática é exercida no feixe do acelerômetro internamente. O movimento resultante do feixe permite ao usuário testar se o acelerômetro está funcionando.
A mudança típica na produção é
- -1,08 g (-325 mV) no eixo X
- +1,08 g (+325 mV) no eixo Y
- +1,83 g (+550 mV) no eixo Z
Este pino ST pode ser deixado em circuito aberto ou conectado ao GND em uso normal.
Aviso:
Expor o pino ST a tensões superiores a 3,6 V pode danificar o acelerômetro permanentemente.