Table des matières:

MPU 6050 Gyro, Communication d'accéléromètre avec Arduino (Atmega328p): 5 étapes
MPU 6050 Gyro, Communication d'accéléromètre avec Arduino (Atmega328p): 5 étapes

Vidéo: MPU 6050 Gyro, Communication d'accéléromètre avec Arduino (Atmega328p): 5 étapes

Vidéo: MPU 6050 Gyro, Communication d'accéléromètre avec Arduino (Atmega328p): 5 étapes
Vidéo: How to use MPU-6050 Accelerometer and Gyroscope with Arduino code 2024, Juillet
Anonim
MPU 6050 Gyro, Communication d'accéléromètre avec Arduino (Atmega328p)
MPU 6050 Gyro, Communication d'accéléromètre avec Arduino (Atmega328p)
MPU 6050 Gyro, Communication d'accéléromètre avec Arduino (Atmega328p)
MPU 6050 Gyro, Communication d'accéléromètre avec Arduino (Atmega328p)
MPU 6050 Gyro, Communication d'accéléromètre avec Arduino (Atmega328p)
MPU 6050 Gyro, Communication d'accéléromètre avec Arduino (Atmega328p)

L'IMU MPU6050 possède à la fois un accéléromètre à 3 axes et un gyroscope à 3 axes intégrés sur une seule puce.

Le gyroscope mesure la vitesse de rotation ou le taux de changement de la position angulaire dans le temps, le long des axes X, Y et Z.

Les sorties du gyroscope sont en degrés par seconde, donc pour obtenir la position angulaire, il suffit d'intégrer la vitesse angulaire.

D'autre part, l'accéléromètre MPU6050 mesure l'accélération en mesurant l'accélération gravitationnelle le long des 3 axes et en utilisant des mathématiques trigonométriques, nous pouvons calculer l'angle auquel le capteur est positionné. Ainsi, si nous fusionnons ou combinons les données de l'accéléromètre et du gyroscope, nous pouvons obtenir des informations très précises sur l'orientation du capteur.

Gyroscope à 3 axesLe MPU-6050 se compose d'un gyroscope à 3 axes qui peut détecter la vitesse de rotation le long des axes x, y, z avec la technologie de système micro électromécanique (MEMS). Lorsque le capteur est tourné le long de n'importe quel axe, une vibration est produite en raison de l'effet Coriolis qui est détecté par le MEMS. ADC 16 bits est utilisé pour numériser la tension pour échantillonner chaque axe. +/- 250, +/- 500, +/- 1000, +/- 2000 sont la plage de sortie à pleine échelle. La vitesse angulaire est mesurée le long de chaque axe en degrés par seconde.

Lien utile:…………….

Carte Arduino:.……….

MPU6050 IMU ……………https://compoindia.com/product/mpu6050-3-axis-accelerometer-and-gyroscope-sensor/

Étape 1: Module MPU-6050

Module MPU-6050
Module MPU-6050

Le module MPU-6050 a 8 broches,

INT: Broche de sortie numérique d'interruption.

AD0: broche LSB de l'adresse esclave I2C. Il s'agit du 0e bit de l'adresse esclave 7 bits de l'appareil. S'il est connecté à VCC, il est lu comme un logique et l'adresse de l'esclave change.

XCL: broche d'horloge série auxiliaire. Cette broche est utilisée pour connecter d'autres broches SCL de capteurs compatibles avec l'interface I2C au MPU-6050.

XDA: broche de données série auxiliaire. Cette broche est utilisée pour connecter d'autres broches SDA de capteurs compatibles avec l'interface I2C au MPU-6050.

SCL: broche d'horloge série. Connectez cette broche à la broche SCL du microcontrôleur. SDA: broche de données série. Connectez cette broche à la broche SDA du microcontrôleur.

GND: broche de terre. Connectez cette broche à la connexion à la terre.

