Gyro+Accelerometer-2

Yayınlandı: 29 Haziran 2015 / İncelemeler
Etiketler:, , , , , , ,

MPU_6050   Bir önceki yazımızda türünün ilk örneklerinden olan LPR560AL (2 Eksen Gyro) kullanarak birşeyler yapmaya çalışmıştık.  Bu sefer Ivensense firmasının MPU6050 sensörünü kullanarak  bir deney daha yaptım. MPU-6050 6DOF bir IMU.  İçerisinde 3 eksen gyro ve 3 eksen accelerometer ve bunlara ek  olarak bir de sıcaklık sensörü barındırıyor. I2C arabirimi kullanıyor ve eğer istenilirse dışarıdan magnetometer gibi harici sensörler de bağlanabiliyor.  İçerisinde barındırdığı gyro ±250 ±500 ±1000 ±2000 °/saniye hızlarındaki kademelerde açı değişimlerini ölçebiliyor. Accelerometer ise 2g/4g/8g/16g kademelerinde kuvvetleri tespit edebiliyor.  Sensör’ün maksimum çalışma voltajı 3.46V, boyutları ise 4x4x0.9 mm. Çalışabilmek için çok az  harici elemana ihtiyaç duyuyor.  Sensörün özelliklerini detaylıca incelemek için buraya tıklayabilirsiniz.

GY-521_1

Benim kullandığım sensör piyasada bolca bulunan GY-521 kodlu board üzerine yerleştirilmiş olandı.  Piyasadaki popülaritesinin arduino kütüphanelerine bağlı olduğunu ise anlamam uzun sürmedi çünkü arduino dışında örnek kod bulmak kolay olmuyor.  Ben de oturup registerlarını tek tek inceleyerek kod yazmaya başladım. İlk başta  bana pek yüz vermese de register haritasının derinliklerine inip ufak ayrıntıları da yakalayınca sensörle merhabalaşmayı becerebildim. Sensörle  iletişimimiz zaman ilerledikçe güçlendi. Sonucu merak ettiyseniz aşağıdaki videoyu izleyebilirsiniz.

