[Tuto] Accéléromètre ADXL 345

Ici sera présenté l’utilisation de l’accéléromètre ADXL 345
Pour cela, il vous faudra:

  • Un Arduino
  • Un Accéléromètre ADXL345
  • Jumper male-femelle

Cette accéléromètre présent en boutique est le suivant:

accelerometre-adxl345

Étape câblage:

La communication entre l’accéléromètre et l’arduino se fait via le bus I2C situé sur les broches A4 et A5 de l’arduino avec une vitesse par défaut de 100kHz.

  • GND (ADXL 345) ⇒ Arduino GND
  • 3V3 (ADXL 345) ⇒ Arduino 3V3
  • SDA (ADXL 345) ⇒ Arduino A4
  • SCL (ADXL 345) ⇒ Arduino A5

Étape logiciel:

Le programme qui suit n’a besoin d’aucune librairie, nous allons lire dans les registres les valeurs d’accélération selon X, Y et Z pour ensuite les afficher sur le terminal.

 

#include <Wire.h>

// Broche d'Arduino pour communication I2C avec accéléromètre LG-ADXL345.
const int ACCELEROMETRE_1_SCL = A5;
const int ACCELEROMETRE_1_SDA = A4;

//*****************************************************************************
// Déclaration des variables globales.
//*****************************************************************************

// Adresses de communication I2C avec accéléromètre ADXL345.
const char Accellerometre3AxesAdresse = 0x53;
byte Accellerometre3AxesMemoire [6];
const char POWER_CTL = 0x2D;// Registre "Power Control".
const char DATA_FORMAT = 0x31;// Registre "Data Format".
const char DATAX0 = 0x32;//X-Axis Data 0
const char DATAX1 = 0x33;//X-Axis Data 1
const char DATAY0 = 0x34;//Y-Axis Data 0
const char DATAY1 = 0x35;//Y-Axis Data 1
const char DATAZ0 = 0x36;//Z-Axis Data 0
const char DATAZ1 = 0x37;//Z-Axis Data 1

const char Accellerometre_1_Precision2G  = 0x00;
const char Accellerometre_1_Precision4G  = 0x01;
const char Accellerometre_1_Precision8G  = 0x02;
const char Accellerometre_1_Precision16G = 0x03;
const char Accellerometre_1_ModeMesure   = 0x08;

// Pour recevoir les valeurs des 3 axes de l'accéléromètre.
int Accelerometre1_AxeX = 0;
int Accelerometre1_AxeY = 0;
int Accelerometre1_AxeZ = 0;

//*****************************************************************************


//*****************************************************************************
// FONCTION SETUP = Code d'initialisation.
//*****************************************************************************

void setup ()
{
  // Ici les instructions à exécuter au démarrage.

  // IMPORTANT : régler le terminal côté PC avec la même valeur de
  // transmission. Ici c'est 115200.
  Serial.begin (115200);

  // Initialisation de la communication I2C bus pour le capteur d’accélération.
  Wire.begin ();
  // Mettre le ADXL345 à plage +/-4G en écrivant la valeur 0x01 dans le
  // registre DATA_FORMAT.
  AccellerometreConfigure (DATA_FORMAT, Accellerometre_1_Precision4G);
  // Mettre le ADXL345 en mode de mesure en écrivant 0x08 dans le registre
  // POWER_CTL.
  AccellerometreConfigure (POWER_CTL, Accellerometre_1_ModeMesure);
}

void loop()
{
  
    // Pour affichage dans le moniteur série de l'éditeur Arduino.
    AccellerometreLecture ();
    Serial.print (" AxeX:");
    Serial.print (Accelerometre1_AxeX);
    Serial.println ();
    Serial.print (" AxeY:");
    Serial.print (Accelerometre1_AxeY);
    Serial.println ();
    Serial.print (" AxeZ:");
    Serial.print (Accelerometre1_AxeZ);
    Serial.println ();
  
}

//*****************************************************************************
// FONCTION AccellerometreConfigure
//*****************************************************************************
void AccellerometreConfigure (byte address, byte val)
{
  // Commencer la transmission à trois axes accéléromètre
  Wire.beginTransmission (Accellerometre3AxesAdresse);
  // Envoyer l'adresse de registre
  Wire.write (address);
  // Envoyer la valeur à écrire.
  Wire.write (val);
  // Fin de la transmission.
  Wire.endTransmission ();
}