VCC: broche d'alimentation. Connectez cette broche à l'alimentation +5V DC. Le module MPU-6050 a une adresse esclave (lorsque AD0 = 0, c'est-à-dire qu'il n'est pas connecté à Vcc) comme, Adresse d'écriture esclave (SLA+W): 0xD0

Adresse de lecture esclave (SLA+R): 0xD1

Étape 2: calculs

Calculs
Calculs

Les données des capteurs du gyroscope et de l'accéléromètre du module MPU6050 se composent de données brutes 16 bits sous forme de complément à 2.

Les données du capteur de température du module MPU6050 se composent de données 16 bits (pas sous forme de complément à 2).

Supposons maintenant que nous ayons sélectionné,

  • - Gamme complète d'accéléromètre de +/- 2g avec un facteur d'échelle de sensibilité de 16, 384 LSB (Count)/g.
  • - Plage de pleine échelle du gyroscope de +/- 250 °/s avec un facteur d'échelle de sensibilité de 131 LSB (compte)/°/s. alors,

Pour obtenir les données brutes du capteur, nous devons d'abord effectuer un complément à 2 sur les données du capteur de l'accéléromètre et du gyroscope. Après avoir obtenu les données brutes du capteur, nous pouvons calculer l'accélération et la vitesse angulaire en divisant les données brutes du capteur avec leur facteur d'échelle de sensibilité comme suit:

Valeurs de l'accéléromètre en g (force g)

  • Accélération le long de l'axe X = (données brutes de l'axe X de l'accéléromètre/16384) g.
  • Accélération le long de l'axe Y = (données brutes de l'axe Y de l'accéléromètre/16384) g.
  • Accélération le long de l'axe Z = (données brutes de l'axe Z de l'accéléromètre/16384) g.

Valeurs du gyroscope en °/s (degrés par seconde)

  • Vitesse angulaire le long de l'axe X = (données brutes axe X du gyroscope/131) °/s.
  • Vitesse angulaire le long de l'axe Y = (données brutes de l'axe Y du gyroscope/131) °/s.
  • Vitesse angulaire le long de l'axe Z = (données brutes de l'axe Z du gyroscope/131) °/s.

Valeur de température en °/c (degré par Celsius)

Température en degrés C = ((données du capteur de température)/340 + 36,53) °/c.

Par exemple, Supposons qu'après 2 'complément, nous obtenions la valeur brute des axes X de l'accéléromètre = +15454

Alors Ax = +15454/16384 = 0,94 g.

Suite,

Nous savons donc que nous fonctionnons à une sensibilité de +/-2G et +/-250deg/s, mais comment nos valeurs correspondent-elles à ces accélérations/angles.

Ce sont tous deux des graphiques en ligne droite et nous pouvons en déduire que pour 1G, nous lirons 16384 et pour 1 degré/sec, nous lirons 131.07 (bien que le.07 soit ignoré en raison du binaire), ces valeurs ont simplement été calculées en dessinant le graphique en ligne droite avec 2G à 32767 et -2G à -32768 et 250/-250 aux mêmes valeurs.

Alors maintenant, nous connaissons nos valeurs de sensibilité (16384 et 131,07), il nous suffit de réduire les décalages de nos valeurs, puis de diviser par la sensibilité.

Ceux-ci fonctionneront bien pour les valeurs X et Y, mais comme le Z a été enregistré à 1G et non à 0, nous devrons réduire 1G (16384) avant de diviser par notre sensibilité.

Étape 3: Connexions MPU6050-Atmega328p

Connexions MPU6050-Atmega328p
Connexions MPU6050-Atmega328p
Connexions MPU6050-Atmega328p
Connexions MPU6050-Atmega328p
Connexions MPU6050-Atmega328p
Connexions MPU6050-Atmega328p

Connectez simplement tout comme indiqué dans le diagramme…

Les connexions sont données comme suit: -

MPU6050 Arduino Nano

Broche de sortie VCC 5v

GND Broche de masse

Broche SDA A4 //données série

broche SCL A5 // horloge série

Calcul du tangage et du roulis: le roulis est la rotation autour de l'axe x et le pas est la rotation le long de l'axe y.

Le résultat est en radians. (convertir en degrés en multipliant par 180 et en divisant par pi)

Étape 4: Codes et explications

Codes et explications
Codes et explications

