Acelerômetro 3 eixos MMA8452 com Arduino

Precisando de um sensor de inclinação, movimento e orientação para o seu projeto? Vamos conhecer e usar o Acelerômetro 3 eixos MA8452 com arduino, um acelerômetro de 3 eixos e 12 bits de resolução, que tem a vantagem de utilizar a comunicação I2C, disponível na maioria das placas e microcontroladores do mercado.

Acelerômetro 3 eixos MMA8452 Arduino

O acelerômetro de 3 eixos MMA8452 suporta três faixas de deteção selecionáveis: ±2g, ±4g e ±8g. Tem também detecção de queda livre, detector de vibração e um baixo consumo de energia.

O hardware do acelerômetro MMA8452

O módulo MMA8452 (datasheet) funciona com tensões entre 3 e 5V, e tem os pinos da interface I2C (SDA e SCL) tolerantes à 5V, isso significa que você pode ligar o MMA8452 em placas que utilizam nível de sinal de 5V, como o Arduino Uno.

Na imagem acima podemos ver a pinagem do MMA8452:

O endereço I2C padrão do módulo é 0x1C. para alterar esse endereço, coloque o pino SA0 em nível alto (3.3V), o que vai alterar o endereço para 0x1D. Isso permite que você tenha em um mesmo barramento I2C dois módulos MMA8452.

Conexão MMA8452 e Arduino Uno

A conexão é bem simples, utilizando apenas os dois fios da interface I2C. No Arduino Uno, a conexão é feita nos pinos A4 (SDA) e A5 (SCL):

Programa teste acelerômetro MMA8452

O programa utiliza a biblioteca MMA8452 da Sparkfun, que você pode baixar neste link. Descompacte o arquivo e coloque a pasta SEQ_MMA8452 dentro da pasta LIBRARIES da IDE do Arduino.

//Programa: Acelerometro MMA8452
//Autor: Arduino e Cia
//Baseado no programa exemplo da biblioteca Sparkfun SFE_MMA8452

#include <Wire.h>
#include <SFE_MMA8452Q.h>

//Cria uma instancia do MMA8452 chamada acelerometro
//com endereco I2C 0x1C (pino SA0 em LOW/Desligado)
MMA8452Q acelerometro(0x1C);

void setup()
{
  Serial.begin(9600);
  Serial.println("Teste de comunicacao MMA8452");
  //Inicializa o acelerometro com o valores padrao de +/-2g e
  //saida de 800 Hz
  acelerometro.init();
  //Utilize a linha abaixo para inicializar o acelerometro com
  //+/-2g, 4g, or 8g, usando SCALE_2G, SCALE_4G, ou SCALE_8G
  //acelerometro.init(SCALE_4G);
  //Utilize a linha abaixo para determinar tambem a frequencia
  //de saida do acelerometro (padrao de 800 Hz), utilizando
  //como segundo parametro ODR_800 (800 Hz), ODR_400 (400 Hz),
  //ODR_200 (200 Hz), ODR_100 (100 Hz), ODR_50 (50 Hz),
  //ODR_12 (12.5 Hz), ODR_6 (6.25 Hz), ou ODR_1 (1.56 Hz)  
  //acelerometro.init(SCALE_8G, ODR_6);
}

void loop()
{
  //A linha abaixo aguarda o envio de novos dados pelo acelerometro
  if (acelerometro.available())
  {
    //Efetua a leitura dos dados do sensor
    acelerometro.read();
    //acelerometro.read() atualiza dois grupos de variaveis:
    //* int x, y, e z armazena o valor de 12 bits lido do
    //acelerometro
    // * float cx, cy, e cz armazena o calculo da aceleracao
    //dos valores de 12 bits. Essas variaveis estao em
    //unidades de "g"
    
    //Mostra as coordenadas lidas do sensor
    printCalculatedAccels();
    
    //Selecione a linha abaixo para mostra os valores digitais
    //printAccels();
    
    //Mostra a orientacao (retrato/paisagem/flat)
    printOrientation();
    Serial.println();
  }
}

void printAccels()
{
  Serial.print(acelerometro.x, 3);
  Serial.print("t");
  Serial.print(acelerometro.y, 3);
  Serial.print("t");
  Serial.print(acelerometro.z, 3);
  Serial.print("t");
}

void printCalculatedAccels()
{ 
  Serial.print(acelerometro.cx, 3);
  Serial.print("t");
  Serial.print(acelerometro.cy, 3);
  Serial.print("t");
  Serial.print(acelerometro.cz, 3);
  Serial.print("t");
}

void printOrientation()
{
  //acelerometro.readPL() retorna um byte contendo informacoes sobre
  //a orientacao do sensor (retrato/paisagem)
  //PORTRAIT_U (Retrato Up/Para cima), PORTRAIT_D (Retrato Down/Para Baixo), 
  //LANDSCAPE_R (Paisagem right/direita), LANDSCAPE_L (Paisagem left/esquerda)
  //e LOCKOUT (bloqueio)
  byte pl = acelerometro.readPL();
  switch (pl)
  {
  case PORTRAIT_U:
    Serial.print("Retrato Para Cima");
    break;
  case PORTRAIT_D:
    Serial.print("Retrato Para Baixo");
    break;
  case LANDSCAPE_R:
    Serial.print("Paisagem Direita");
    break;
  case LANDSCAPE_L:
    Serial.print("Paisagem Esquerda");
    break;
  case LOCKOUT:
    Serial.print("Plano");
    break;
  }
}

Carregue o programa e abra o serial monitor. Movimente o MMA8452 para que a orientação e as coordenadas sejam mostradas na tela:

Gostou? Confira outros posts utilizando acelerômetro aqui mesmo no Arduino e Cia!

5/5 - (2 votos)

Related posts

Como usar o módulo SD Card com Arduino

by Arduino e Cia
10 anos ago

Como usar o display matriz 16×8 TM1640 com Arduino

by Arduino e Cia
5 anos ago

Teclado matricial membrana 4×3 com Arduino

by Arduino e Cia
10 anos ago
Sair da versão mobile