//*****************************************************************************
// FONCTION AccellerometreLecture ()
//*****************************************************************************
void AccellerometreLecture ()
{
  uint8_t NombreOctets_a_Lire = 6;
  // Lire les données d'accélération à partir du module ADXL345.
  AccellerometreLectureMemoire (DATAX0, NombreOctets_a_Lire,
                                Accellerometre3AxesMemoire);

  // Chaque lecture de l'axe vient dans une résolution de 10 bits, soit 2 octets.
  // Première Octet significatif !
  // Donc nous convertissons les deux octets pour un « int ».
  Accelerometre1_AxeX = (((int)Accellerometre3AxesMemoire[1]) << 8) |
      Accellerometre3AxesMemoire[0];
  Accelerometre1_AxeY = (((int)Accellerometre3AxesMemoire[3]) << 8) |
      Accellerometre3AxesMemoire[2];
  Accelerometre1_AxeZ = (((int)Accellerometre3AxesMemoire[5]) << 8) |
      Accellerometre3AxesMemoire[4];
}

//*****************************************************************************
// FONCTION AccellerometreLectureMemoire
//*****************************************************************************
void AccellerometreLectureMemoire (byte address, int num, byte
                                   Accellerometre3AxesMemoire[])
{
  // Démarrer la transmission à accéléromètre.
  Wire.beginTransmission (Accellerometre3AxesAdresse);
  // Envoie l'adresse de lire.
  Wire.write (address);
  // Fin de la transmission.
  Wire.endTransmission ();
  // Démarrer la transmission à accéléromètre.
  Wire.beginTransmission (Accellerometre3AxesAdresse);
  // Demande 6 octets à l'accéléromètre.
  Wire.requestFrom (Accellerometre3AxesAdresse, num);

  int i = 0;
  // L'accéléromètre peut envoyer moins que demandé, c'est anormal, mais...
  while (Wire.available())
  {
    // Recevoir un octet.
    Accellerometre3AxesMemoire[i] = Wire.read ();
    i++;
  }
    // Fin de la transmission.
  Wire.endTransmission ();
}

Les résultats sur le terminal arduino ide:

adxl345_results

Ressources:
http://playground.arduino.cc/French/TutorielsCodeSourceAutonome-Capteur-Accelerometre-LG-ADXL345-I2C-LCD1602Shield

[Tuto] Contrôler votre curseur de souris avec un accéléromètre

Si vous avez suivi notre tutoriel pour utiliser l’accéléromètre MMA7361 disponible ici voici un exemple d’utilisation sympathique : contrôler le curseur de votre souris à l’aide de cette accéléromètre.

Cependant pour cela vous aurez besoin d’une carte arduino avec un microcontrôleur 32u4 embarqué dessus. Les cartes arduino compatibles sont

ArduinoLeonardo
arduino-lilypad-usb

Une fois votre accéléromètre câblé, tous se passe au niveau du code, vous allez voir c’est très simple !

CODE 

#include  "AcceleroMMA7361.h"// Inclure la librairie de 
l'accéléromètre



AcceleroMMA7361 accelero; // Création du composant
int x; // Création des variables pour les 3 accélérations 
int y;

void setup()
{
 Serial.begin(9600); // Démarrer la liaison série
 pinMode(2, INPUT);
 accelero.begin(13, 12, 11, 10, A0, A1, A2); // Démarrer le 
composant
 accelero.setARefVoltage(3.3); // Régler la tension de référence
 accelero.setSensitivity(LOW); // Régler la sensibilité du 
composant +/-6G
 accelero.calibrate(); // Calibrer le composant
 
 Mouse.begin(); //Initialisation de la fonction souris

}

void loop()
{
 x = accelero.getXAccel(); // Lecture de l'axe X
 y = accelero.getYAccel(); // Lecture de l'axe Y
 
 Mouse.move(x,y,0); //On bouge le curseur aux coordonnées 
acquisent par l'accéléromètre
 if (digitalRead(2) == HIGH) //On peut rajouter un bouton
  Mouse.click(MOUSE_LEFT); //Si l'appuie est repéré on envoie un 
clique gauche sur le curseur

 Serial.print("nx: "); // Afficher la valeur de l'axe X
 Serial.print(x);
 Serial.print(" ty: "); // Afficher la valeur de l'axe Y
 Serial.print(y);

 delay(50); // Délais pour rendre ça lisible
}

