시몽

Just a tech.

Lire les données d'un gyro/accéléromètre MPU6050 avec Node.js

J’ai eu le temps à la fin des vacances de faire quelques tests avec un gyro/accéléromètre MPU6050 retrouvé au fond des tiroirs. En fouillant un peu sur les Internets, j’ai pu lire les données disponibles et faire une petite visualisation 3D en bonus.

Le capteur

Le capteur

Le capteur possède 8 connecteurs (appelés pins), mais nous ne nous servirons que de 4 d’entre eux. Il est alimenté par 3.3 V via les pins VCC et GND. Ce composant communique les données via les pins SDA et SCL en utilisant un protocole appelé I2C.

Schéma simplifié du bus I2C

L’intérêt est que I2C permet de brancher plusieurs composants à ces deux pins. Par exemple, sur le schéma ci-dessus, trois composants (slaves) sont reliés au Raspberry Pi (master). Les deux fils SDA et SCL sont donc appelés le bus I2C. Chaque périphérique branché sur le bus I2C a sa propre adresse qui permet de l’identifier (comme des numéros de maisons dans une rue).

Liaison avec le Raspberry Pi

Il nous faudra configurer le Raspberry Pi pour pouvoir utiliser le bus I2C. Je laisse à ceux qui voudraient le faire la lecture du tutoriel d’Adafruit.

Reste ensuite à connecter le MPU6050 au Raspberry Pi. En essayant de ne pas se gourrer de pin comme moi, il faut donc relier :

  • Le pin 1 du Raspbeery Pi (3.3 V) au pin VCC du MPU6050
  • Le pin 3 à SDA
  • Le pin 5 à SCL
  • Le pin 6 à GND

Schéma des liaisons

Pour pouvoir tester les branchements, on lance la commande i2cdetect sur le Raspberry Pi :

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

On peut voir apparaître le capteur avec l’adresse hexadécimale 0x68.

Lecture des données via le bus I2C

Le bus I2C permet d’envoyer et recevoir des données du capteur. On parle d’écriture et de lecture. Pour chaque opération (écriture ou lecture), il faut préciser l’adresse du capteur et un registre. Ce registre est un numéro (on le notera en hexadécimal) qui permettra de signifier ce que l’on veut lire ou écrire, par exemple lire la coordonnée X de l’accélération (c’est une lecture) ou mettre le capteur en veille (c’est une écriture).

J’ai réalisé la lecture des données en codant un petit programme en Node.js. On pourra se référer à la datasheet du MPU6050 pour se documenter sur les registres offerts par le capteur.

Je me suis basé sur l’excellent module i2c-bus :

var i2c = require('i2c-bus');

var address = 0x68; // Adresse du capteur
var bus = i2c.openSync(1); // Création d'une connexion au bus I2C

Il faut tout d’abord réveiller le capteur en écrivant un bit nul au registre 0x6b (le capteur est en veille par défaut lors de la mise sous tension) :

bus.writeByteSync(address, 0x6b, 0); // On réveille le capteur

Ensuite, il suffit de lire une série de registres pour récupérer les différentes composantes : les données du gyromètre et de l’accéléromètre selon les axes X, Y et Z. Les données récupérées sont des entiers relatifs codés sur deux octets représentés avec le complément à deux.

var register = 0x3b; // Registre correspondant à la composante X de l'accéléromètre
var high = bus.readByteSync(address, register); // Lecture du premier octet
var low = bus.readByteSync(address, register + 1); // Lecture du deuxième octet

// Conversion de la valeur représentée avec le complément à deux
var val = (high << 8) + low;
if (val >= 0x8000) {
	val = -((65535 - val) + 1);
}

console.log('Accelerometer X:', val);

J’ai donc créé un petit module Node.js pour lire les données du capteur, dont le code source est disponible ici : https://github.com/emersion/node-i2c-mpu6050

Résultat

Après quelques heures de codage et déboguage, voici le résultat :

Avec l’aide de mon module Node.js et de la librarie three.js, on peut créer un petit serveur HTTP qui permet de visualiser l’orientation du capteur en temps réel. Vous pouvez voir le code source ici : https://github.com/emersion/node-mpu6050-server