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

Nenhum comentário:

Postar um comentário