Vous pouvez reconnaître le code de l’accéléromètre, on y ajoute juste les fonctions capables de contrôler le curseur de la souris.
Donc très simplement dans le setup on initialise la fonction Mouse avec Mouse.begin() puis on utilise la fonction Mouse.move()

Pour aller plus loin, nous pouvons rajouter un bouton poussoir pour simuler le clique, un bouton pour les 3 différents cliques que l’on a sur une souris on utilise la fonction Mouse.click() dans les parenthèses on renseigne le boutons que l’on veut simuler sur le curseur :

  • MOUSE_LEFT pour le clique gauche
  • MOUSE_RIGHT pour le clique droit
  • MOUSE_MIDDLE pour le clique du milieu

Il ne vous reste plus qu’à téléverser votre programme dans votre carte, pencher l’accéléromètre et votre curseur bouge sur votre écran !

Pour plus d’information sur la librairie Mouse et keyboard voici la documentation arduino.

[Tuto] Utiliser un accéléromètre MMA7361

Utiliser un accéléromètre

Le but de ce montage est de lire la valeur mesurée par l’accéléromètre au travers de l’interface série.

Composants nécessaires :

 
Composants

Principe du montage :

Le câblage de l’accéléromètre demande peu de temps, on connecte les 8 sorties du module vers le Arduino selon le tableau ci-contre :

Module MMA7361

Arduino

Sleep (SL)

13

Self test (ST)

12

Zero G (0G)

11

G Select (GS)

10

X

A0

Y

A1

Z

A2

3V3

3,3V

GND

GND

5V

5V

Module MMA7361

Arduino

Sleep (SL)

13

Self test (ST)

12

Zero G (0G)

11

G Select (GS)

10

X

A0

Y

A1

Z

A2

3V3

3,3V

GND

GND

5V

5V

Module MMA7361

Arduino

Sleep (SL)

13

Self test (ST)

12

Zero G (0G)

11

G Select (GS)

10

X

A0

Y

A1

Z

A2

3V3

3,3V

GND

GND

5V

5V

Montage des composants sur la BreadboardRéalisation du montage :

Tout le montage se réalise sur la plaque prévu à cet effet (Breadboard). Ici nous n’avons que le module accéléromètre à monter. La difficulté est de passer les fils (certains seront sous l’accéléromètre). Je vous conseille de commencer par placer les 10 fils puis le module.

 
Breadboard
  • Câblage de la Breadboard

On câble ensuite les liens vers le Arduino.

montage
Montage 2

Programmation du montage :

Le programme utilise une librairie dédié pour paramétrer et utiliser le module. Pour rappel, une librairie doit d’abord être ajoutée avant d’être utilisée. Disponible ici AcceleroMMA7361

 

#include  // Inclure la librairie de l'accéléromètre

AcceleroMMA7361 accelero; // Création du composant
int x; // Création des variables pour les 3 accélérations 
int y;
int z;

void setup()
{
 Serial.begin(9600); // Démarrer la liaison série
 accelero.begin(13, 12, 11, 10, A0, A1, A2); // Démarrer le composant
 accelero.setARefVoltage(5); // Régler la tension de référence
 accelero.setSensitivity(LOW); // Régler la sensibilité du composant +/-6G
 accelero.calibrate(); // Calibrer le composant
}

void loop()
{
 x = accelero.getXAccel(); // Lecture de l'axe X
 y = accelero.getYAccel(); // Lecture de l'axe Y
 z = accelero.getZAccel(); // Lecture de l'axe Z
 Serial.print("nx: "); // Afficher la valeur de l'axe X
 Serial.print(x);
 Serial.print(" ty: "); // Afficher la valeur de l'axe Y
 Serial.print(y);
 Serial.print(" tz: "); // Afficher la valeur de l'axe Z
 Serial.print(z);
 Serial.print("tG*10^-2");
 delay(500); // Délais pour rendre ça lisible
}

Il reste à brancher le Arduino pour compiler le programme et le téléverser. Une fois terminé, vous n’avez plus qu’à démarrer le terminal (en le réglant à 9600bauds) et cela nous donne :

ON

Physiquement

Capture

Terminal

Pour aller plus loin :

Il est possible de rendre autonome le montage en lui ajoutant un coupleur de pile et ainsi de se lancer dans des applications embarquées