17 dezembro 2016

Acelerômetro 3 eixos MMA8452 com Arduino

Precisando de um sensor de inclinação, movimento e orientação para o seu projeto ? Vamos conhecer um pouco do MMA8452, 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 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.

Acelerômetro 3 eixos MMA8452 Pinagem

Na imagem acima podemos ver a pinagem do MMA8452:

  • VCC_IN - alimentação 3 à 5V
  • 3.3V - tensão de saída 3.3V
  • GND - terra
  • SCL - Interface I2C - Clock
  • SDA - Interface I2C - Data
  • SA0 - Seleção de endereço I2C (0x1C ou 0x1D)
  • Int 1 e Int 2 - Interrupções

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):

Arduino Uno e acelerômetro MMA8452




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.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
//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:

Orientação MMA8452

7 comentários:

  1. Na descrição do acelerômetro é indicado que ele possui Detector de movimento e detector de queda livre, como eu uso essas funções?

    ResponderExcluir
    Respostas
    1. Creio que seria o 3º eixo (para cima e para baixo).

      Excluir
  2. Na descrição do acelerômetro é indicado que ele possui Detector de movimento e detector de queda livre, como eu uso essas funções?

    ResponderExcluir
  3. Posso utilizar este acelerômetro para medir vibrações? Ou seja frequência de vibrações de estruturas? Posso?

    ResponderExcluir
    Respostas
    1. Oi Sérgio,

      Creio que sim, dependeria de testes, mas o sensor é bem sensível à vibrações, penso que vai funcionar com o seu projeto.

      Abraço!

      Adilson

      Excluir
  4. Bom dia, muito legal o tutorial, consigo utlizar esse módulo com a placa ATtiny85??? Obrigado!

    ResponderExcluir
    Respostas
    1. Oi Felipe,

      Vai precisar de algumas adaptações no programa, mas funciona sim. Dê uma olhada também no acelerômetro MPU-6050.

      Abraço!

      Adilson

      Excluir