Funcionamento do Acelerômetro MMA7361 com a IDE Processing

Ola galera!!!!!!!!!

https://www.youtube.com/watch?v=ePW57SFFOks&feature=youtu.be

Estou agora demonstrando o funcionamento do Acelerômetro MMA7361.

Confesso que eu tive muita dificaldade em trabalhar com este cara.

Na internet só falava de outros acelerômetros mas eu achei esse componenete muito bom.

Achei uns códigos e fucei bastante e coloquei o bicho pra funcionar. 'ALELUIA IRMÃO!!!!!!!!!!!!'

Ai está a foto do cara:

Aqui está a especificação dos pinos:

Ao montar o circuito, repare que será necessário ligar o pino 3.3 Volts do Arduino Uno R3 ao pino AREF, para que tenhamos uma tensão de referência. Sem ele, a leitura dos dados fica totalmente prejudicada:

Se possível, recomendo a ligação fora da protoboard ou então a utilização de um mini protoboard, como mostrado no circuito, isso vai facilitar bastante na hora de testar os movimentos com o módulo.

Para teste vou usar um dos 3 programas exemplo que vem na própria biblioteca do MMA7361, o programa G_FORCE. Carregue o programa no Arduino, movimente o sensor e veja no serial monitor como se comportam as variações dos eixos X, Y, Z, e a gravidade (G).

Observando que um acelerômetro sobre a superfície terrestre está submetido à aceleração da gravidade, 1g ou -9,81g no eixo Z quando não está submetido a nenhum a inclinação ou aceleração linear, pode-se estimar a leitura do celerômetro.

Existem várias formulas matemáticas para demostrar o funcionamento do acelerômetro mas só vou apresentar as que eu usei no código se não vai ficar muito extenso o papo.

Eu estou usando o fator de correção PITCH e ROLL.

O fator multiplicativo converte os ângulos de graus para radianos é de PI/180°.

Obtidos os ângulos de rotação, os vetores de estimação (Vert, H1 e H2) são atualizados por meio da aplicação da função “rotate3D”, que aplica nestes vetores uma matriz de rotação tridimensional em torno do eixo X T e do eixo Y T, denotada por Mxy.

Neste ponto, o algoritmo já calculou uma estimação vetorial da orientação do sistema, que pode ser exibida graficamente em um computador ou em uma tela de cristal líquido acoplada ao sistema. Para se fazer uso de atuadores mecânicos (no caso deste trabalho, servomotores), porém, é necessário calcular o valor numérico dos ângulos pitch e roll.

    //Roll & Pitch equacoes para posicionamento espacial
    roll  = (atan2(-fYg, fZg)*180.0)/M_PI;
    pitch = (atan2(fXg, sqrt(fYg*fYg + fZg*fZg))*180.0)/M_PI;

Abaixo vocês podem observa o código usado no Arduino:

#include <AcceleroMMA7361.h>

AcceleroMMA7361 accelero;

double fXg = 0;
double fYg = 0;
double fZg = 0;

const float alpha = 0.3;

void setup()
{
  Serial.begin(9600);
 //              SL  ST  0G  GS   X   Y   Z
  accelero.begin(13, 12, 11, 10, A0, A1, A2);
  accelero.setARefVoltage(3.3);                   //Voltagem de referencia 3,3 Volts
  accelero.setSensitivity(LOW);                   //Setando a sensibilidade para +/-6G
  accelero.calibrate();
}

void loop()
{
    double pitch;
    double roll;
    double Xg;
    double Yg;
    double Zg;
        
        
    Xg = accelero.getXAccel();
    Yg = accelero.getYAccel();
    Zg = accelero.getZAccel();

    //Filtro
    fXg = Xg * alpha + (fXg * (1.2 - alpha));
    fYg = Yg * alpha + (fYg * (1.2 - alpha));
    fZg = Zg * alpha + (fZg * (1.2 - alpha));

    //Roll & Pitch equacoes para posicionamento espacial
    roll  = (atan2(-fYg, fZg)*180.0)/M_PI;
    pitch = (atan2(fXg, sqrt(fYg*fYg + fZg*fZg))*180.0)/M_PI;

    Serial.print(pitch);
    Serial.print(":");
    Serial.println(roll);

    delay(10);
}

O código no Processing vocês vem abaixo:

import processing.serial.*;

Serial fd;

int pitch = 0;
int roll = 0;

