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!