Nota

Ciao, benvenuto nella community di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirti a noi?

  • Supporto Esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra comunità e del nostro team.

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

  • Anteprime Esclusive: Ottieni accesso anticipato ai nuovi annunci di prodotti e anteprime.

  • Sconti Speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni Festive e Giveaway: Partecipa a concorsi e promozioni festive.

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

2.2.9 Modulo MPU6050

Introduzione

L’MPU-6050 è il primo e unico dispositivo di tracciamento del movimento a 6 assi al mondo (3 assi giroscopio e 3 assi accelerometro) progettato per smartphone, tablet e sensori indossabili che richiedono tali funzionalità, inclusi bassi consumi energetici, basso costo e alte prestazioni.

In questo esperimento, utilizzeremo l’I2C per ottenere i valori del sensore di accelerazione a tre assi e del giroscopio a tre assi per l’MPU6050 e visualizzarli 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

COMPONENTI IN QUESTO KIT

LINK

Raphael Kit

337

Raphael Kit

Puoi anche acquistarli separatamente dai link seguenti.

INTRODUZIONE AI COMPONENTI

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Modulo MPU6050

ACQUISTA

Schema Elettrico

MPU6050 comunica con il microcontrollore tramite l’interfaccia bus I2C. È necessario collegare SDA1 e SCL1 al pin corrispondente.

../_images/image330.png

Procedure Sperimentali

Passo 1: Costruisci il circuito.

../_images/image227.png

Passo 2: Configura l’I2C (vedi Appendice Configurazione I²C. Se hai già configurato l’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 l’esecuzione del codice, l’angolo di deflessione degli assi x e y, l’accelerazione e la velocità angolare su ciascun asse rilevati dall’MPU6050 verranno stampati sullo schermo dopo essere stati calcolati.

Nota

  • Se appare un errore come wiringPi.h: No such file or directory, fai riferimento a Installa e Controlla wiringPi.

  • Se ricevi l’errore Unable to open I2C device: No such file or directory, devi fare riferimento a Configurazione I²C per abilitare l’I2C e verificare se il cablaggio è corretto.

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 degli assi X, Y e Z del sensore giroscopico.
    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);

    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 X, Y e Z del sensore di accelerazione.
    printf("My acclX_scaled: %f\n", acclX_scaled);
    printf("My acclY_scaled: %f\n", acclY_scaled);
    printf("My acclZ_scaled: %f\n", acclZ_scaled);

    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));

    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;
}

Leggi 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));
}

Ottieni l’angolo di deflessione 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 deflessione 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;

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

Leggi i valori degli assi x, y e z sul sensore giroscopico, converti i metadati in valori di velocità angolare e quindi stampali.

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 X, Y e Z del sensore di accelerazione.
printf("My acclX_scaled: %f\n", acclX_scaled);
printf("My acclY_scaled: %f\n", acclY_scaled);
printf("My acclZ_scaled: %f\n", acclZ_scaled);

Leggi i valori degli assi x, y e z sul sensore di accelerazione, converti i metadati in valori di accelerazione (unità gravitazionale), e stampali.

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 deflessione degli assi x e y.

Immagine del Fenomeno

../_images/image228.jpeg