yorum
  1. Fethi dedi ki:

    Hocam artık kodları paylaşmıyorsunuz galiba?

    • mikrodunya dedi ki:

      Kodlar çorba gibi oldugu icin paylasmadim. Duzenlemeye de vaktim olmadı.

      • Fethi dedi ki:

        Bende MPU6050 elinizdeki sensörün aynısı varda hocam bir türlü kullanmadım sanırım adresleri yanlış tanımlıyorum. O yüzden merak etmiştim. Yayınlarsanızda şimdiden teşekkür ederim 🙂

  2. Furkan dedi ki:

    Merhaba,

    Hocam sizin ilgilendiğiniz bir konu üzerine danışağım, sanırım size ait bir kod bloğu ,

    /////////////////////////////////////////////////////
    // //
    //STM32F4 DISCOVERY Üzerindeki LIS302DL ivme //
    // sensöründen veri okuyan ve kartın eğimi //
    // yönündeki ledi yakan program. //
    // LukeSkywalker //
    /////////////////////////////////////////////////////

    #define ChipSelect GPIOE_ODR.f3 // Chip select olarak GPIOE’nin 3. bitini kullan.

    char okunan;
    signed char xi,yi,zi;

    void main() {
    RCC_AHB1ENR |= 0x0000001F; // GPIO A,B,C,D,E clock’u aktif edelim //A ve D portlarına clock veriliyor.
    GPIOE_MODER = 0x00000040; // GPIOE nin 3 nolu pini cikis tanimlandi
    GPIOE_OSPEEDR= 0xFFFFFFFF; // GPIOE nin tum cikislari en yuksek hizda kullanacagiz
    ChipSelect =1; // GPIOE3=1; LIS302DL ChipSelect=1
    GPIOD_MODER=0x55000000;//D portunun 12,13,14,15 pinleri çıkış
    GPIOD_OSPEEDR=0;//giriş çıkış hızları en düşükte (2MHZ)
    for(xi=0;xi20)GPIOD_ODR.f15=1; else GPIOD_ODR.f15=0; // X ekseni 0.35G’den büyükse ledi yak değilse söndür
    if(xi20)GPIOD_ODR.f14=1; else GPIOD_ODR.f14=0; // Y ekseni 0.35G’den büyükse ledi yak değilse söndür
    if(yi<-20)GPIOD_ODR.f12=1; else GPIOD_ODR.f12=0;// Y ekseni -0.35G'den küçükse ledi yak değilse söndür
    }
    }
    }
    }

    Aldığım hatalar

    char TFT_DataPort at LATE;
    sbit TFT_RST at LATC1_bit;
    sbit TFT_BLED at LATA9_bit;
    sbit TFT_RS at LATB15_bit;
    sbit TFT_CS at LATF12_bit;
    sbit TFT_RD at LATD5_bit;
    sbit TFT_WR at LATD4_bit;
    char TFT_DataPort_Direction at TRISE;
    sbit TFT_RST_Direction at TRISC1_bit;
    sbit TFT_BLED_Direction at TRISA9_bit;
    sbit TFT_RS_Direction at TRISB15_bit;
    sbit TFT_CS_Direction at TRISF12_bit;
    sbit TFT_RD_Direction at TRISD5_bit;
    sbit TFT_WR_Direction at TRISD4_bit;

    bu uygulamayı nasıl yapabilirim ?

    • mikrodunya dedi ki:

      Bu kod bana ait fakat nerede paylaştığımı unutmuş olmakla beraber, kodda bu haliyle pek çok eksik nokta bulunmakta.
      Yine de aldığınız hataların alakasız kütüphanelerin seçilmiş olmasıyla alakalı olduğunu söyleyebilirim. Kullanmadığınız kütüphaneleri, library managerda pasif hale getirirseniz çalışmalı.

      • thehighvoltage dedi ki:

        Yabancı sitelerde araştırmalarıma devam ederken sizin olduğunu düşündüğüm yorumlara rastladım, yaklaşık saattir sadece bunun üzerine araştırma yapıyorum .. Ayrıca altaş yayıncılık kitabında ki yazılımla beraber bu kanıya vardım. Benim kulllandımğım kart STM32F4 MB997C . Bunun A,B, C versiyonlarında farklılık gösterme durumu var mıdır ?

        Frekans olarak 168Mhz de mi çalışılmalı ve load schematic den, 16Mhz dahili osilator ekliyorum. Kullanılan kütüphaneler hangileri acaba diğerleri kapatayım ..

        Kodda ilk for döngüsü çalışıyor yani led aynı anda 5 kere yanıp sönüyor. Fakat, sensör için yazılı olan if döngülerine giremedi.

        Teşekkür ederim ilgiliz için, iyi çalışmalar.

      • mikrodunya dedi ki:

        Kitin C versiyonunda farkli bir accelerometer kullanilmis. Kitaptaki kodda c versiyonuna gore duzenlenmisti. Spi kutuphanesini kullanmaniz yeterli.

  3. emin dedi ki:

    stewart platform için hangi sensör gerekli yardımcı olabilirmisiniz? birde

  4. thehighvoltagen dedi ki:

    /////////////////////////////////////////////////////
    // //
    //STM32F4 DISCOVERY Üzerindeki LIS302DL ivme //
    // sensöründen veri okuyan ve kartın eğimi //
    // yönündeki ledi yakan program. //
    // LukeSkywalker //
    /////////////////////////////////////////////////////

    #define ChipSelect GPIOE_ODR.f3 // Chip select olarak GPIOE’nin 3. bitini kullan.

    char okunan=0;
    signed char xi=0,yi=0,zi=0;

    void main() {
    GPIO_Digital_Output(&GPIOE_ODR,_GPIO_PINMASK_3|_GPIO_PINMASK_9); //ChipSelect pini çıkış yap
    GPIOE_ODR.B9=0; //R/W pini şaseye çekiliyor.
    ChipSelect =1; // GPIOE3=1; LIS302DL ChipSelect=1

    RCC_AHB1ENR |= 0x0000001F; // GPIO A,B,C,D,E clock’u aktif edelim //A ve D portlarına clock veriliyor.
    GPIOE_MODER = 0x00000040; // GPIOE nin 3 nolu pini cikis tanimlandi
    GPIOE_OSPEEDR= 0xFFFFFFFF; // GPIOE nin tum cikislari en yuksek hizda kullanacagiz

    GPIOD_MODER=0x55000000;//D portunun 12,13,14,15 pinleri çıkış
    GPIOD_OSPEEDR=0;//giriş çıkış hızları en düşükte (2MHZ)

    for(xi=0;xi20)GPIOD_ODR.f15=1; else GPIOD_ODR.f15=1; // X ekseni 0.35G’den büyükse ledi yak değilse söndür
    if(xi20)GPIOD_ODR.f14=1; else GPIOD_ODR.f14=1; // Y ekseni 0.35G’den büyükse ledi yak değilse söndür
    if(yi<-20)GPIOD_ODR.f12=1; else GPIOD_ODR.f12=1;// Y ekseni -0.35G'den küçükse ledi yak değilse söndür
    }
    }
    }
    }

    Hocam yazılımı düzenled,m. Kitapta ki satırlarıda ekledim Ve her SPI_Write satırını SPI1_Write olarak değiştirdim. Kütüphanelerin hepsini kapattım sadece SPI kütüphanesi aktif. Frekans olarak dahili 16Mhz ayarladım. Karta yükleniyor program çalışmasını kontrol etmek amaçla yazılılan ilk for döngüsü çalışıyor 4 led aynı anda yanıp sönüyor 5 defa. Fakat ivme sensörünün hala çalışmasını gözlemleyemedim. Yazılımda eksiklikler var mı veya bu durumları nasıl düzeltebilirim ?

    Saygılar hocam, iyi çalışmalar.

    • thehighvoltagen dedi ki:

      Üstteki yorumda eski yazılımı koymuşum güncel olarak aşağıda ki ,

      /////////////////////////////////////////////////////
      // //
      //STM32F4 DISCOVERY Üzerindeki LIS302DL ivme //
      // sensöründen veri okuyan ve kartın eğimi //
      // yönündeki ledi yakan program. //
      // LukeSkywalker //
      /////////////////////////////////////////////////////

      #define ChipSelect GPIOE_ODR.f3 // Chip select olarak GPIOE’nin 3. bitini kullan.

      char okunan=0;
      signed char xi=0,yi=0,zi=0;

      void main() {
      GPIO_Digital_Output(&GPIOE_ODR,_GPIO_PINMASK_3|_GPIO_PINMASK_9); //ChipSelect pini çıkış yap
      GPIOE_ODR.B9=0; //R/W pini şaseye çekiliyor.
      ChipSelect =1; // GPIOE3=1; LIS302DL ChipSelect=1

      RCC_AHB1ENR |= 0x0000001F; // GPIO A,B,C,D,E clock’u aktif edelim //A ve D portlarına clock veriliyor.
      GPIOE_MODER = 0x00000040; // GPIOE nin 3 nolu pini cikis tanimlandi
      GPIOE_OSPEEDR= 0xFFFFFFFF; // GPIOE nin tum cikislari en yuksek hizda kullanacagiz

      GPIOD_MODER=0x55000000;//D portunun 12,13,14,15 pinleri çıkış
      GPIOD_OSPEEDR=0;//giriş çıkış hızları en düşükte (2MHZ)

      for(xi=0;xi20)GPIOD_ODR.f15=1; else GPIOD_ODR.f15=1; // X ekseni 0.35G’den büyükse ledi yak değilse söndür
      if(xi20)GPIOD_ODR.f14=1; else GPIOD_ODR.f14=1; // Y ekseni 0.35G’den büyükse ledi yak değilse söndür
      if(yi<-20)GPIOD_ODR.f12=1; else GPIOD_ODR.f12=1;// Y ekseni -0.35G'den küçükse ledi yak değilse söndür
      }
      }
      }
      }

      • thehighvoltagen dedi ki:

        Programın satır satır kontrolümü sağladığımda sensörün aktifleşmesinde sıkıntı olduğunu saptadım. Yani şu döngüye girmiyor .

        if(okunan==0x3B)//Eğer Sensöre ulaşıldıysa
        {
        ChipSelect=0; //Çip aktif
        SPI1_Write(0x20); //Ayar registerına git CTRL_REG1
        SPI1_Write(0x47); // 100Hz/2g/ olarak ayarla..
        ChipSelect=1; //Çip Pasif }

      • mikrodunya dedi ki:

        if(okunan==0x3F) yazınız.

  5. thehighvoltagen dedi ki:

    Hocam kopyaladığım yazılım düzgün olarak yapışmıyor. Mail olarak atsam size olur mu ?

  6. João Gustavo dedi ki:

    Merhaba mikroC compilaro kullanıyorum, Ben MPU6050 ile iletişim ve onun gyroscópio değerlerini almak istiyorum bir PIC18F4550 kullanıyorum, iletişim güçlükleri ile beraberim, ama benim LCD ekranda aynı bilgilerin herhangi göstermiyor, sen bana yardım edebilirsin.
    Teşekkür ve büyük iş.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s