20 Mart 2016 Pazar

Arduino MPU6050 Örnek ve Kullanımı (Gyroscope ve Accelerometer) [Arduino MPU6050 example code] [Arduino MPU6050 connection]


Ardunio MPU6050 Örnek kullanımı:
Okulda klüpte yarışmalara katılmak için Murat arkadşımla Kendini dengeleyen robot yapmaya karar verdik. Malzeme ve robot için neler gerekli araştırdık sonuç olarak, MPU6050 Gyroscope ve Accelerometer  sensörünü kullanmaya karar verdik. Şu an şase tasarımı yapıyoruz bu arada da ilk önce MPU6050  sensörünü denedik. Gelen açı ve ivme değerlerini okuduk ve motorlara pwm değerini gönderdik.
 Sensörün kullanımına yönelik örnek kod araştırması yapınca birçok sitede yabancı kaynaklardan alınmış örnekler bulduk açıklayıcı ve çalışan kod örneği çok azdı, biz de bu çalıştırdığımız kodların hepsine açıklama satırı yazarak paylaşma gereği duyduk.

Sadece x ekseninde açı değerini ve x ekseninde ivme değerini okuduk.
Motorlara gelen  0-17000 aralığındaki değerleri 0-255 arasında oranlayıp motora pwm değeri gönderdik.
Şu an yapım aşamasındayız eksiklerimiz var fakat çalışmalarımız devam ediyor.

Örnek kodlar:



//**************Harun Doğan********\\\\
//**************Murat Yazar ********\\\\
#include "Wire.h"
#include "I2Cdev.h" // kütüphaneler eklendi
#include "MPU6050.h"

MPU6050 mpu;
int16_t ax, ay, az; // açı ve ivme değişkendleri tanımlanıyor
int16_t gx, gy, gz;
int motorA9 = 9;  //9 pin alarlandı  motor pwm çıkışı
int motorB10 = 10; // motor b 10. pin pwm
int olcmesikligi = 10;
int aci, ivme;   //gyro ve motor değişkenleri tanımlanıyor
int motoraaci, motoraivme; // motora gidecek pwm değişkenleri
int motorA1pin2 = 2;
int motorA2pin3 = 3;     //************
int motorB1pin4 = 4;     // motor yön kontrolu için pinler
int motorB2pin7 = 7;

void setup()
{
  pinMode(motorA1pin2, OUTPUT);  // pinler çıkış olarak belirlendi
  pinMode(motorA2pin3, OUTPUT);  //motoru bu pinlerden sürüyorum
  pinMode(motorB1pin4, OUTPUT);
  pinMode(motorB2pin7, OUTPUT);

  Wire.begin();
  Serial.begin(38400); // haberleşme başlatma bautrate hızı
  Serial.println("****BAUDRATE=38400*** ");
  Serial.println("****Initialize MPU****");
  mpu.initialize();
  Serial.println(mpu.testConnection() ? "****Baglandi" : "****Baglanmadi");
  delay(10);
}

void loop()
{
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  aci = map(ax, 0, 17000, 0, 255);
  ivme = map(gx, 0, 17000, 0, 255) ;
  // açı ve ivme değeleri 0-255 skalasına göre ayarlandı
  //son değerler 0 ile 90 derece arasını gösteriyor
  // burdaki değerlerin 255 olması motora
  //  0-255 arası değerler göndermek için (pwm 0-255 aralığında 8 bit)

if(aci<0)
{
  geri(); // gelen açı negatifse geri git
}

if(aci>0)
{
  ileri();// gelen açı pozitifse ileri git
}

if(aci==0)
{
  sabit_dur(); // buraya gerek yok ama yine de yazmak istedik:)
}


  motoraaci = abs(aci); // mutlak değer almasını sebebi
  motoraivme = abs(ivme); //PWMde motora -eksi değer gidemez

  // serial monitor de yazı kısmı*****
  Serial.print("               ");
  Serial.println("ivme   aci");
  Serial.print("                ");
  Serial.print(ivme);
  Serial.print("      ");
  Serial.println(aci);
  //***********            
motoraaci=motoraaci*5;  //çok küçük açı değerlerinde motora gelen
        //  PWM değerleri az geliyordu biz de
        // motorun daha iyi tepki vermesi için 5 ile çarptık  

  analogWrite(motorA9, motoraaci);
  analogWrite(motorB10, motoraivme);
  delay(olcmesikligi); // motora açı ve ivmeler den gelen 0-255 arası değerler
  //motora gönderildi

}

//*********** FONKSİYONLAR*****
void ileri()
{
   // motorun İLERİ yönü için pin2 ve pin 4 HİGH oldu
  //pin 3 ve pin 7 LOW oldu
  digitalWrite(motorA1pin2, HIGH);
  digitalWrite(motorA2pin3, LOW);
  digitalWrite(motorB1pin4, HIGH);
  digitalWrite(motorB2pin7, LOW);
}

void geri()
{
// motorun GERİ yönü için pin3 ve pin 7 HİGH oldu
  //pin 2 ve pin 4 LOW oldu
  digitalWrite(motorA1pin2, LOW);
  digitalWrite(motorA2pin3, HIGH);
  digitalWrite(motorB1pin4, LOW);
  digitalWrite(motorB2pin7, HIGH);
}

void sabit_dur()
{
  // motorun GERİ yönü için pin3 ve pin 7 HİGH oldu
  //pin 2 ve pin 4 LOW oldu
  digitalWrite(motorA1pin2, LOW);
  digitalWrite(motorA2pin3, LOW);
  digitalWrite(motorB1pin4, LOW);
  digitalWrite(motorB2pin7, LOW);
}


/*
  //********denemek için motorlara pwm gönderiliyor**********
  analogWrite(motorA9, 5);
  delay(300);
  analogWrite(motorA9, 50);
  delay(300);
  analogWrite(motorA9, 150);
  delay(300);
  analogWrite(motorA9, 250);
  delay(300);
  //**********************
*/
//*********************************
//**********************************



Kodlar bu kadar olabildiğince az satırda kod yazmaya çalıştık.

Arduino ve MPU6050 donanımsal bağlantı şeması:


Arduino MPU6050 connection



Herhangi bir soruda yazabilirsiniz veya mail atabilirsiniz.
Murat Yazar & Harun Doğan

1 yorum:

  1. yazılımınızı denedim cok kararlı ve güzel calışıyor selamlar

    YanıtlaSil