smuqui
Published © GPL3+

Accelerometer

Better code for the MMA8452Q

BeginnerFull instructions provided3,215
Accelerometer

Things used in this project

Story

Read more

Schematics

adafruit_mma8451_library-master_yMDOCnRoLl.zip

Code

Accelerometer

Arduino
#include <Wire.h>

//#include <SFE_MMA8452Q.h>
#include <SparkFun_MMA8452Q.h>
//#include <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");
  acelerometro.init(); //Inicializa o acelerometro com o valores padrao de +/-2g e saida de 800 Hz


  if (! acelerometro.init()) {
    Serial.println("Couldnt start");
    while (1);
  }
  Serial.println("MMA8451 found!");


  //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_800);
}

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"
    // printAccels();

    //Mostra as coordenadas lidas do sensor
    printCalculatedAccels();
    delay(50);
    //Selecione a linha abaixo para mostra os valores digitais
    //printAccels();

    //Mostra a orientacao (retrato/paisagem/flat)
    //printOrientation();

    Serial.println();
    if (acelerometro.cx == 0)
      Serial.println("origem");
      smoothing_Readings();
       float averagey;
         Serial.print("Med_y");
  Serial.print (averagey);
       
    /*
        
        float averagex;
       
        float averagez;
        Serial.print(averagex);
        Serial.println("AVERAGEx");
        Serial.print(averagey);
        Serial.println("AVERAGEy");
        Serial.print(averagez);
        Serial.println("AVERAGEz");
    */
  }
}
//Funções automáticas da library!!!

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("   x:  ");
    double x= ((acelerometro.cx * 10));
  Serial.print(x);
  Serial.print("m/s^2 ");
double  limitX = constrain(x, -8, 8);       //limtar o valor das amostraS ao valor máximo da escala "8G"
  double X = map(limitX, -8, 8, -90, 90);     //converter os valores máximos e mínimos de aceleração em graus!
  Serial.print(X);                              //"Our" new value for x
  Serial.print("º ");
  if (x > 0) {
    Serial.print("Forward");
  } else {
    Serial.print("Backward");
  }

  Serial.print("   y:  ");
   double y = ((acelerometro.cy * 10));
  Serial.print(y);
  Serial.print("m/s^2 ");
  double  limitY = constrain(y, -8, 8);       //limtar o valor das amostraS ao valor máximo da escala "8G"
  double Y = map(limitY, -8, 8, -90, 90);     //converter os valores máximos e mínimos de aceleração em graus!
  Serial.print(Y);
  Serial.print("º ");
  if (y > 0) {
    Serial.print(",Left");
  } else {
    Serial.print(",Right");
  }
  Serial.print("   z:  ");
    double z =  ((acelerometro.cz * 10));
  Serial.print(z);
  Serial.print("m/s^2 ");
  double  limitZ = constrain(z, -8, 8);
  double Z = map(limitZ, -8, 8, -90, 90);
  Serial.print(Z);
  Serial.print("º ");
  if (acelerometro.cz > 0) {
    Serial.print(",UP");
  } else {
    Serial.print(",DOWN");
  }
}
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;
  */
}

Credits

smuqui
0 projects • 2 followers

Comments