Voir la source de Accéléromètre-Gyroscope-Boussole 9 axes MPU-9150
De Wiki Arobose
Aller à :
Navigation
,
rechercher
Le [http://www.invensense.com/mems/gyro/mpu9150.html MPU-9150], proposé par InvenSense, est un module permettant de détecter l'orientation sur 9 degré de liberté. Il est composé du [http://www.invensense.com/mems/gyro/mpu6050.html MPU-6050] qui contient un gyroscope 3 axes et un accéléromètre 3 axes et du [http://www.akm.com/akm/en/file/datasheet/AK8975.pdf AK8975] qui est une boussole numérique 3 axes. == MPU-9150 == L'accéléromètre 3 axes mesure l'accélération linéaire suivant x, y et z. La mesure est en g. Le gyromètre 3 axes mesure la vitesse angulaire autour des 3 axes x, y et z. La mesure est en °/s. La boussole 3 axes mesure le champs magnétique sur x, y et z. La mesure est en µT. La communication avec le MPU-9150 se fait par liaison i2c. L'adresse du module par défaut est 0x68. Il est cependant possible de modifier l'adresse (0x69) grace au cavalier à souder sur AD0. Les nombreux registres accessibles permettent de configurer le MPU-9150 au besoin du système (précision du gyroscope et de l'accéléromètre...). Voir le document sur la [http://www.invensense.com/mems/gyro/documents/RM-MPU-9150A-00v4_2.pdf description des registres]. == Tests == Nous utilisons une carte ARDUINO UNO et le MPU-9150 monté sur la carte d'évaluation de [https://www.sparkfun.com/products/11486 Sparkfun]. Cette carte permet une utilisation facile du composant MPU-9150 en intégrant les condensateurs nécessaire à son utilisation et les résistances de pull up pour la liaison i2c. Le câblage est très simple : MPU91-50 / ARDUINO GND → GND VCC → +3.3V SDA → A4 SCL → A5 Nous allons décrire quelques fonctions permettant de récupérer les données en x, y et z de l'accéléromètre, du gyroscope et la température. === Exemple langage ARDUINO === Un exemple est expliqué [http://playground.arduino.cc/Main/MPU-6050#sketch ici] === Exemple langage C === ==== Liaison i2c ==== La liaison twi (i2c) et les fonctions sont expliquées [http://geonobotwiki.free.fr/doku.php?id=robotics:computing:communication_twi_entre_atmega ici] Le MPU-9150 est configuré en esclave à l'adresse 0x68. La UNO est configurée en maitre. ==== Fonctions du MPU-9150 ==== ===== Initialisation ===== Le capteur est par défaut en mode sleep. Pour le réveiller, il faut mettre à 0 le bit SLEEP du registre 107 – Power Management 1 (PWR_MGMT_1). Ce registre permet également d'activer le capteur de température (mettre le bit TEMP_DIS à 0). Le tableau reg[2] contient l'adresse du registre PWR_MGMT_1 et la valeur à écrire dans le registre (ici 0 car nous voulons désactiver le mode sleep et activer le capteur de température). Il faut configurer la liaison i2c en mode master. La fonction twi_write_bytes permet d'envoyer des octets à un esclave. Ici on envoie 2 octets du tableau reg à l'adresse MPU9150_DEFAULT_ADDRESS. Le décalage de l'adresse vient de fait que dans le MPU-9150 stocke son adresse sur les 7 bits de poids fort. <syntaxhighlight lang="c"> #define MPU9150_DEFAULT_ADDRESS 0x68 #define MPU9150_ACCEL_XOUT_H 0x3B #define MPU9150_TEMP_OUT_H 0x41 #define MPU9150_GYRO_XOUT_H 0x43 #define MPU9150_PWR_MGMT_1 0x6B void mpu9150_setup(void) { /* clear the SLEEP bit to start the sensor */ uint8_t reg[2] = {MPU9150_PWR_MGMT_1, 0}; twi_master_setup(); /* i2c to master mode */ twi_write_bytes((MPU9150_DEFAULT_ADDRESS << 1), 2, reg); } </syntaxhighlight> ===== Lecture de la température ===== La température est lue sur 2 octets à l'adresse MPU9150_TEMP_OUT_H (registres 65 (high) et 66 (low)). La valeur lue est une image de la température : Température en degré Celsius = valeur des registres / 340 + 35. <syntaxhighlight lang="c"> /* * @return temperature in degrees C = (TEMP_OUT signed / 340) + 35 * */ int16_t mpu9150_read_temperature(void) { volatile uint8_t buffer[2] = { 0, 0 }; uint8_t reg = MPU9150_TEMP_OUT_H; twi_read_bytes(MPU9150_DEFAULT_ADDRESS << 1, ®, 2, buffer); int16_t temperature; temperature = ((buffer[0] << 8) + buffer[1]); temperature /= 340; temperature += 35; return temperature; } </syntaxhighlight> ===== Lecture du gyroscope ===== On a définit une structure contenant les variables x, y et z pour stocker les valeurs sur les 3 axes. <syntaxhighlight lang="c"> typedef struct { int16_t x; int16_t y; int16_t z; } x_y_z; x_y_z mpu9150_read_gyroscope(void) { volatile uint8_t buffer[6]; uint8_t reg = MPU9150_GYRO_XOUT_H; twi_read_bytes(MPU9150_DEFAULT_ADDRESS << 1, ®, 6, buffer); x_y_z gyro; gyro.x = (buffer[0] << 8) + buffer[1]; gyro.y = (buffer[2] << 8) + buffer[3]; gyro.z = (buffer[4] << 8) + buffer[5]; return gyro; } </syntaxhighlight> ===== Lecture de l'accéléromètre ===== C'est le même modèle que la lecture du gyroscope. <syntaxhighlight lang="c"> x_y_z mpu9150_read_accelerometer(void) { volatile uint8_t buffer[6]; uint8_t reg = MPU9150_ACCEL_XOUT_H; twi_read_bytes(MPU9150_DEFAULT_ADDRESS << 1, ®, 6, buffer); x_y_z accel; accel.x = (buffer[0] << 8) + buffer[1]; accel.y = (buffer[2] << 8) + buffer[3]; accel.z = (buffer[4] << 8) + buffer[5]; return accel; } </syntaxhighlight> ===== Fonction de tests ===== La fonction principale demande les valeurs du capteur de température, du gyroscope et de l'accéléromètre et retourne les valeurs sur le port série. <syntaxhighlight lang="c"> void setup(void) { usart_0_setup(); usart_0_transmitter_enable(); mpu9150_setup(); } int main(void) { setup(); _delay_ms(1000); while (1) { _delay_ms(1000); int16_t t = mpu9150_read_temperature(); usart_0_transmit(t >> 8); usart_0_transmit(t); _delay_ms(1000); x_y_z gyro = mpu9150_read_gyroscope(); usart_0_transmit(gyro.x >> 8); usart_0_transmit(gyro.x); usart_0_transmit(gyro.y >> 8); usart_0_transmit(gyro.y); usart_0_transmit(gyro.z >> 8); usart_0_transmit(gyro.z); _delay_ms(1000); x_y_z acc = mpu9150_read_accelerometer(); usart_0_transmit(acc.x >> 8); usart_0_transmit(acc.x); usart_0_transmit(acc.y >> 8); usart_0_transmit(acc.y); usart_0_transmit(acc.z >> 8); usart_0_transmit(gyro.z); } } </syntaxhighlight> [[Category:Produits]]
Revenir à la page
Accéléromètre-Gyroscope-Boussole 9 axes MPU-9150
.
Affichages
Page
Discussion
Voir le texte source
Historique
Outils personnels
Connexion
Navigation
Accueil
Communauté
Actualités
Modifications récentes
Page au hasard
Aide
Rechercher
Boîte à outils
Pages liées
Suivi des pages liées
Pages spéciales
Catégories
[
×
]
Produits
[
×
]
Tutoriels