Accelerometre MMA7361

Salut à tous,

Voila, j'ai une carte Arduino UNO et un accelerometre MMA7361. Le truc, c'est que je n'arrive pas a comprendre comment un accelerometre fonctionne, je m'explique:

Dans un programme, on demande de verifier si, par exemple, un bouton est appuyer ou non (0 ou 1). mais pour un accelerometre, je suppose que la valeur change en fonction de son inclinaison.
Donc je ne sais pas comment m'y prendre pour ecrire ce programme.
Pour faire des teste est comprendre, j'aurai voulu ajouter 4 led pour indiquer en quel position on ce trouve (idee prit d'une video youtube, mais je la retrouve plus).

je m'explique:

on met les led comme sa sur une planche de test:

1
3 5 4
2

donc si j'incline vers l'avant, c'est la led 1 qui sallume, en arriere cest la 2 etc... et 5 quand il est bien horizontal.

je ne demande pas forcement le programme en lui meme, mais juste comment indiquer a partir d'une certainne valeur on allume la led 1 ou 2 etc...

si des tutos existe je suis prennant.

pour repondre a la question: as-tu chercher sur internet, ou sur le forum?

Oui, mais aucun ne me donne de reponse plus ou moin precise sur ce que je cherche.

cordialement

kevin jouan

Jolie timing, j'ai u des difficulté avec le même accéléromètre il y a une semaine, XD . Alors le MMA7361 renvoi un signal analogique pour chaque axes x y z, avec une valeur 1.65V à 0G. Il faut ajouter un condensateur sur chaque sortie x y z pour réduire les fluctuations du signal, pour ma part un 1uf. Ensuite il faut brancher la sortie 3.3v du MMA au AREF du UNO via une résistance 10K ohms au moins.
voila le code de base que j'ai utilisé, il affiche les valeur de G dans le moniteur série.

int x,y,z;
float vx, vy, vz, gx, gy, gz;


void setup()
{
  Serial.begin(9600);
  analogReference(EXTERNAL);    //set aref to 3.3v, if you use built in 3.3v for value, use a 15K resistor to limit current
}


void loop()
{
  // Read in accelerometer values
  x = analogRead(A0);
  y = analogRead(A1);
  z = analogRead(A2);
  
  // Convert ADC values to voltages and G values
  // The formula for voltage conversion is v = (ADCREAD*VREF/1023)-ZGV, where ZGV is "Zero-G voltage" (voltage at 0G)
  // ZGV is found in the spec sheet and happens to be 1.5 in our case.  Warning: you need to make the variable signed!
  // The formula for G conversion is g = v/SENSITIVITY.  The sensitvity is also found in the spec sheet and happens to be 800 mV/g here.
  // Remember to make your units consistent! (g = v[V]*1000 / SEN [mV] )
  vx = (x*3.3/1023)-1.65;
  gx = vx*10/8;
  vy = (y*3.3/1023)-1.65;
  gy = vy*10/8;
  vz = (z*3.3/1023)-1.65;
  gz = vz*10/8;
 
  Serial.print("vx=");
  Serial.print(gx,DEC);   // delet the dec?
  Serial.print("  ");
  Serial.print("vy=");
  Serial.print(gy,DEC);   //delete the dec?
  Serial.print("  ");
  Serial.print("vz=");
  Serial.println(vz,DEC);   //delete the dec?
  
  delay(500);
  
}

Ou alors regarde cette librairie MMA7361 pour Arduino :
https://code.google.com/p/mma7361-library/

salut,

merci beaucoup pour les infos :smiley: ,je vais regarder tout sa, mais a premiere vue, sa a repond a pas mal des questions

mercie beaucoup

crdl

j'ai juste un ptit probleme, c'est que quand je connecte au AREF avec la resistance de 10K, le MMA n'est plus allimenter, pourtant jai bien vu qu'on allimente avec tu 3.3v avec le aref, alors que quand je branche sur la sortit 3.3v de la UNO, la led rouge du MMA s'allume... est-je louper une etape? et les condensateur sont-il necessaire, où je peut attendre encore avant dans acheter?

visiblement on a pas le même circuit pour le MMA, celui que j'ai, vient de la boutique Semageek. il a un régulateur 3.3v embarqué qui fourni du 3.3v sur une des pin du mma. Je suppose que tu a celui qui a six pin de chaque coté du circuit?

Donc pour commencer, vérifie dans la datasheet qu'il y a bien une pin qui fournie du 3.3v. Ensuite la pin AREF ne sert pas a alimenter le mma, mais permet a l'arduino de savoir a quel est la tension de fonctionnement du capteur. Ça permet d'améliorer la précision. Si tu n'a pas de sortie 3.3v sur le mma utilise celle de l'arduino.

Edit: si tu as bien le mma avec 6pin de chaque coté, je viens de voir que certain n'ont pas la sortie 3.3v donc il faut prendre celui de l'arduino.