void setup ()
{
  size(640, 360, P3D);
  //Conexao com a porta
  fd = new Serial(this, "/dev/ttyUSB0", 9600);
  fd.bufferUntil('\n');
 
  noStroke();
  colorMode(RGB, 1);
}

void draw ()
{
  //Set background
  background(0);

  pushMatrix();
 
  translate(width/2, height/2, -30);

  //Roatcao
  rotateX(((float)roll ) * PI / 180);
  rotateZ(((float)pitch) * PI / 180);
 
  print("Pitch: ");
  print(pitch);
  print(", Roll: ");
  println(roll);
 
  scale(90);
  beginShape(QUADS);

  fill(0, 1, 1); vertex(-1,  1,  1);
  fill(1, 1, 1); vertex( 1,  1,  1);
  fill(1, 0, 1); vertex( 1, -1,  1);
  fill(0, 0, 1); vertex(-1, -1,  1);

  fill(1, 1, 1); vertex( 1,  1,  1);
  fill(1, 1, 0); vertex( 1,  1, -1);
  fill(1, 0, 0); vertex( 1, -1, -1);
  fill(1, 0, 1); vertex( 1, -1,  1);

  fill(1, 1, 0); vertex( 1,  1, -1);
  fill(0, 1, 0); vertex(-1,  1, -1);
  fill(0, 0, 0); vertex(-1, -1, -1);
  fill(1, 0, 0); vertex( 1, -1, -1);

  fill(0, 1, 0); vertex(-1,  1, -1);
  fill(0, 1, 1); vertex(-1,  1,  1);
  fill(0, 0, 1); vertex(-1, -1,  1);
  fill(0, 0, 0); vertex(-1, -1, -1);

  fill(0, 1, 0); vertex(-1,  1, -1);
  fill(1, 1, 0); vertex( 1,  1, -1);
  fill(1, 1, 1); vertex( 1,  1,  1);
  fill(0, 1, 1); vertex(-1,  1,  1);

  fill(0, 0, 0); vertex(-1, -1, -1);
  fill(1, 0, 0); vertex( 1, -1, -1);
  fill(1, 0, 1); vertex( 1, -1,  1);
  fill(0, 0, 1); vertex(-1, -1,  1);


  endShape();

  popMatrix();
}

// Interrupcao serial
void serialEvent (Serial fd)
{
 
  String rpstr = null;
 
  try {
    rpstr = fd.readStringUntil(10);

    if (rpstr != null) {
      String[] list = split(rpstr, ':');
     
      
        pitch = ((int)float(list[0]));
        roll =  ((int)float(list[1]));
    }
 
  } catch( ArrayIndexOutOfBoundsException e ) {
    print("Erro!!!!!!\n");
  }
}

Podem copiar e colar sem dó. Está funcionando perfeitamente.

Exibições: 2360

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Francisco Lucena Gomes Jr em 5 fevereiro 2016 às 7:52

Christiano, em primeiro lugar, obrigado por se dispor a me ajudar. Agora voltando ao acelerômetro, vamos por partes. O que é mesmo libe? :-)

Comentário de Christiano Reis em 4 fevereiro 2016 às 22:38

Este código acima eu peguei de outro acelerômetro e ainda estava errrado. Tive que corrigir e fazer algumas implementações. Mas, me deparei com o mesmo problema Francisco Lucena Gomes Jr. Suei a camisa pra colocar o bicho pra funcionar. Você fará o seguinte...

Se você estiver usando o Arduino, veja a libe do seu acelerômetro.

Veja como ele retorno a força G que é 1 ou 100 no eixo Z.

Depois você jogará o valor na variável Zg.

Tem que retorna a força gravitacional em uns dos eixos.

O valor ou é 1 ou é 100. Só um dos dois valores.

Comentário de Francisco Lucena Gomes Jr em 4 fevereiro 2016 às 18:03

Olá Christiano. Muito bom essa tua postagem. Eu comprei um acelerômetro ADXL 335, mas tudo que consegui foi uns números que não faziam sentidos, mesmo com o acelerômetro parado, os números mudavam. Comprei um ADXL 345 e a mesma coisa. Será que vc pode me dar uma ajuda?

Comentário de Christiano Reis em 2 fevereiro 2016 às 14:59
Comentário de José Gustavo Abreu Murta em 2 fevereiro 2016 às 7:42

Excelente teste do sensor !

Parabéns !

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço