Cerca codice

Codice dell'accelerometro, giroscopio e magnetometro MPU-9250

Codice dell'accelerometro, giroscopio e magnetometro MPU-9250

In questo tutorial, esploreremo come utilizzare il sensore MPU-9250, che combina un accelerometro, un giroscopio e un magnetometro in un unico modulo compatto. Alla fine di questa guida, sarai in grado di leggere i dati del sensore e interpretarne il significato nei tuoi progetti. Questo sensore è particolarmente utile per applicazioni come la robotica e i droni, dove l'orientamento e il tracciamento del movimento sono fondamentali. Puoi fare riferimento al video per ulteriori chiarimenti sulla configurazione e sul codice (nel video a 00:20).

ELE_MPU6050_208
ELE_MPU6050_208

Hardware Spiegato

Il modulo MPU-9250 integra tre sensori: un accelerometro, un giroscopio e un magnetometro. L'accelerometro misura le forze di accelerazione, consentendo di determinare la velocità e l'orientamento. Il giroscopio fornisce la velocità angolare, aiutando a comprendere il cambiamento di orientamento nel tempo. Infine, il magnetometro agisce come una bussola, fornendo dati sul campo magnetico che aiutano nella navigazione.

Questa combinazione di sensori è particolarmente vantaggiosa in applicazioni dove è richiesta una tracciatura del movimento precisa, come nei droni o negli smartphone. L'MPU-9250 comunica tramite I2C o SPI, rendendolo versatile per diverse configurazioni di microcontrollori.

Dettagli della scheda dati

Produttore InvenSense
Numero di parte MPU-9250
Tensione Logica/IO 1,8 V (I/O), 3,3 V (alimentazione)
Tensione di alimentazione 2,4 - 3,6 V
Corrente di uscita (per canale) 3,2 mA (funzionamento normale)
Corrente di punta (per canale) 19,8 mA (max)
Guida sulla frequenza PWM N/A
Soglie logiche di ingresso 0,3 * VDD(basso), 0,7 * VDD(alto)
Caduta di tensione / RDS(on)/ saturazione N/A
Limiti termici -40 a 85 °C
Pacchetto QFN
Note / varianti Include regolatore di tensione interno
  • Assicurati di fornire una corretta alimentazione di tensione (2,4 - 3,6 V) per evitare di danneggiare il modulo.
  • Utilizzare una resistenza di pull-up per le linee SDA e SCL se non è già inclusa nella scheda di svincolo.
  • Verifica l'indirizzo I2C (il predefinito è 0x68) e regola il pin ADO di conseguenza per indirizzi alternativi.
  • Controlla le connessioni per stabilità per prevenire letture errate.
  • Calibra i sensori regolarmente per misurazioni accurate.

Istruzioni di cablaggio

Cablaggio Arduino per MPU6050 utilizzando A4 e A4 per SDA e SCL
Cablaggio Arduino per MPU6050 utilizzando A4 e A4 per SDA e SCL
Arduino Wiring for MPU-6050
Arduino Wiring for MPU-6050
Arduino wiring for  MPU6050 using A4 and A4 for SDA and SCL
Arduino wiring for MPU6050 using A4 and A4 for SDA and SCL

Per collegare l'MPU-9250 al tuo Arduino, inizia collegando il pin VCC dell'MPU-9250 al pin 5V dell'Arduino. Il modulo ha un regolatore interno, quindi è sicuro alimentarlo con 5V. Successivamente, collega il pin GND a terra (GND) sull'Arduino. Per la comunicazione dei dati, collega il pin SDA al pin A4 dell'Arduino e il pin SCL al pin A5. Questa configurazione è standard per molte schede Arduino.

Se stai usando un Arduino Mega, i pin SDA e SCL si trovano ai pin 20 e 21, rispettivamente. Assicurati che le connessioni siano sicure per evitare errori di comunicazione. Se hai bisogno di cambiare l'indirizzo I2C dell'MPU-9250, collega il pin ADO a 5V per impostarlo su 0x69. Disconnetterlo lo ripristinerà a 0x68.

Schema Arduino per MPU6050 utilizzando A4 e A4 per SDA e SCL
Schema Arduino per MPU6050 utilizzando A4 e A4 per SDA e SCL

Esempi di Codice e Guida Passo Passo

Nel codice Arduino, iniziamo includendo la libreria MPU9250 e creando un'istanza del sensore:

#include "MPU9250.h"
MPU9250 IMU(Wire,0x68);

Il codice inizializza il sensore e inizia la comunicazione nelsetup()funzione:

void setup() {
  Serial.begin(115200);
  status = IMU.begin();
  if (status < 0) {
    Serial.println("IMU initialization unsuccessful");
    while(1) {}
  }
}

All'interno delloop()funzione, leggiamo continuamente e stampiamo i dati del sensore:

void loop() {
  IMU.readSensor();
  Serial.print("AccelX: ");
  Serial.print(IMU.getAccelX_mss(),6);
  // More print statements for other axes
}

Questa sezione legge i valori dell'accelerometro, del giroscopio e del magnetometro, mostrandoli nel Monitor Seriale. Assicurati di controllare il codice completo caricato sotto l'articolo per l'implementazione completa.

Dimostrazione / Cosa Aspettarsi

Quando esegui il codice, dovresti vedere i valori del sensore aggiornarsi in tempo reale nel Monitor Seriale. I valori dell'accelerometro fluttueranno mentre muovi il sensore, mentre i valori del giroscopio mostreranno il tasso di rotazione. Il magnetometro ti darà la forza del campo magnetico su tre assi, che possono essere utilizzati per determinare l'orientamento. Fai attenzione agli input flottanti, poiché possono portare a letture imprecise (nel video alle 12:30).

Capitoli

  • Introduzione (00:00)
  • Hardware spiegato (01:30)
  • Istruzioni per il cablaggio (04:00)
  • Esempi di codice e walkthrough (06:00)
  • Dimostrazione (10:00)

Immagini

ELE_MPU6050_208
ELE_MPU6050_208
Arduino Wiring for MPU-6050
Arduino Wiring for MPU-6050
Arduino Schematic for  MPU6050 using A4 and A4 for SDA and SCL
Arduino Schematic for MPU6050 using A4 and A4 for SDA and SCL
Arduino wiring for  MPU6050 using A4 and A4 for SDA and SCL
Arduino wiring for MPU6050 using A4 and A4 for SDA and SCL
126-Arduino code for an MPU-9250 accelerometer, gyroscope, and magnetometer
Lingua: C++
/*
 * Library: https://github.com/bolderflight/MPU9250
Basic_I2C.ino
Brian R Taylor
brian.taylor@bolderflight.com

Copyright (c) 2017 Bolder Flight Systems

Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
and associated documentation files (the "Software"), to deal in the Software without restriction, 
including without limitation the rights to use, copy, modify, merge, publish, distribute, 
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or 
substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
 * Updated by Ahmad Shamshiri on July 9, 2018 for Robojax.com
 * in Ajax, Ontario, Canada
 * Watch instruction video for this code: 
For this sketch you need to connect:
VCC to 5V and GND to GND of Arduino
SDA to A4 and SCL to A5

S20A is 3.3V voltage regulator MIC5205-3.3BM5
*/

#include "MPU9250.h"

// An MPU9250 object with the MPU-9250 sensor on I2C bus 0 with address 0x68
MPU9250 IMU(Wire,0x68);
int status;

void setup() {
  // Serial to display data
  Serial.begin(115200);
  while(!Serial) {}

  // Start communication with IMU 
  status = IMU.begin();
  if (status < 0) {
    Serial.println("IMU initialization unsuccessful");
    Serial.println("Check IMU wiring or try cycling power");
    Serial.print("Status: ");
    Serial.println(status);
    while(1) {}
  }
}

void loop() {
  // Read the sensor
  IMU.readSensor();
  // Display the data
  Serial.print("AccelX: ");
  Serial.print(IMU.getAccelX_mss(),6);
  Serial.print("\t");
  Serial.print("AccelY: ");  
  Serial.print(IMU.getAccelY_mss(),6);
  Serial.print("\t");
  Serial.print("AccelZ: ");  
  Serial.println(IMU.getAccelZ_mss(),6);
  
  Serial.print("GyroX: ");
  Serial.print(IMU.getGyroX_rads(),6);
  Serial.print("\t");
  Serial.print("GyroY: ");  
  Serial.print(IMU.getGyroY_rads(),6);
  Serial.print("\t");
  Serial.print("GyroZ: ");  
  Serial.println(IMU.getGyroZ_rads(),6);

  Serial.print("MagX: ");  
  Serial.print(IMU.getMagX_uT(),6);
  Serial.print("\t");  
  Serial.print("MagY: ");
  Serial.print(IMU.getMagY_uT(),6);
  Serial.print("\t");
  Serial.print("MagZ: ");  
  Serial.println(IMU.getMagZ_uT(),6);
  
  Serial.print("Temperature in C: ");
  Serial.println(IMU.getTemperature_C(),6);
  Serial.println();
  delay(200);
}

Risorse e riferimenti

File📁

Nessun file disponibile.