MPU6050 ivme Ve Gyro Sensörü Kullanımı

63 34.599

Mpu6050 hava araçlarında, denge robotlarında veya birçok robot projesinde sıkça kullanılan sensörlerdir.Üzerinde 3 eksenli gyro ve 3 eksen açısal ivme ölçer olan IMU sensör kartıdır.Kart I2C protokolünü desteklediğinden üzerindeki pinler standart I2C pinleridir ve arduinonun standart I2C pinlerine takılmalıdır.Üzerinde voltaj regülatörü bulunduğundan 3v ile 5v arası voltajla beslenmektedir.Açısal ivme ölçer aralığı ± 2 ± 4 ± 8 ± 16 g, Gyro ölçüm aralağı ise + 250 500 1000 2000 ° / s ‘dir.

Örnek Uygulama:

Arduino uno scl ve sda I2C pinleri sırayla a5 ve a4 olduğundan o pinlere takmamız gereklidir.

Yazılım Kısmı:

Öncelikle sensörün kütüphanesini indirelim.>> MPU6050

#include "I2Cdev.h" //I2C kütüphanesi
#include "MPU6050.h" //Mpu6050 kütüphanesi
#include "Wire.h"
MPU6050 accelgyro; // Mpu6050 sensör tanımlama
int16_t ax, ay, az; //ivme tanımlama
int16_t gx, gy, gz; //gyro tanımlama
 
void setup() {
Wire.begin();
Serial.begin(38400);
Serial.println("I2C cihazlar başlatılıyor...");
accelgyro.initialize();
Serial.println("Test cihazı bağlantıları...");
Serial.println(accelgyro.testConnection() ? "MPU6050 bağlantı başarılı" : "MPU6050 bağlantısı başarısız");
}
 
void loop() {
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); // ivme ve gyro değerlerini okuma
 
//açısal ivmeleri ve gyro değerlerini ekrana yazdırma
Serial.print("a/g:\t");
Serial.print(ax); Serial.print("\t");
Serial.print(ay); Serial.print("\t");
Serial.print(az); Serial.print("\t");
Serial.print(gx); Serial.print("\t");
Serial.print(gy); Serial.print("\t");
Serial.println(gz);
}

Yazılımda fonksiyonların açıklamaları yazıyor.Sensörden gelen ivme ve gyro değerlerini serial monitorden görebilirsiniz.

Mpu6050 ile yaptığımız Dengede Duran Robot projemize de bakabilirsiniz.

Bunlar da İlgini Çekebilir

Cevap bırakın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