/*

Tutoriel sur l'accéléromètre et le capteur gyroscope Arduino et MPU6050 par Dejan, https://howtomechatronics.com */ #include const int MPU = 0x68; // MPU6050 Adresse I2C flottante AccX, AccY, AccZ; flotteur GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; roulis, tangage, lacet du flotteur; float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, previousTime; entier c = 0; void setup() { Serial.begin (19200); Fil.begin(); // Initialiser la communication Wire.beginTransmission(MPU); // Lancer la communication avec MPU6050 // MPU=0x68 Wire.write(0x6B); // Parlez au registre 6B Wire.write(0x00); // Effectuez une réinitialisation - placez un 0 dans le registre 6B Wire.endTransmission(true); //Terminer la transmission /* // Configurer la sensibilité de l'accéléromètre - Plage complète (par défaut +/- 2g) Wire.beginTransmission(MPU); Wire.write(0x1C); //Parle au registre ACCEL_CONFIG (1C hex) Wire.write(0x10); //Définir les bits de registre comme 00010000 (+/- 8g plage pleine échelle) Wire.endTransmission(true); // Configurer la sensibilité du gyroscope - Plage de pleine échelle (par défaut +/- 250 deg/s) Wire.beginTransmission(MPU); Wire.write(0x1B); // Parlez au registre GYRO_CONFIG (1B hex) Wire.write(0x10); // Définir les bits du registre sur 00010000 (1000deg/s pleine échelle) Wire.endTransmission(true); retard(20); */ // Appelez cette fonction si vous avez besoin d'obtenir les valeurs d'erreur IMU pour votre module calculate_IMU_error(); retard(20); } void loop() { // === Lire les données de l'accélérateur === // Wire.beginTransmission(MPU); Wire.write(0x3B); // Commence par le registre 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU, 6, true); // Lecture de 6 registres au total, chaque valeur d'axe est stockée dans 2 registres // Pour une plage de +-2g, il faut diviser les valeurs brutes par 16384, selon la fiche technique AccX = (Wire.read() << 8 | Wire.read()) / 16384.0; // Valeur de l'axe X AccY = (Wire.read() << 8 | Wire.read()) / 16384.0; // Valeur de l'axe Y AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0; // Valeur de l'axe Z // Calcul du roulis et du tangage à partir des données de l'accéléromètre accAngleX = (atan(AccY / sqrt(pow(AccX, 2) + pow(AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~(0.58) Voir la fonction custom calculate_IMU_error() pour plus de détails accAngleY = (atan(-1 * AccX / sqrt(pow(AccY, 2) + pow(AccZ, 2))) * 180 / PI) + 1,58; // AccErrorY ~(-1.58) // === Lire les données du gyroscope === // previousTime = currentTime; // L'heure précédente est stockée avant l'heure actuelle read currentTime = millis(); // Heure actuelle Heure réelle lue elapsedTime = (currentTime - previousTime) / 1000; // Divisez par 1000 pour obtenir des secondes Wire.beginTransmission(MPU); Wire.write(0x43); // Adresse du premier registre des données du gyroscope 0x43 Wire.endTransmission(false); Wire.requestFrom(MPU, 6, true); // Lecture de 4 registres au total, chaque valeur d'axe est stockée dans 2 registres GyroX = (Wire.read() << 8 | Wire.read()) / 131.0; // Pour une plage de 250 deg/s, nous devons d'abord diviser la valeur brute par 131,0, selon la fiche technique GyroY = (Wire.read() << 8 | Wire.read()) / 131.0; GyroZ = (Wire.read() << 8 | Wire.read()) / 131,0; // Corrige les sorties avec les valeurs d'erreur calculées GyroX = GyroX + 0.56; // GyroErrorX ~(-0,56) GyroY = GyroY - 2; // GyroErrorY ~(2) GyroZ = GyroZ + 0,79; // GyroErrorZ ~ (-0,8) // Actuellement, les valeurs brutes sont en degrés par seconde, deg/s, nous devons donc multiplier par sendonds (s) pour obtenir l'angle en degrés gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime; lacet = lacet + GyroZ * temps écoulé; // Filtre complémentaire - combine les valeurs d'angle d'accéléromètre et de gyroscope roll = 0.96 * gyroAngleX + 0.04 * accAngleX; pas = 0,96 * gyroAngleY + 0,04 * accAngleY; // Imprime les valeurs sur le moniteur série Serial.print(roll); Serial.print("/"); Serial.print(pas); Serial.print("/"); Serial.println(lacet); } void calculate_IMU_error() { // Nous pouvons appeler cette fonction dans la section de configuration pour calculer l'erreur de données de l'accéléromètre et du gyroscope. À partir de là, nous obtiendrons les valeurs d'erreur utilisées dans les équations ci-dessus imprimées sur le moniteur série. // Notez que nous devons placer l'IMU à plat afin d'obtenir les valeurs appropriées, de sorte que nous puissions ensuite les valeurs correctes // Lire les valeurs de l'accéléromètre 200 fois while (c < 200) { Wire.beginTransmission(MPU); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU, 6, true); AccX = (Wire.read() << 8 | Wire.read()) / 16384.0; AccY = (Wire.read() << 8 | Wire.read()) / 16384.0; AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0; // Somme de toutes les lectures AccErrorX = AccErrorX + ((atan((AccY) / sqrt(pow((AccX), 2) + pow((AccZ), 2))) * 180 / PI)); AccErrorY = AccErrorY + ((atan(-1 * (AccX) / sqrt(pow((AccY), 2) + pow((AccZ), 2))) * 180 / PI)); c++; } // Divisez la somme par 200 pour obtenir la valeur d'erreur AccErrorX = AccErrorX / 200; AccErrorY = AccErrorY / 200; c = 0; // Lit les valeurs du gyroscope 200 fois while (c < 200) { Wire.beginTransmission(MPU); Wire.write(0x43); Wire.endTransmission(false); Wire.requestFrom(MPU, 6, true); GyroX = Wire.read() << 8 | Wire.read(); GyroY = Wire.read() << 8 | Wire.read(); GyroZ = Wire.read() << 8 | Wire.read(); // Somme de toutes les lectures GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131,0); c++; } // Divisez la somme par 200 pour obtenir la valeur d'erreur GyroErrorX = GyroErrorX / 200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Affiche les valeurs d'erreur sur le Serial Monitor Serial.print("AccErrorX: "); Serial.println(AccErrorX); Serial.print("AccErrorY: "); Serial.println(AccErrorY); Serial.print("GyroErrorX: "); Serial.println(GyroErrorX); Serial.print("GyroErrorY: "); Serial.println(GyroErrorY); Serial.print("GyroErrorZ: "); Serial.println(GyroErrorZ); } ------------------------------------------------- ----------------------------------------------------------- Résultats:- X = Y = Z = ---------------------------------------------- ----------------------------------------------- Note importante: - ----------------

