MICHELEPISANI.IT
 

Sensore MPU-6050 e Servo Motori

Muovere Due Motori Servo con un Giroscopio/Accelerometro

arduino - muovere due motori servo con un giroscopio accelerometro
March 28
07:462017

Incuriosito dal voler testare la sensibilità di un giroscopio/accelerometro mi sono orientato su un sensore a bassissimo costo, l'MPU-6050, verificandone il funzionamento associando il suo orientamento al movimento di due motori servo.

Ho creato pertanto un piccolo progetto con Arduino UNO dove, tramite il display LCD 1602 I2C, viene mostrato il valore dell'angolo di rotazione di ciascuno dei due motori servo che contestualmente si muovono in base all'orientamento del giroscopio/accelerometro, rispettivamente sull'asse X e sull'asse Y.

Di seguito lo schema elettrico del progetto (nell'immagine il sensore MPU-6050 non è esattamente rappresentativo in quanto non sono riuscito a trovarlo nella libreria del software Fritzing, tuttavia è molto similare e dal video poco sotto potete verificare che quello effettivo è di colore blu)

arduino - muovere due motori servo con un giroscopio o accelerometro
Fig. 1 - Schema per Arduino - Muovere Due Motori Servo con un Giroscopio/Accelerometro

Ed ecco la parte più interessante del progetto, lo sketch, dovutamente commentato per agevolarne la comprensione:

#include <SPI.h>
#include <Wire.h>
#include <Servo.h>
#define MPU 0x68
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

Servo ServoX, ServoY;
double AcX,AcY,AcZ;
int Pitch, Roll;

void setup() {
  Serial.begin(9600);
  ServoX.attach(9);
  ServoY.attach(10);
  init_MPU(); // Inizializzazione del sensore MPU6050
  lcd.begin(16, 2);
}
 
void loop() {

	// Richiamo alla funzione per l'acquisizione degli assi X, Y e Z del sensore MPU6050
  FunctionsMPU();
    
	// Calcolo dell'angolo intorno all'asse X (Roll) e intorno all'asse Y (Pitch)
  Roll = FunctionsPitchRoll(AcX, AcY, AcZ);
  Pitch = FunctionsPitchRoll(AcY, AcX, AcZ);

  int ServoRoll = map(Roll, -90, 90, 0, 179);
  int ServoPitch = map(Pitch, -90, 90, 179, 0);

  ServoX.write(ServoRoll);
  ServoY.write(ServoPitch);

	// Stampo i valori delle rotazioni sul monitor seriale
  Serial.print("Pitch: "); Serial.print(Pitch);
  Serial.print("	");
  Serial.print("Roll: "); Serial.print(Roll);
  Serial.print("
");

	// Stampo i valori delle rotazioni sul display LCD 1602
  lcd.setCursor(0, 0);
  lcd.write("Pitch:          ");
  lcd.setCursor(7, 0);
  lcd.print(Pitch);
  lcd.setCursor(0, 1);
  lcd.write("Roll:           ");
  lcd.setCursor(6, 1);
  lcd.print(Roll);

}

void init_MPU() {
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  delay(1000);
}

//Funzione per il calcolo degli angoli intorno all'asse X ed Y
double FunctionsPitchRoll(double A, double B, double C) {
  double DatoA, DatoB, Value;
  DatoA = A;
  DatoB = (B*B) + (C*C);
  DatoB = sqrt(DatoB);
  
  Value = atan2(DatoA, DatoB);
  Value = Value * 180/3.14;
  
  return (int)Value;
}

void FunctionsMPU() {
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU,6,true);  // request a total of 14 registers
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
}

Di seguito una breve dimostrazione del funzionamento del progetto dove è evidente la sensibilità del sensore principale utilizzato:

Per consigli, suggerimenti o chiarimenti sentitevi liberi di lasciare un commento!

Tags

Autore

Michele Pisani

Michele Pisani

Ho uno spiccato orientamento al problem-solving, se è troppo facile non mi diverto :)
Credo nella volontà e nel cambiamento perchè hanno fatto della mia passione il mio pane quotidiano.
Se devo descrivermi con una sola parola direi... "Concretezza", la mia stretta di mano è una garanzia.

5 Commenti

  1. luigi andreoni Saturday, December 8, 2018 alle ore 15:42

    Salve sono interessato a questo tuo progetto ma purtroppo mi sto leteralmente incasinado
    non rieco a farlo funzionare .
    Mi interessa perchè se fosse possibile vorrei verificare vibrazioni e accelerazione su di un arco olimpico per intederci ( arco come sport)
    sperando di non recare alcun disturbo
    Luigi

    Rispondi a questo commento
    • Michele PisaniAutore Saturday, December 8, 2018 alle ore 23:52

      Ciao Luigi,
      non è chiaro dal tuo messaggio dov'è che trovi difficoltà con il funzionamento dello sketch, senza alcun riferimento potrei supporre che il problema stia nelle librerie incluse al progetto. Assicurati di averle scaricate ed aggiunte all'IDE.

      Rispondi a questo commento
  2. Damiano Wednesday, March 27, 2019 alle ore 20:39

    E' possibile modificare il progetto per mettere il giroscopio a un drone ?

    Rispondi a questo commento
    • Michele PisaniAutore Thursday, March 28, 2019 alle ore 00:24

      Ciao Damiano,
      se viene utilizzato in qualche modo Arduino direi di sì, ma se deve interagire con il drone stesso è probabile che non faccia al caso tuo.

      Rispondi a questo commento
  3. Vincenzo Sunday, May 12, 2024 alle ore 00:56

    Salve,
    Sono neofita, se mi può aiutare gentilmente, ho guardato il suo progetto e vorrei che il servo si muovesse solo se il giroscopio lo giro su stesso a 360^ su piano orizzontale, quale è l’asse interessato? Se mi potrebbe aiutare sul codice vorrei che il servo si muova al completamento di 1 o 2 giri su stesso del giroscopio.
    Attendo sue e la ringrazio in anticipo per la risposta.
    Saluti

    Rispondi a questo commento

Scrivi un Commento

Il tuo indirizzo email non sarà pubblicato.
I campi contrassegnati da un * sono obbligatori

Articoli e Argomenti correlati

Il Canale YouTube in ITALIANO

1 VIDEO GRATIS ogni 2 settimane! ISCRIVITI!

Entra a far parte della community su Facebook

Categorie popolari

Iscriviti alla mia newsletter

La tua e-mail con me sarà al sicuro.
Non fornirò mai le tue informazioni a nessuno!

Ultimi commenti

olgica

NON MI FUNZIONA,SALUTI.CIAO

olgica

Neppure a me non funziona

Franca

Mi chiamo Franca Admore. Voglio informare tutti sul dottor Ogundele. Quest'uomo è un grande …

Michele Pisani

Ciao Anna Rita, diciamo che... esisteva. Ho mantenuto il prodotto gratuitamente fintanto che ho …