MPU6050 ivme Ve Gyro Sensörü Kullanımı
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.
Merhaba,
Aynı arduino ya bu sensörden 2 adet bağlamam gerekiyor. Bu mümkün mü? Kodlama kısmında neleri değiştirmem gerekiyor?
Visitor Rating: 5 Stars
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
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.
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.
Visitor Rating: 4 Stars
kolay gelsin öncelikle ben mpu 6050 ile 3 eksen ile 3 motor yönetmek istiyorum yardımcı olablirseniz sevinirim
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.
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)
Visitor Rating: 4 Stars
i2c dev kütüphanesini de ekleyebilir misiniz?
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?
Visitor Rating: 2 Stars
Visitor Rating: 5 Stars
i2c dev kütüphanesini nerden yükleyebilirim
İ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
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.
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.
Bende de vardı aynı sorun ben breadboarda tam olarak yapıştırma sensörün üstündeki led aydınlık yanması gerekiyor breadboard da yukarı doğru çek ışık aydınlık olana kadar
ı2c kütüphananesi mpu6050 içinde bulunmuyor
Visitor Rating: 1 Stars
Visitor Rating: 5 Stars
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
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.
iyi günler ı2cdev.h kutuphanesını nerden bulabılırım
I2Cdev.h MPU6050 kütüphanesinin içinde bulunuyor ayrı indirmenize gerek yok.
öyle bişey yoğ
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 ?
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.
iyi günler mpu 9150 kullanarak sensörü kac metre hareket ettirdigimi bulmam gerekiyor bi fikriniz var mı bu konuda
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.
barissamanci.net/Makale/26/accelerometer-gyroscope-imu-nedir/
bu linke bakarsanız mantığı hakkında bilgi sahibi olabilirsiniz
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.
I2Cdev.h kütüphanesini eklemediğiniz için hata vermiş
Hocam ben ekledimkütüphaneyi ama yanlış eklemiş olabilirim
Merhabalar,
Aynı kodu tiva c serisi mikrokontrolcülerle de kullanabilir miyiz?
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);
}
mpu6050 ile Digital su terazisi yapılabılırmı yoksa adxl335 mi kulanmak zorundayız yardımıcı olursanız cok sevinirim
ikisini de kullanabilirsiniz
Merhaba; videodaki processing uygulamaya nasıl ulaşabilirim.
Ç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);
}
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.
Bunu denedim ama bir kere beep yapıp susuyor, bir daha çalışmıyor.
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);
}
}
}
hay allah, yanlış yere yazmışım 🙂
takıldığınız yer neresi ?
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?
Ö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/
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?
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.
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.
İ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 .
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
iyi günler ben kütüphanleri indirdim ve kurdum ancak verdiğiniz kodu yapıştırınca hata veriyor MPU6050.h dosyasından ?
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.
evet yaptım arduino sürümüde güncel ama olmuyor mpu6050.h dosyasında bi değişiklik yapılacakmı ?
hayır değişiklik yapılmayacak. ı2c kütüphanesini eklediniz mi ?
Bu üründen 2 adet aynı arduino üzerinden nasıl kullanabiliriz peki ?
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
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.
0x69 adresli olmasını istediğiniz sensörün AD0 pinine 3.3 v vermelisiniz.
Gerekli kütüphane eklendei ve bağlantılar doğru yapıldı ama serial monitörde değişik işretler çıkıyor.
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.
Teşekkür ederim düzeldi. Bu sensörle ilgili uygulamalar gelecek mi?
sitede birkaç proje mevcut yenileri de eklenecek yakında