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.
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:
- 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):
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!
Na descrição do acelerômetro é indicado que ele possui Detector de movimento e detector de queda livre, como eu uso essas funções?
Creio que seria o 3º eixo (para cima e para baixo).
Na descrição do acelerômetro é indicado que ele possui Detector de movimento e detector de queda livre, como eu uso essas funções?
Posso utilizar este acelerômetro para medir vibrações? Ou seja frequência de vibrações de estruturas? Posso?
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
Bom dia, muito legal o tutorial, consigo utlizar esse módulo com a placa ATtiny85??? Obrigado!
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
olá!
gostaria de saber como faço para cotar preços dos sensores de vocês.
obrigada
Boa tarde!
Recomendo que vc entre direto no site da FilipeFlop. Lá eles vão te dar todas as informações/cotações. 🙂
Abraço!
Adilson
Olá!
Estou usando um arduino NANO e as conexões de SCL e SDA para comunicação I2C são nos mesmos pinos (A5 e A4, respectivamente). Porém, meu código trava no .init()
Como foi dito que o sensor suportava a tensão de 5V, eu utilizei ela inicialmente, depois utilizei também a conexão em 3,3V, mas parece que meu sensor simplesmente não responde.
Vocês fazem alguma ideia do que poderia estar dando errado?
Caso o sensor não tenha vinda com defeito ou eu o tenha queimado de alguma forma, só me resta acreditar que fiz a solda dos pinos errada, apesar de estar aparentemente certo, apenas levemente torto kkkk
Oi Alexandre!
Será que o programa está encontrando o endereço do sensor que vc tem aí? Pode ser que alguns fabricantes tenham alterado esse endereço. Tente usar o I2CScanner para verificar o endereço do sensor que vc tem aí.
Abraço!
Adilson
Olá,
Gostaria de saber se é possível trabalhar com 3 acelerômetros simultâneos, se for seria possível fornecer a ligação e a programação?
Obrigado
Boa tarde,
Tentei utilizar o código e a ligação disponibilizada mas quando vou vizualizar as coordenadas aparece apenas a seguinte mensagem:
Teste de comunicação MMA8452.
Poderia me ajudar ?
Oi Michel,
Rode o I2CScanner para conferir o endereço I2C do módulo.
Abraço!
Adilson