63 Yorum
  1. Anonim

    Visitor Rating: 5 Stars

  2. muhammet

    kodu hata veren arkadaşlar icin bu yaziyi paylaşiyorum. 2 gündür aralıksız bu siteden indirdigim kütüphanenin verdigi hatayı çözmeye calısıyorum ve az önc cözdüm. ileride hayla karşılaşanlar icin ne yapmaları gerektigini söylüyorum. bu sitede ı2c kütüphanesi yok onu baska siteden buluyorsunuz bu sitedende mpu6050 kütüphanesini indiriyorsunuz sonrasında bu 2 kütüphaneyide ardiuno librariesin içine atıyorsunuz. önemli noktayı sçylüyorum bu 2 kütüphaneyi belgelerim içindeki arduino libraries klosörünün icine yapıstırıyorsumuz ve keyfinize bakıyorsunuz. ssdjkdjfdks

  3. tuğba

    Merhaba,kolay gelsin .
    Ben sensörü denemek için burada ki kodu yazdım ama sürekli sadece 0 değerini okuyor , bu neden olabilir ve çözümü nedir ? Yardımcı olursanız sevinirim.

    1. Burak Demir

      i2c_scanner programında seri port ekranında belirtilen adres (0x69)dur muhtemelen.kullanacağınız programda sensörü tanıtırken mpu(0x69) yazmanız gerekiyor ve ad0 pinine 5 v vermeniz gerekiyor.ben bu şekilde çözüm buldum.

  4. Anonim

    Visitor Rating: 4 Stars

  5. kenan

    kolay gelsin öncelikle ben mpu 6050 ile 3 eksen ile 3 motor yönetmek istiyorum yardımcı olablirseniz sevinirim

  6. esra

    Merhaba 12dev ve mpu6050 kütüphanelerini defalarca yüklememe rağmen çalışmıyor.
    “sketch_may04a:8: error: ‘MPU6050’ does not name a type ” sürekli bu hatayı veriyor nedeni ne olabilir.

    1. OMER

      kütüphanede sıkıntı vardır kütüphaneyi açın içinde tekrar MPU6050 kütüphanesi vardır. Onu belgelerden arduinoya girip ordan libraries klasörüne yapıştırmayı dene(ZIP veya RAR olmasın)

  7. Anonim

    Visitor Rating: 4 Stars

  8. orhan

    i2c dev kütüphanesini de ekleyebilir misiniz?

  9. Hasan ÇETİN

    Arduino Pro mini ye yüklemeye çalıştım olmadı hata veriyor neden olabilir? Arduino Uno üzerinden blink yoluyorum sıkıntı yok. Pro mini de olmuyor neden olabilir?

  10. Anonim

    Visitor Rating: 2 Stars

  11. Anonim

    Visitor Rating: 5 Stars

  12. barış özkara

    i2c dev kütüphanesini nerden yükleyebilirim

  13. Ömer

    İyi günler;
    Verdiğiniz kodları derleyip yükledikten sonra seri port ekranını açtığım zaman I2C Cihazlar başlatılıyor yazısında kalıyor bir değişiklik olmuyor

    1. Sezgin GÜL

      sensörün ı2c iletişiminde sorun var . Sensörün iletişiminde sorun olabilir. bağlantı pinlerini kontrol edin. orjinal arduino uno kullanıyorsanız üzerinde sda ve scl pini yazan yere takın.

      1. Ömer

        Klon uno kullanıyorum. SCL A5’e SDA A4’e taktım. En başta 5V ile denemiştim. Şemada öyle gösteriyordu. Sonra başka bir şema daha buldum 3.3V’a bağlamanız gerekiyor demişti. 3.3V’ta çalıştırmayı denedim ikisi de olmadı. I2C iletişimini nasıl düzeltebilirim ? Sensörün iletişiminde sorun varsa yeni MPU6050 almak zorunda mı kalacağım ?
        İyi çalışmalar.

  14. samet

    ı2c kütüphananesi mpu6050 içinde bulunmuyor

  15. Anonim

    Visitor Rating: 1 Stars

  16. Anonim

    Visitor Rating: 5 Stars

  17. serkan yıldırım

    merhaba hocam bend ebuna benzer bir proje yapmaya çalısıyorum ama nasıl lcd ekleyip degerleri ordan okuyabilirim acaba yardımcı olurmusunuz rica etsem

  18. barış

    iyi günler. gro ve ivme sensörlerini kod yazmadan mblock programıyla kodlayabilirmiyim? ortaokul çocuklarına yaptırmayı düşünüyoruz. yardımcı olursanız sevinirim.

  19. mahmut

    iyi günler ı2cdev.h kutuphanesını nerden bulabılırım

    1. Sezgin GÜL

      I2Cdev.h MPU6050 kütüphanesinin içinde bulunuyor ayrı indirmenize gerek yok.

      1. kullanıcı

        öyle bişey yoğ

  20. metin

    Merhaba Sezgin bey seri port ekranından değişiklikleri takip edebiliyorum sizin görüntülediğiniz programdan nasıl görüntüleyebilirim ayrı bir uygulamaya mı ihtiyacım var ?

  21. ahmet eren

    hocam merhaba
    youtube.com/watch?v=7nm1sERTW4g
    bu videodaki gibi acı ölçer yapmak istiyorum. kütüphaneleri indirdim donanımları aldım bir tane örnek kod buldum fakat stabil ve düzgün çalısmamakta. ve ayrıca 45,1 gibi acıkar veriyor ama bana virgülden sonra 2 haneyi görmem lazım gerçekten cok araştırdım ama ya ben bulamadım yada çok beceriksizim. Yardımlarınızı bekliyorum iyi çalışmalar.

  22. nilayyyy

    iyi günler mpu 9150 kullanarak sensörü kac metre hareket ettirdigimi bulmam gerekiyor bi fikriniz var mı bu konuda

  23. Kadir

    Merhabalar,
    Sizin yazınızda bütün ayarlar MPU6050.h kütüphanesinde yapılmıs.
    Benım sorum şu :
    Bende L3G4200D gyro üzerinde çalışıyorum. Hazır yazılmıs kütüphane buldum ,gyroscope çalışıyor.Ama ben mantığını öğrenmek istiyorum.
    Datastheet’e göre control_reg_1 ve cont_reg_4 kontrol etmeyi ve görevlerini öğrendim.
    1) Fakat bu gyronun çıkısında okuduğum değerin ne olduğunu anlamadım ? ( okudugumuz değer dps(degree per second) değil mi ?
    2 ) Range ‘nin mantıgı ney ? (250,500,2000)
    3) gyro u hareket ettırmesem bıle cıkıs alıyorum,fakat hareket ettirmediğim için onu açısal hızı 0 görmem lazım.Onun için zerolevel belirlemem lazım ve her okudugum değeri onun ile karsılastırıp açısal hızı bulabilirim.Bende bunun için 2000 örnek aldım, bunu bir değerde toplayıp ,toplam değeri 2000’e böldüm bir ortalama değer bldum bunada zero değer dedim ve her okudugum değeri bundan cıkarıyorum ,SIFIR cıkmaması normal ama sıfır’a yakında değil.büyük değerler cıkıyor.
    Bunu nasıl çözebilirim ?
    Teşekkürler.

    1. orkut göküş

      barissamanci.net/Makale/26/accelerometer-gyroscope-imu-nedir/
      bu linke bakarsanız mantığı hakkında bilgi sahibi olabilirsiniz

  24. ömer

    merhaba hocam kodu derleyince böyle bir hata veriyor yardımcı olabilirmisiniz?
    C:\Users\MER~1\AppData\Local\Temp\arduino_modified_sketch_941676\sketch_jun24a.ino:1:38: fatal error: I2Cdev.h: No such file or directory

    #include “I2Cdev.h” //I2C kütüphanesi

    ^

    compilation terminated.

    exit status 1
    Error compiling for board Arduino/Genuino Uno.

    1. Sezgin GÜL

      I2Cdev.h kütüphanesini eklemediğiniz için hata vermiş

      1. Ömer

        Hocam ben ekledimkütüphaneyi ama yanlış eklemiş olabilirim

  25. Cemşit

    Merhabalar,

    Aynı kodu tiva c serisi mikrokontrolcülerle de kullanabilir miyiz?

  26. hakan

    asagıdakı arduıno kodunu mpu6050 ye gore nasıl düzenleyebiliriz
    asagıdakı projede adxl335 kullanılmış biz mpu6050 ile düzenlemek istiyoruz fakat pek başarılı olamadık yardım edersenız cok seviniriz

    #include
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //pin definition for LCD
    const int numReadings = 10; /* Define the number of samples to keep track of. The higher the number, the more the readings will be smoothed, but the slower the output will respond to the input. Using a constant rather than a normal variable let use this value to determine the size of the readings array.*/

    int buffer[20]; //Buffer needed to store data packet for transmission
    int data1;
    int readings[numReadings]; // the readings from the analog input
    int index = 0; // the index of the current reading
    int total = 0; // the running total
    int average = 0; // the average

    int inputPin = A2;

    byte heart[8] = { //Custom LCD character
    0b00000,
    0b01010,
    0b11111,
    0b11111,
    0b11111,
    0b01110,
    0b00100,
    0b00000
    };

    byte smiley[8] = {
    0b00000,
    0b00000,
    0b01010,
    0b00000,
    0b00000,
    0b10001,
    0b01110,
    0b00000
    };

    byte block[8] = {
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111
    };

    void setup()
    {
    lcd.createChar(1, heart);
    // create a new character
    lcd.createChar(2, smiley);
    // create a new character
    lcd.createChar(3, block);
    pinMode(A4, OUTPUT);
    digitalWrite(A4, LOW);
    pinMode(A5, OUTPUT);
    digitalWrite(A5, HIGH);
    lcd.begin(16, 2);

    lcd.setCursor(0,0);
    lcd.print(” Digital Spirit”);
    lcd.setCursor(0,1);
    lcd.print(” Level Project”);
    lcd.setCursor(15,1);
    lcd.write(1);
    delay(2000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(” Made By”);
    lcd.setCursor(14,0);
    lcd.write(2);
    lcd.setCursor(0,1);
    lcd.print(“* SAJID SHAIKH *”);
    delay(3000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(“Using Arduino &”);
    lcd.setCursor(0,1);
    lcd.print(“Accelerometer”);
    delay(3000);
    lcd.setCursor(13,1);
    lcd.print(“.”);

    delay(1000);

    lcd.setCursor(14,1);
    lcd.print(“.”);

    delay(1000);

    lcd.setCursor(15,1);
    lcd.print(“.”);
    delay(2000);
    lcd.clear();
    digitalWrite(13,LOW);
    lcd.setCursor(0,0);
    lcd.print(“Let’s Begin!!!”);
    delay(1000);
    lcd.clear();
    // initialize serial communication with computer:
    Serial.begin(9600);
    // initialize all the readings to 0:
    for (int thisReading = 0; thisReading = numReadings)
    // …wrap around to the beginning:
    index = 0;

    // calculate the average:
    average = total / numReadings;
    /* since I am using 16 x 2 LCD, I am mapping the sensor values to 16 distinct values*/
    int avg=map (average, 280, 420, 0,15 );
    data1 = avg;
    plot(data1);

    lcd_Cursor_Position =15- avg; // calculation to position the lcd cursor
    lcd.setCursor((lcd_Cursor_Position), 1);
    lcd.write(3); /*this shows character on lcd which moves like bubble as in spirit level.*/
    lcd.setCursor((lcd_Cursor_Position), 0);
    lcd.write(3);
    delay(20);

    }
    /*This function plots the sensor data so It can be seen as a waveform on PC using Simplot tool.*/

    //It can be neglected

    void plot(int data1)
    {
    int pktSize;

    buffer[0] = 0xCDAB; //SimPlot packet header. Indicates start of data packet
    buffer[1] = 1*sizeof(int); //Size of data in bytes. Does not include the header and size fields
    buffer[2] = data1;

    pktSize = 2 + 2 + (1*sizeof(int)); //Header bytes + size field bytes + data

    //IMPORTANT: Change to serial port that is connected to PC
    Serial.write((uint8_t * )buffer, pktSize);
    }

  27. hakan

    mpu6050 ile Digital su terazisi yapılabılırmı yoksa adxl335 mi kulanmak zorundayız yardımıcı olursanız cok sevinirim

    1. Sezgin GÜL

      ikisini de kullanabilirsiniz

  28. Murat İMGA

    Merhaba; videodaki processing uygulamaya nasıl ulaşabilirim.

  29. Seçkin

    Çok teşekkürler. En azından ani ivme artışı olduğunda buzzer ve led aktive etmeyi başardım. Kodları aşağıdaki gibi düzenledim. Ancak şimdiki sorunum şu. Led ve buzzer ın kesik kesik aktive olması yani flaşör ve kesik buzzer sesi yapmak istiyorum. Burada nasıl bir ekleme yapmam gerekiyor aşağıdaki kodlara? Bir türlü beceremedim… 🙂

    #include “Wire.h”
    #include “I2Cdev.h”
    #include “MPU6050.h”
    MPU6050 mpu;
    int16_t ax, ay, az;
    int16_t gx, gy, gz;
    int ledpin = 8;
    int gyro_value;
    int buzzerpin = 12;
    int motor_value;
    void setup()
    {
    Wire.begin();
    Serial.begin(38400);
    pinMode(buzzerpin, OUTPUT);
    pinMode(ledpin, OUTPUT);
    Serial.println(“Initialize MPU”);
    mpu.initialize();
    Serial.println(mpu.testConnection() ? “Bağlandi” : “Bağlanmadi”);
    }
    void loop()
    {
    mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
    gyro_value = map(gx, 0, 17000, 0,255);
    motor_value=abs(gyro_value);
    Serial.println(motor_value);
    if(motor_value >150) { digitalWrite(buzzerpin, HIGH); digitalWrite(ledpin,HIGH);}
    delay(100);

    }

    1. Sezgin GÜL

      motor kontrol projesindeki kodda void beep fonksiyonu var. onu ekleyin. buzzer aktif olduğu konumda beep yazın ve parantez içine de bekleme süresi yazın. örnek : beep(50); şeklinde
      bu şekilde pini otomatik high dan low a geçme süresi vererek kesikli aktif olmasını sağlarsın. aynı şekilde ledi de yapabilirsin. Zaten motor kontrol projesinde de o şekilde buzzer kesikli çalışıyor.

      1. Seçkin

        Bunu denedim ama bir kere beep yapıp susuyor, bir daha çalışmıyor.

        1. Seçkin

          While komutu ile çözdüm.

          if(motor_value>400)
          {
          while(1)
          {digitalWrite(buzzerpin, HIGH);
          digitalWrite(ledPin1, HIGH);
          digitalWrite(ledPin2, LOW);
          delay(100);
          digitalWrite(buzzerpin, LOW);
          digitalWrite(ledPin1, LOW);
          digitalWrite(ledPin2, HIGH);
          delay(100);
          }
          }
          }

  30. Seçkin

    hay allah, yanlış yere yazmışım 🙂

    1. Sezgin GÜL

      takıldığınız yer neresi ?

      1. Seçkin

        Hocam; ivme değeri belirli bir değeri aşınca örneğin led yakmak ve buzzer aktive etmek istiyorum. Nasıl bir kodlama yapmam gerekiyor?

        1. Sezgin GÜL

          Önce eksenlerin konumunu almak için şunu yaz >> mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
          Sonra hangi ekseni referans alacaksan map komutu ile değer aralığı belirle. Örneğin;
          gyro_value = map(ax, 0, 17000, 0,255); >> burada x eksenini 0 ile 255 arasında değer çıktı verecektir. Bu değerler arasında koşul yapıp led veya buzzer kontrol edebilirsin. Örnek olarak buradaki projeye bakabilirsin. http://www.robimek.com/arduino-alarm-sistemli-dc-motor-hiz-kontrolu-projesi/

          1. SEÇKİN

            Peki burada ax, ay, az eksenel açı değişimlerini gx, gy, gz de ivme değişimlerini mi ifade ediyor? Mesela ivme değişim girdileride mi 0 – 17000 arasında değişiyor?
            Sizin verdiğiniz çalışma örneğine baktığım zaman açıdaki değişimlere göre motor hızı artıyor veya azalıyor, sonra da bipper ötüyor.
            Ben bunu bir çarpma-darbe etkisi ile aktive olacak hale getireceğim. Yani bu durumda gx, gy veya gz değerlerinden bir tanesi belli bir sınır değeri aşınca buzzer aktive olacak şekilde kod yazacağım. Doğru mu?

          2. Sezgin GÜL

            ax,ay,az olan ivme, gx,gy,gz olan da gyro değerini ölçer. Sizin yapacağınız sistem de o projedeki kodla aynı mantıkta olacak. Bir veya iki eksendeki değeri referans alarak sistemi tetikleyebilirsiniz.

  31. Seçkin

    Merhaba;
    Ben tüm yazılanları okudum, tüm kütüphaneleri tekrar tekrar yükledim, restart yaptım ama çalışmıyor.
    Yardımcı olabilir misiniz?

    Arduino: 1.6.5 (Windows 7), Board: “Arduino/Genuino Uno”

    Build options changed, rebuilding all

    accelerometer_servo_kontrolu__gimbal_:2: error: #include expects “FILENAME” or
    accelerometer_servo_kontrolu__gimbal_:3: error: #include expects “FILENAME” or
    accelerometer_servo_kontrolu__gimbal_:4: error: #include expects “FILENAME” or
    accelerometer_servo_kontrolu__gimbal_:5: error: #include expects “FILENAME” or
    accelerometer_servo_kontrolu__gimbal_:7: error: ‘MPU6050’ does not name a type
    accelerometer_servo_kontrolu__gimbal_:8: error: ‘Servo’ does not name a type
    accelerometer_servo_kontrolu__gimbal_.ino: In function ‘void setup()’:
    accelerometer_servo_kontrolu__gimbal_:19: error: ‘ACC_GYR’ was not declared in this scope
    accelerometer_servo_kontrolu__gimbal_:23: error: ‘S_K’ was not declared in this scope
    accelerometer_servo_kontrolu__gimbal_.ino: In function ‘void loop()’:
    accelerometer_servo_kontrolu__gimbal_:29: error: ‘ACC_GYR’ was not declared in this scope
    accelerometer_servo_kontrolu__gimbal_:35: error: ‘S_K’ was not declared in this scope
    #include expects “FILENAME” or

    This report would have more information with
    “Show verbose output during compilation”
    enabled in File > Preferences.

  32. Asude

    İyi günler. Ben sadece ax,ay,az değerlerini almak istiyorum fakat kodu düzenleyemedim. accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); bu kısımda hata veriyor. Burayı nasıl değiştirebilirim .

    1. Sezgin GÜL

      buradaki projede ax değerini kullandım http://www.robimek.com/arduino-alarm-sistemli-dc-motor-hiz-kontrolu-projesi/
      aynı şekilde ay ve az değerlerini de alabilirsin

  33. mesut pişkin

    iyi günler ben kütüphanleri indirdim ve kurdum ancak verdiğiniz kodu yapıştırınca hata veriyor MPU6050.h dosyasından ?

    1. Sezgin GÜL

      kütüphaneyi ekledikten sonra arduino programını kapatıp tekrardan açtınız mı ? Ya da arduino program sürümünüz güncel olmadığından kaynaklı olabilir.

      1. mesut pişkin

        evet yaptım arduino sürümüde güncel ama olmuyor mpu6050.h dosyasında bi değişiklik yapılacakmı ?

        1. Sezgin GÜL

          hayır değişiklik yapılmayacak. ı2c kütüphanesini eklediniz mi ?

  34. Alparslan Dinçer

    Bu üründen 2 adet aynı arduino üzerinden nasıl kullanabiliriz peki ?

    1. Sezgin GÜL

      Aşağıdaki gibi adreslerini tanımla ve diğer fonksiyonlarda da bu tanıma göre iki gyronun fonksiyonlarını ekle . Kesme pinleri olan bir gyronun int pinini 2. dijital pine diğer gyronun int pinini de 3.dijital pine tak. sda scl gnd ve vcc pinlerini de arduinonun standart pinlerine tak ikisinin de pin bağlantıları aynı olacak sadece int pinleri farklı olacak.
      MPU6050 mpu_1(0x68); //birinci gyro
      MPU6050 mpu_2(0x69); // ikinci gyro
      Örnek kod buradan indir >> http://www.robimek.com/wp-content/uploads/2-mpu6050-ile-arduino-kod.txt

      1. serhat

        verdiğiniz kodda sıkıntı yaşadım acaba devre şemasınıda gösterebilirmisiniz ? kod çalışıyor ama interapt için bekleyin yazıyor serial ekranda ve öyle kalıyor.

        1. İhsan

          0x69 adresli olmasını istediğiniz sensörün AD0 pinine 3.3 v vermelisiniz.

  35. Suat

    Gerekli kütüphane eklendei ve bağlantılar doğru yapıldı ama serial monitörde değişik işretler çıkıyor.

    1. Sezgin GÜL

      serial port ekranını açtığında sağ alt kısımda baudrate değeri var oradan koddaki baudrate değerini seçmen lazım yani 38400 değerini seçeceksin. İletişim hızları farklı olduğundan veri alımları sırasında çakışmalar yaşanır bundan kaynaklı olarak da ekranda değişik karakterler görürsün.

      1. Suat

        Teşekkür ederim düzeldi. Bu sensörle ilgili uygulamalar gelecek mi?

        1. Sezgin GÜL

          sitede birkaç proje mevcut yenileri de eklenecek yakında