Les condensateurs ne sont pas nécessaire pour faire marcher le capteur. Ils permettent seulement de filtrer un peu le signal de chaque axe, et d'avoir une valeur en G plus stable.

moi j'ai celui la:

http://www.smecatronix.com/fr/capteurs/31-accelerometre-mma7361-a-3-axes.html

salut,
j'ai trouver le programme qui marche !!

http://www.babelduck.com/mma7361-accelerometer-sensor-module/

voila le site si tu ve voir, j'ai l'impression que c'est a pe pres la meme chose au niveau de la connexion mais le programme est different, je vais essayer de decortiquer sa

Merci pour le lien, je cherchais un Gyroscope + accéléromètres depuis un moment et j'ai trouvé mon bonheur.

Dans le programme que je vois en suivant le lien il se contente de lancer 3 analogRead, il ne fait pas la conversion en G.
Il y a 3 ou 4 étapes a suivre si tu n'utilise pas la librairie:
1- lire les valeurs d'input des signaux analogiques, l'arduino obtient une valeur entre 0 et 1023, (valeur 10bits).
2- convertir cette valeur en volt et y soustraire le voltage a 0G (donné dans la datasheet, 1,65v pour le mien).
3-convertir le voltage en G grâce a la résolution choisie, a savoir 800mV/G pour la résolution à 1,5G.
jusque la toutes ces étapes sont dans le code que j'ai posté au début.

4-réduir la valeur en G a 2 chiffres significatif, si le reste n'est pas utile.

bon , j'ai ecrit ce ptit truc :

char str[512];                  // We will use this to construct a string to send with the readings
int LedD=7;
int LedG=6;
int LedA=5;
int LedB=4;
int LedM=3;

void setup()
{
 
  Serial.begin(9600);           // Start the serial link so we can see the output in the Arduino IDE
  pinMode (LedD, OUTPUT);
  pinMode (LedG, OUTPUT);
  pinMode (LedA, OUTPUT);
  pinMode (LedB, OUTPUT);
  pinMode (LedM, OUTPUT);
}
void loop()
{
  int x, y, z;                  // Variables to store the 3 readings
 
  x = analogRead(A0);           // Read the X axis reading
  y = analogRead(A1);           // Read the Y axis reading
  z = analogRead(A2);           // Read the Z axis reading
 
  sprintf(str, "%d \t %d \t %d", x, y, z);   // Construct a string out of all three readings
  Serial.println(str);                       // Print it to the serial link

  if(x>=600){LedD=1;}
  if(x<=500){LedG=1;}
  if(y>=600){LedA=1;}
  if(y<=500){LedB=1;}
  if(500<x>600){LedM=1;}
  if(500<y>600){LedM=1;}
  
  delay(100);
}

voila les resultats:

acceleromettre qui affiche bien les valeur dans moniteur serie.
Les Leds s'allume toute... alors que je voulais que quand je penche vers l'avant cest celle du haut qui s'allume est pas les autres... aurai-je mal ecrit quelque chose?

J'ai fait un mix entre ton code et celui que j'utilise pour mon capteur, fait un essai et dit nous si ça fonctionne.

int x,y,z;
float vx, vy, vz, gx, gy, gz;
int Gx, Gy,Gz;

int LedD=7;
int LedG=6;
int LedA=5;
int LedB=4;
int LedM=3;

boolean Centre x= true;
boolean Centre y= true;

void setup()
{
  Serial.begin(9600);
  analogReference(EXTERNAL); 
  
  pinMode (LedD, OUTPUT);
  digitalWrite(LedD, LOW);
  
  pinMode (LedG, OUTPUT);
  digitalWrite(LedG, LOW);
  
  pinMode (LedA, OUTPUT);
  digitalWrite(LedA, LOW);
  
  pinMode (LedB, OUTPUT);
  digitalWrite(LedB, LOW);
  
  pinMode (LedM, OUTPUT);
  digitalWrite(LedM, LOW);

}


void loop()
{
  // Read in accelerometer values
  x = analogRead(A0);
  y = analogRead(A1);
  z = analogRead(A2);
  
  vx = (x*3.3/1023)-1.65;
  gx = vx*10/8;
  Gx=gx*100;
  gx=Gx/100;
  vy = (y*3.3/1023)-1.65;
  gy = vy*10/8;
  Gy=gy*100;
  gy=Gy/100;
  vz = (z*3.3/1023)-1.65;
  gz = vz*10/8;
  Gz=gz*100;
  gz=Gz/100;
 
  Serial.print("vx=");
  Serial.print(gx,DEC);   
  Serial.print("  ");
  Serial.print("vy=");
  Serial.print(gy,DEC);   
  Serial.print("  ");
  Serial.print("vz=");
  Serial.println(vz,DEC);  
 //axe X
if(Gx>10)
   {digitalWrite(LedD, LOW);
     digitalWrite(LedG, HIGH);
    Centre x=false; 
    }
 
else if(Gx<-10)
   {digitalWrite(LedG, LOW);
    digitalWrite(LedD, HIGH);
    Centre x=false; 
    }
else{
     Centre x=true;
     digitalWrite(LedG, LOW);
     digitalWrite(LedD, LOW);
     }  

//AXE Y
if(Gy>10)
   {digitalWrite(LedB, LOW);
     digitalWrite(LedA, HIGH);
     Centre y=false; 
     }
 
 else if(Gy<-10)
   {digitalWrite(LedA, LOW);
     digitalWrite(LedB, HIGH);
    Centre y=false; 
    }
else{Centre y=true;
    digitalWrite(LedA, LOW);
    digitalWrite(LedB, LOW);
    }
 //CENTRE
if (Centre x ==true && Centre y==true) 
    {digitalWrite(LedM, HIGH);}

  delay(200);
  
}