Dans la section boucle, nous commençons par lire les données de l'accéléromètre. Les données pour chaque axe sont stockées dans 2 octets ou registres et on peut voir les adresses de ces registres à partir de la fiche technique du capteur.

Afin de tous les lire, nous commençons par le premier registre et, à l'aide de la fonction requiestFrom(), nous demandons de lire les 6 registres pour les axes X, Y et Z. Ensuite, nous lisons les données de chaque registre et, comme les sorties sont complémentaires à deux, nous les combinons de manière appropriée pour obtenir les valeurs correctes.

Étape 5: Comprendre l'angle d'inclinaison

Accéléromètre

La gravité terrestre est une accélération constante où la force pointe toujours vers le centre de la Terre.

Lorsque l'accéléromètre est parallèle à la gravité, l'accélération mesurée sera de 1G, lorsque l'accéléromètre est perpendiculaire à la gravité, il mesurera 0G.

L'angle d'inclinaison peut être calculé à partir de l'accélération mesurée en utilisant cette équation:

θ = sin-1 (Accélération mesurée / Accélération par gravité)

GyroGyro (a.k.a. rate sensor) est utilisé pour mesurer la vitesse angulaire (ω).

Afin d'obtenir l'angle d'inclinaison d'un robot, nous devons intégrer les données du gyroscope comme indiqué dans l'équation ci-dessous:

= dθ / dt, θ = ∫ ω dt

Fusion de capteurs gyroscope et accéléromètreAprès avoir étudié les caractéristiques du gyroscope et de l'accéléromètre, nous savons qu'ils ont leurs propres forces et faiblesses. L'angle d'inclinaison calculé à partir des données de l'accéléromètre a un temps de réponse lent, tandis que l'angle d'inclinaison intégré à partir des données du gyroscope est soumis à une dérive sur une période de temps. En d'autres termes, nous pouvons dire que les données de l'accéléromètre sont utiles à long terme tandis que les données du gyroscope sont utiles à court terme.

Lien pour mieux comprendre: Cliquez ici

Conseillé: