Mesures de vibrations

Salut à tous,
Je suis en prépa et dans le cadre de mon projet TIPE je souhaiterais enregistrer et analyser les vibrations émises par une machine tournante quelconque, comme une boite de vitesse par exemple.
J'ai une carte Arduino Uno, un accéléromètre MMA8451, une breadboard et des fils.
Cela fait maintenant plusieurs jours que j'arpente des tutoriels divers pour acquérir les bases du language et des méthodes Arduino. J'ai réussi à programmer quelques trucs simples pour commencer (diode clignotante, rotation périodiques d'un moteur...), mais je m'arrache les cheveux sur mon accéléromètre qui ne veut pas fonctionner.
J'ai suivi les explications de ce tutoriel Arduino Code | Adafruit MMA8451 Accelerometer Breakout | Adafruit Learning System, téléchargé les bonnes librairies, mais quand je lance le programme test proposé on me renvoie un message d'erreur comme quoi l'accéléromètre n'a pas été trouvé.
Je m'en remet à vous, si vous avez des idées d'un truc idiot que j'ai pu oublier de faire, ou des erreurs classiques... Je détaillerai par captures plus précises si vos premières suggestions ne donnent rien !
Merci et bonne soirée,
Constant Auclair.

mais quand je lance le programme test proposé on me renvoie un message d'erreur comme quoi l'accéléromètre n'a pas été trouvé.

Le composant utilise l'I2C pour dialoguer avec le micro.
Une erreur possible pourrait être que l'adresse de l'accéléromètre dans le programme ne correspond pas à celle réelle du composant que tu teste.

Pour lever le doute, recherche un programme pour scanner le bus I2C, il en existe de nombreux.
Le scanner indiquera les adresses sur lesquelles il détecte la présence d'un composant I2C

Salut et désolé pour l'absence !
Merci pour ta réponse ! Alors j'ai fait ce que tu as dit et j'ai trouvé l'adresse I2C de l'accéléromètre, mais je ne sais pas quoi en faire ^^
Je l'ai ajouté dans la mma.begin() mais cela n'a rien donné...

Poste ton code, on pourra t'indiquer où mettre cette adresse

Bonsoir

L’adresse par défaut (si la pin A n’est pas à la masse ) est 0x1d (codée 'en dur dans le fichier ADADRUIT_MMA8451.h). Si A n’est pas mis à la masse il n’y a donc rien à faire concernant cette adresse.

Une bonne photo du montage permettrait de s’assurer que le câblage est OK
Alimentation en VIN ? (3V est une sortie !!)

Merci pour vos réponses, voilà pour le code :

/**************************************************************************/
/*!
    @file     Adafruit_MMA8451.h
    @author   K. Townsend (Adafruit Industries)
    @license  BSD (see license.txt)

    This is an example for the Adafruit MMA8451 Accel breakout board
    ----> https://www.adafruit.com/products/2019

    Adafruit invests time and resources providing this open source code,
    please support Adafruit and open-source hardware by purchasing
    products from Adafruit!

    @section  HISTORY

    v1.0  - First release
*/
/**************************************************************************/

#include <Wire.h>
#include <Adafruit_MMA8451.h>
#include <Adafruit_Sensor.h>

Adafruit_MMA8451 mma = Adafruit_MMA8451();

void setup(void) {
  Serial.begin(9600);
  
  Serial.println("Adafruit MMA8451 test!");
  

  if (! mma.begin(0x1C)) {
    Serial.println("Couldnt start");
    while (1);
  }
  Serial.println("MMA8451 found!");
  
  mma.setRange(MMA8451_RANGE_2_G);
  
  Serial.print("Range = "); Serial.print(2 << mma.getRange());  
  Serial.println("G");
  
}

void loop() {
  // Read the 'raw' data in 14-bit counts
  mma.read();
  Serial.print("X:\t"); Serial.print(mma.x); 
  Serial.print("\tY:\t"); Serial.print(mma.y); 
  Serial.print("\tZ:\t"); Serial.print(mma.z); 
  Serial.println();

  /* Get a new sensor event */ 
  sensors_event_t event; 
  mma.getEvent(&event);

  /* Display the results (acceleration is measured in m/s^2) */
  Serial.print("X: \t"); Serial.print(event.acceleration.x); Serial.print("\t");
  Serial.print("Y: \t"); Serial.print(event.acceleration.y); Serial.print("\t");
  Serial.print("Z: \t"); Serial.print(event.acceleration.z); Serial.print("\t");
  Serial.println("m/s^2 ");
  
  /* Get the orientation of the sensor */
  uint8_t o = mma.getOrientation();
  
  switch (o) {
    case MMA8451_PL_PUF: 
      Serial.println("Portrait Up Front");
      break;
    case MMA8451_PL_PUB: 
      Serial.println("Portrait Up Back");
      break;    
    case MMA8451_PL_PDF: 
      Serial.println("Portrait Down Front");
      break;
    case MMA8451_PL_PDB: 
      Serial.println("Portrait Down Back");
      break;
    case MMA8451_PL_LRF: 
      Serial.println("Landscape Right Front");
      break;
    case MMA8451_PL_LRB: 
      Serial.println("Landscape Right Back");
      break;
    case MMA8451_PL_LLF: 
      Serial.println("Landscape Left Front");
      break;
    case MMA8451_PL_LLB: 
      Serial.println("Landscape Left Back");
      break;
    }
  Serial.println();
  delay(500);
  
}

Et pour le montage :

Voilà !

La photo est jolie, mais l’orientation du capteur ne permet pas de voir les branchements.
A priori, c’est comme ça :

Ça donne

Capteur <—> Arduino
Vcc 3.3V
GND GND
SCL A5
SDA A4

A priori, c’est bon pour les connexions

Concernant l’adresse I2C, voici le contenu du fichier .h :

/*=========================================================================
    I2C ADDRESS/BITS
    -----------------------------------------------------------------------*/
    #define MMA8451_DEFAULT_ADDRESS                 (0x1D)    // if A is GND, its 0x1C
/*=========================================================================*/

Que te dit le scanner ? Peux-tu poster sa réponse ?

Voici le code de la fonction begin :

bool Adafruit_MMA8451::begin(uint8_t i2caddr) {
  Wire.begin();
  _i2caddr = i2caddr;

  /* Check connection */
  uint8_t deviceid = readRegister8(MMA8451_REG_WHOAMI);
  if (deviceid != 0x1A)
  {
    /* No MMA8451 detected ... return false */
    //Serial.println(deviceid, HEX);
    return false;
  }

On peut lui passer une adresse en argument (ça se voit dan ton code : tu lui passes l’adresse 0x1C)

Désolé pour la photo mais oui les branchements sont bien comme tu l'as supposé. La réponse du scanner I2C est

Debut du scan
	.... .... .... .... .... .... .... .... 
	.... .... .... .... .... .... .... .... 
	.... .... .... .... .... .... .... .... 
	.... .... .... .... 0x1C .... .... .... 
	.... .... .... .... .... .... .... .... 
	.... .... .... .... .... .... .... .... 
	.... .... .... .... .... .... .... .... 
	.... .... .... .... .... .... .... .... 
	.... .... .... .... .... .... .... .... 
	.... .... .... .... .... .... .... .... 
	.... .... .... .... .... .... .... .... 
	.... .... .... .... .... .... .... .... 
	.... .... .... .... .... .... .... .... 
	.... .... .... .... .... .... .... .... 
	.... .... .... .... .... .... .... .... 
	.... .... .... .... .... .... .... ....

Adresse 0x1C c’est cohérent avec le schéma du module GY-45 qui place une résistance de pull down sur SA0, contrairement au module Adafruit
GY-45.jpg
Le module ayant son régulateur 3,3V il serait intéressant de tester l’envoi de 5V sur VCC-IN au lieu de 3,3V
le circuit d’adaptaion d eniveaux logiques I2C est là pour gérer l’adaptation 5V : 3,3V pour les signaux.

je testerai également un mma.begin() + un 0x1C en lieu et place du 0x1D dans le fichier .h, peu d’effet en principe…;

Après être passé a 5V sur VCC_IN, j'ai le message d'erreur suivant :

Arduino : 1.8.5 (Windows 8.1), Carte : "Arduino/Genuino Uno"

Le croquis utilise 7486 octets (23%) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 724 octets (35%) de mémoire dynamique, ce qui laisse 1324 octets pour les variables locales. Le maximum est de 2048 octets.
avrdude: ser_open(): can't open device "\\.\COM3": Le fichier spécifié est introuvable.


Problème de téléversement vers la carte. Voir http://www.arduino.cc/en/Guide/Troubleshooting#upload pour suggestions.
La carte sur COM3 n'est pas disponible

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

ça en envoyant 5V sur l'entrée VCC_IN du GY-45 ? ? ?

Ça semble être un problème de port COM, l’IDE cherche l’arduino sur le port COM3 mais ne le trouve pas.

al1fch oui ça me renvoie ça je vois pas d'où vient le problème !
edit: j'ai réessayé et ça n'affiche plus que "Ada" les trois premières lettres du messages automatique du programme...
lesept, tu aurais une idée de comment régler ça ?

Faire ce que dit al1fch : 3V3 et mma.begin(0x1C);

Je l'ai fait 10 fois y'a rien à faire... J'essaierai sur un autre ordi demain voir si c'est pas juste l'ordi qui déconne !

Rien à faire, même résultat sur le mac... Une idée d'un détail idiot que j'aurais pu oublier ?

Si ça ne vient pas du PC et que ton code est l'exemple d'Adafruit (non modifié, sinon reprend l'exemple File->Examples->Adafruit_MMA8451->MMA8451demo), il reste deux choses à faire :

  • Vérifier les branchements : le module doit être alimenté en 5V (puisque le Uno délivre des signaux en 5V, c'est écrit sur le site Adafruit), connecter la broche A à GND (pour l'adresse 1C), vérifier les connexions SDA, SCL aux pins Arduino
  • Effacer et réinstaller les bibliothèques Adafuit utilisées

Ça doit ressembler à ça (au besoin suis les instruction ici à lalettre):

Si ça ne fonctionne pas, il faut brûler un cierge aux dieux de l'I2C...

Hé bien je crois que je vais aller brûler un cierge x)

Tu as suivi es instructins ? Broche A connecté sur GND ?

Oui j'ai tout fait, sur mon modèle j'ai une SA0 mais pas de borne A donc j'ai essayé avec mais ça n'a rien changé...