Nota

Ciao, benvenuto nella community SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Immergiti più a fondo in Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirti?

  • Supporto esperto: Risolvi i problemi post-vendita e le sfide tecniche con l’aiuto della nostra community e del nostro team.

  • Impara e condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Ottieni accesso anticipato a nuovi annunci di prodotti e anteprime esclusive.

  • Sconti speciali: Goditi sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni festive e omaggi: Partecipa a concorsi e promozioni festive.

👉 Pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi stesso!

2.2.9 Modulo MPU6050

Introduzione

Il MPU-6050 è il primo e unico dispositivo di tracciamento del movimento a 6 assi al mondo (giroscopio a 3 assi e accelerometro a 3 assi) progettato per smartphone, tablet e sensori indossabili che richiedono queste caratteristiche, tra cui basso consumo, basso costo e alte prestazioni.

In questo esperimento, utilizziamo l’I2C per ottenere i valori dell’accelerometro a tre assi e del giroscopio a tre assi dell’MPU6050 e li visualizziamo sullo schermo.

Componenti necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

../_images/list_2.2.6.png

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

Kit Raphael

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE COMPONENTE

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Modulo MPU6050

ACQUISTA

Schema elettrico

Il MPU6050 comunica con il microcontrollore tramite l’interfaccia bus I2C. I pin SDA1 e SCL1 devono essere collegati al pin corrispondente.

../_images/image330.png

Procedure sperimentali

Passo 1: Costruisci il circuito.

../_images/image227.png

Passo 2: Configura I2C (vedi Appendice Configurazione I²C. Se hai già configurato I2C, salta questo passaggio.)

Passo 3: Vai alla cartella del codice.

cd ~/raphael-kit/c/2.2.9/

Passo 4: Compila il codice.

gcc 2.2.9_mpu6050.c -lwiringPi -lm

Passo 5: Esegui il file eseguibile.

sudo ./a.out

Dopo aver eseguito il codice, l’angolo di deviazione sugli assi x, y e l’accelerazione, la velocità angolare su ciascun asse letti dall’MPU6050 verranno stampati sullo schermo dopo essere stati calcolati.

Nota

  • Se viene visualizzato l’errore wiringPi.h: No such file or directory, consulta Installazione e verifica di WiringPi.

  • Se ricevi l’errore Unable to open I2C device: No such file or directory, consulta Configurazione I²C per abilitare I2C e verifica se i collegamenti sono corretti.

Codice

#include  <wiringPiI2C.h>
#include <wiringPi.h>
#include  <stdio.h>
#include  <math.h>
int fd;
int acclX, acclY, acclZ;
int gyroX, gyroY, gyroZ;
double acclX_scaled, acclY_scaled, acclZ_scaled;
double gyroX_scaled, gyroY_scaled, gyroZ_scaled;

int read_word_2c(int addr)
{
int val;
val = wiringPiI2CReadReg8(fd, addr);
val = val << 8;
val += wiringPiI2CReadReg8(fd, addr+1);
if (val >= 0x8000)
    val = -(65536 - val);
return val;
}

double dist(double a, double b)
{
return sqrt((a*a) + (b*b));
}

double get_y_rotation(double x, double y, double z)
{
double radians;
radians = atan2(x, dist(y, z));
return -(radians * (180.0 / M_PI));
}

double get_x_rotation(double x, double y, double z)
{
double radians;
radians = atan2(y, dist(x, z));
return (radians * (180.0 / M_PI));
}