EUREKA!!!!!!!!

j'ai modifier et voici le programme final:

int x,y,z;
float vx, vy, vz, gx, gy, gz;
int Gx, Gy,Gz;

int LedD=7;
int LedG=6;
int LedA=5;
int LedB=4;
int LedM=3;

boolean CentreX= false;
boolean CentreY= false;

void setup()
{
  Serial.begin(9600);
  analogReference(EXTERNAL); 
  
  pinMode (LedG, OUTPUT);
  digitalWrite(LedD, HIGH);
  
  pinMode (LedD, OUTPUT);
  digitalWrite(LedG, HIGH);
  
  pinMode (LedA, OUTPUT);
  digitalWrite(LedA, HIGH);
  
  pinMode (LedB, OUTPUT);
  digitalWrite(LedB, HIGH);
  
  pinMode (LedM, OUTPUT);
  digitalWrite(LedM, HIGH);

}


void loop()
{
  // Read in accelerometer values
  x = analogRead(A0);
  y = analogRead(A1);
  z = analogRead(A2);
  
  vx = (x*3.3/1023)-1.65;
  gx = vx*10/8;
  Gx=gx*100;
  gx=Gx/100;
  vy = (y*3.3/1023)-1.65;
  gy = vy*10/8;
  Gy=gy*100;
  gy=Gy/100;
  vz = (z*3.3/1023)-1.65;
  gz = vz*10/8;
  Gz=gz*100;
  gz=Gz/100;
 
  Serial.print("vx=");
  Serial.print(Gx,DEC);   
  Serial.print("  ");
  Serial.print("vy=");
  Serial.print(Gy,DEC);   
  Serial.print("  ");
  Serial.print("vz=");
  Serial.println(Gz,DEC);  
 //axe X
if(Gx>10)
   {digitalWrite(LedG, HIGH);
     digitalWrite(LedD, LOW);
    CentreX=false; 
    }
 
else if(Gx<-20)
   {digitalWrite(LedD, HIGH);
    digitalWrite(LedG, LOW);
    CentreX=false; 
    }
else{
     CentreX=true;
     digitalWrite(LedD, HIGH);
     digitalWrite(LedG, HIGH);
     }  

//AXE Y
if(Gy>10)
   {digitalWrite(LedB, HIGH);
     digitalWrite(LedA, LOW);
     CentreY=false; 
   }
 
 else if(Gy<-10)
   {digitalWrite(LedA, HIGH);
     digitalWrite(LedB, LOW);
    CentreY=false; 
   }
else{CentreY=true;
    digitalWrite(LedA, HIGH);
    digitalWrite(LedB, HIGH);
    }
 //CENTRE
if ((CentreX==true) && (CentreY==true)) 
    {digitalWrite(LedM, LOW);}

else{digitalWrite(LedM, HIGH);}

  delay(200);
  
}

Bonjour à tous,

j'ai acquis un accéléromètre MMA7361 afin de faire des tests d'accélérations.

Après utilisation d'un programme conseillé sur le site :
https://letmeknow.fr/blog/2013/10/01/tuto-utiliser-un-accelerometre-mma7361/
il s'avère qu'il m'est impossible d'obtenir des accélérations fiables, et il semblerait que j'ai au final une sorte de gyroscope m'indiquant la position angulaire selon chaque axe de mon accéléromètre.

Est ce que quelqu'un aurait un branchement type de l'accéléromètre à me transmettre avec une library associée pour avoir une accélération selon les 3 axes.

J'aimerai pouvoir obtenir l'accélération selon chaque axe, pour l'utiliser dans le calcul d'accélération d'une fusée. Mais je dois dire que mes connaissances sont très limitées avec les accéléromètres.

Merci de votre compréhension et de votre aide par avance.
Corentin

Bonjour,

L'accéléromètre mesure les accélérations, y compris la pesanteur. Par conséquent, si l'accéléro ne bouge pas en translation et si tu le fais tourner autour de lui-même, tu auras une information de position angulaire (projection de l'accélération de la pesanteur suivant les 3 axes de l'accéléro).

Bref, ce qu'il faut retenir, c'est que l'accéléro mesure non seulement les accélérations de mouvement, mais aussi la pesanteur. C'est sans doute ça qui te perturbe.