int main()
{
fd = wiringPiI2CSetup (0x68);
wiringPiI2CWriteReg8 (fd,0x6B,0x00);//disabilita la modalità sleep
printf("set 0x6B=%X\n",wiringPiI2CReadReg8 (fd,0x6B));

while(1) {

    gyroX = read_word_2c(0x43);
    gyroY = read_word_2c(0x45);
    gyroZ = read_word_2c(0x47);

    gyroX_scaled = gyroX / 131.0;
    gyroY_scaled = gyroY / 131.0;
    gyroZ_scaled = gyroZ / 131.0;

    //Stampa i valori sugli assi X, Y e Z del sensore giroscopico.
    printf("Il mio gyroX_scaled: %f\n", gyroX_scaled);
    printf("Il mio gyroY_scaled: %f\n", gyroY_scaled);
    printf("Il mio gyroZ_scaled: %f\n", gyroZ_scaled);

    acclX = read_word_2c(0x3B);
    acclY = read_word_2c(0x3D);
    acclZ = read_word_2c(0x3F);

    acclX_scaled = acclX / 16384.0;
    acclY_scaled = acclY / 16384.0;
    acclZ_scaled = acclZ / 16384.0;

    //Stampa i valori sugli assi X, Y e Z del sensore di accelerazione.
    printf("Il mio acclX_scaled: %f\n", acclX_scaled);
    printf("Il mio acclY_scaled: %f\n", acclY_scaled);
    printf("Il mio acclZ_scaled: %f\n", acclZ_scaled);

    printf("La mia rotazione X: %f\n", get_x_rotation(acclX_scaled, acclY_scaled, acclZ_scaled));
    printf("La mia rotazione Y: %f\n", get_y_rotation(acclX_scaled, acclY_scaled, acclZ_scaled));

    delay(100);
}
return 0;
}

Spiegazione del Codice

int read_word_2c(int addr)
{
int val;
val = wiringPiI2CReadReg8(fd, addr);
val = val << 8;
val += wiringPiI2CReadReg8(fd, addr+1);
if (val >= 0x8000)
    val = -(65536 - val);
return val;
}

Legge i dati del sensore inviati dall’MPU6050.

double get_y_rotation(double x, double y, double z)
{
double radians;
radians = atan2(x, dist(y, z));
return -(radians * (180.0 / M_PI));
}

Otteniamo l’angolo di deviazione sull’asse Y.

double get_x_rotation(double x, double y, double z)
{
double radians;
radians = atan2(y, dist(x, z));
return (radians * (180.0 / M_PI));
}

Calcola l’angolo di deviazione dell’asse X.

gyroX = read_word_2c(0x43);
gyroY = read_word_2c(0x45);
gyroZ = read_word_2c(0x47);

gyroX_scaled = gyroX / 131.0;
gyroY_scaled = gyroY / 131.0;
gyroZ_scaled = gyroZ / 131.0;

//Print values for the X, Y, and Z axes of the gyroscope sensor.
printf("My gyroX_scaled: %f\n", gyroY X_scaled);
printf("My gyroY_scaled: %f\n", gyroY Y_scaled);
printf("My gyroZ_scaled: %f\n", gyroY Z_scaled);

Legge i valori degli assi X, Y e Z del sensore giroscopico, converte i dati grezzi in valori di velocità angolare e poi li stampa.

acclX = read_word_2c(0x3B);
acclY = read_word_2c(0x3D);
acclZ = read_word_2c(0x3F);

acclX_scaled = acclX / 16384.0;
acclY_scaled = acclY / 16384.0;
acclZ_scaled = acclZ / 16384.0;

//Print the X, Y, and Z values of the acceleration sensor.
printf("My acclX_scaled: %f\n", acclX_scaled);
printf("My acclY_scaled: %f\n", acclY_scaled);
printf("My acclZ_scaled: %f\n", acclZ_scaled);

Legge i valori degli assi X, Y e Z del sensore di accelerazione, converte i dati grezzi in valori di accelerazione (in unità di gravità) e poi li stampa.

printf("My X rotation: %f\n", get_x_rotation(acclX_scaled, acclY_scaled, acclZ_scaled));
printf("My Y rotation: %f\n", get_y_rotation(acclX_scaled, acclY_scaled, acclZ_scaled));

Stampa gli angoli di deviazione degli assi X e Y.

Immagine del fenomeno

../_images/image228.jpeg