MPU-6050 Accelometre Z değerini okumak ...
  • Merhaba ...

    Mpu-6050 ile Accelometre Z değerini okumak istiyorum, X ve Y değerlerini sensör üzerinde belirtildiği yönde hareket ettirdiğimde doğru olarak okuyabiliyorum. Fakat (sensör kullanma klavuzunda yazdığı üzere) sensörü kendi etrafında döndürerek bu değeri bir türlü stabil okuyamadım ... Değerler ancak çapraz yönlerde döndürdüğümde değişiyor ki bu tutarsız bir hareket gibi geliyor ...

    Farklı bir yol denedim ve Gyro dan Z değeri ile bu işi çözmek istedim, o da yön değerini doğru harekette veriyor fakat hareket durduğunda yine eski değerini alıyor.

    MPU-6050 de Accel Z değerini doğru hareketle okumanın yolu nedir ?

    Teşekkür ederim ...
  • oldugu yerde donerse z deşişmez sanırım. yukarı aşağı harekette z değişir.
  • Bu tarifi linkte bulunan Klavuzun 21nci sayfasının en altondaki bilgiye göre verdim ...

    https://www.cdiweb.com/datasheets/invensense/MPU-6050_DataSheet_V3 4.pdf

    Lütfen incelermisiniz ?
  • Mantık olarak Z eksenini kendi etrafında dönmek olarak tarif ediyor ...
  • inceledim orası polarity of rotation için o dönüş hareketinin içinden bide z vektörü geçiyor yukarı doğru onu kastediyorum ben de ;)
    accelemetre modunda yukarı aşağı gyro modunda oldugu yerde dönüş verisi okuman lazım
  • Öncelikle teşekkür ederim. Size zahmet verdim.

    Lakin; Gyro dan Z değerini söylediğiniz gibi kendi etrafında döndürerek alıyorum, ama hareket durduğunda değer ilk değerine dönüyor.

    Halbuki; accel Z değerini 3d modelleme programında uyguladığımda (örneğin processing) sanal nesne gayet stabil yönleniyor.

    Sanırım biryerde takılıyorum, ama nerede çözemedim.
  • MPU6050 6 DOF bir sensördür. Bunun anlamı 3 eksenli bir ACC( ivme ölçer ), 3 eksenli bir Gyro ( ağim ölçer ) sensörü aynı anda barındırır.
    Sen x y z ekseninde yaptığın açıları öğrenmek istiyorsan Gyro kısmını incelemelisin. Çünkü ivme ölçer dediğimiz sensör değişken hızları temsil etmektedir. x y z ekseninde değişken bir hızın var ise ve sen ivme ölçer kısmına bakıyor isen değerler alırsın fakat hareket durduğunda bu değerler "0" olur.
    Anlattığın kadarıyla sanki z ekseninde gyroya değilde ivme ölçere bakıyormussun gibi geldi. Çünkü tamda dediğin gibi döndürürken değer alırsın, hareket bittiğinde değer ilk değerine döner.
  • aynı sorunu bende yaşıyorum şuan çoğu yerde göremedim dediğiniz gibi her yörünge için 2 değer örneğin x eksenini hareket ettirirken ilk değer normal açısına göre değer alırken 2.değer hızına göre değer alıyo sonra eski haline dönüyor.
    x ve y için açısının değeri okunuyo z eksenin ivmesi okunuyo ama açısı okunmuyo internette en çok dolaşan mpu6050 - proccesing programıyla yapılan projede gayet stabil çalışıyo kendimde denedim proccesing de tarif edilenleri yapınca x y z kalibre ettiğiniz yüzeye göre gayet stabil çalışıyor video linkini paylaşıyorum.


    ((((bu arada projem x y ve z eksenlerine birer servo bağlayıp kontrol etmek aşşağıda linkdeki kodlar x ve y için geçerli aynı şekilde z yide eklersem ivme okunuyo gyro gözükmüyo bildiğim kadarıyla yaptım video daki kodların yüzde 80 nini anlamadım.
    http://s2.dosya.tc/server3/raa08g/gyro_servo_kontrol.rar.html))))


    yardımcı olursanız sevinirim kolay gelsin :)
  • Merhaba.
    Uzun zamandır bende araştırıyorum sizin arzu ettiğiniz şeyi.

    Söyleyebileceklerim şunlar. Bir adet mpu 6050 ile üç ekseni birden kontrol etmeniz zor.

    Benim bulduğum çözüm bir adet 6050 ile x ve y eksenleri okuyarak 2 servo kontrol etmek, bir başka 6050 ile ise Z ekseni okuyarak bir servo kontrol etmek.

    Linkini gönderdiğiniz videoya bir zamanlar çok takılmıştım. Evet, videodaki kodlar ile 3d modelleme
    nesnelerini tamda servolarda yapmayı istediğimiz gibi yönlendirebiliyoruz. Lakin, sanal alemden çıkıp servo bağladığımızda mesele aynı sonucu vermiyor.

    Videodaki kodlardan eğer, euler okuma kodlarını aktif ederseniz ve sensörün kalibrasyonunu ( bu çok zor ve hassar bir ayar) yaparsanız her başlangıçta ve sensör z ekseni hangi yönde olursa olsun 39 dereceli bir rakamla değer okumaya başlayabiliyor ve tam da istediğimiz gibi z eksenini kusursuz okuyor. Fakat burada başka bir sorun gündeme geliyor; o da sensör başlangıç açısından hiç kımıldamasa dahi dünyanın dönüş yönünü hesabın içine kattığı için 1 saatlik çalışmada yaklaşık 5 derecelik değer değişimi gözleniyor.

    Şimdilerde ise mpu-9255 ile magnetometre değeri okuyarak istediğim şeyi yapabilmeye uğraşıyorum.

    Bu da tam sonuç vermez ise elimde kalan en zor çareyi kullanıp z eksenini potansiyometre ile kumanda edeceğim.

    Gelişme olursa buraya tekrar yazarım. Bu arada ihtiyacınız olursa bahsettiğiniz videodaki kodların düzenlediğim halini buraya ekleyebilirim.

    Saygılarımla;
  • tek mpu6050 ile 3 eksende 3 servo motorla kamera stabilizasyon yapabiliyorlar. bahsettiğiniz kadar sıkıntı olmaması lazım. 3 eksenli storm32 gimbal kodlarını inceleyin açık kaynak çünkü.
  • Sevgili Djeep,
    Bahsettiğin iki konu birbirinden tamamen bağımsız bir konu.
    MPU6050 , 6 eksenli bir sensördür ( acc3,gyro3)
    MPU9255 , 9 eksenli bir sensördür ( acc3,gyro3,compass3 )

    burada Gyro ve compass birbirine karıştırılmamalı.
    Gyronun amacı yere göre açısını göstermek,
    Compassın amacı ise Manyetik Kuzey e göre açısını göstermektir.

    Yani, sen gyroyu kalibre edip bir düzleme koyarsan sensörünü, oradaki açılar dünyanın dönüş yönünden hızından bağımsız olacaktır.
    Yalnızca compass bu dediklerinden etkilenir. ( İnternette bolca bilgi var )

    Sonuç olarak mpu6050 yerine mpu9255 alayım z eksenini daha iyi ölçeyim diye birşey söz konusu olamaz.
    MPU6050 de sana çok doğru bir Z eksen bilgisi verir,
    MPU9255 de sana çok doğru bir Z eksen bilgisi verir,
    tek fark ikincisi birincisine göre sana Kuzey kutbu( manyetik kuzey ) nerede onuda söyler.

    Umarım faydalı olmuştur

  • Merhaba değerli okoman hocam ...

    Vakit ayırıp benim gibi acemilere yardımcı olduğunuz için size çok teşekkür ederim ...

    Yukarıda verdiğiniz projeyi inceledim ... Aslında, bizim yaşadığımız (sanırım emremutlu400 de aynı dertten muzdarip) sorun tam olarak gimbal sistemlerinde çözüm olan şey :)

    Gimbal sistemlerde aranan; Sensörün z açısında herhangi bir değişim olduğunda, açıyı değişim olmadan önceki değere geri döndürmek ...

    Benim aradığım şey ise, sensörden okunan z değeri değişime uğradığında servo motor bu değere göre pozisyon alsın ...
  • Değerli ekmekci hocam ...

    okoman hocama bahsettiğim sorundan dolayı, gyrodan olumlu sonuç alamadığım için accel ve magneto dan gelen değerler işimi görürmü diye çalışıyordum ... Yani MPU-9255 sadece compass ilavesi olduğu içindi.

    Ancak; az önce yazdığınız bir cümle (Yani, sen gyroyu kalibre edip bir düzleme koyarsan sensörünü, oradaki açılar dünyanın dönüş yönünden hızından bağımsız olacaktır.)
    sanırım accel e yoğunlaşmak yüzünden yapmayı atladığım birşey,

    Bu gece söylediğiniz şeyi deneyeceğim ...

    Teşekkür ederim...
  • Merhaba emremutlu400 ...

    int ort1x = map(ax, -17000, +17000, -8500, 8500);//değer katsayısı azaltılıp hassaslık düşürülmesi için oran azaltıldı
    int ort1y = map(ay, -17000, +17000, -8500, 8500);
    //Serial.println(az);
    //delay(500);

    int ort2x = map(ort1x, -8500, +8500, -5000, +5000);
    int ort2y = map(ort1y, -8500, +8500, -5000, +5000);

    int isx = map(ort2x, -5000, +5000, 0, +180);//servo açısı için girilen son değer
    int isy = map(ort2y, -5000, +5000, 0, +180);

    Bu kodlarda aradığınız değer aralığını okuyabildiniz mi ? Ve ya hassaslıktan kastettiğiniz şey ne idi tam olarak anlayamadım özür dilerim ...

    Maksat sensörden gelen değerlerin belirli bir aralığını okuyabilmekse Constrain komutu bu iş için daha kolay gibi geliyor ...

    https://www.arduino.cc/en/Reference/Constrain buradan açıklamayı inceleyebilirsiniz ...
  • Djeep merhaba

    öncelikle o 5 derecilik değişimin önemli olduğunu düşünmüyorum çünkü onuda kodlara eklersek sorun ortadan kalkmış olur

    benim değer aralığı dediğim şeyi yapamadım yani -17000 +17000 arasında ki değeri *map* fonksiyonuyla 0 ile 180 derece arasına ayarlayabiliyorum ama hassas oluyo gyro nun ufak değerinin hassasiyetini azaltmaya çalıştım örneğin gyronun tek hareket değeri servoda 0,00529411... gibi açı hareketine tekabul ediyo , bunu ayarlamaya çalıştım ama sonuç değişmedi mesela gyronun +16000 ile 17000 değeri arasında servo şu kadar açı dönsün gibi bi sınırlıma yapmak istedim ama önemli değil şuan Z eksenini hallettikten sonra bunu düşünücem.

    #ifdef OUTPUT_READABLE_YAWPITCHROLL ben bu komuttan umut bekliyorum galiba bizim problemimiz bunla ilgili çok fazla da anlamıyorum mesele yapılabilmesi yapılmamış olsa uğraşmam yapılmış ve hazır kodları var ama kodları anlamadığım sürece biyere varamam

    örnek link;



    şuan bunuyu deneyemedim eğer deneyebilirseniz çözebilceğinizi düşünüyorum

    saygılarımla iyi çalıişmalar :)
  • Bende aynı problemi yaşıyodum internette bazı yabancı sitelere ve videolara baktım bi kod gördüm kod Serial ekrande z eksenini doğru gösteriyo işinize yarayabilir.Kolay gelsin.
    Not:kodu orjinal arduino sitesinde açılan bir konudan aldım.

    #include " Wire.h"
    #include " I2Cdev.h"
    #include " MPU6050.h"
    #include < Servo.h>

    Servo X;
    Servo Y;

    MPU6050 mpu;

    int16_t ax, ay, az;
    int16_t gx, gy, gz;
    float x=0;
    int cx=0;
    float bx=0;
    float rx=0;
    float y=0;
    int cy=0;
    float by=0;
    float ry=0;
    float z=0;
    int cz=0;
    float bz=0;
    float rz=0;
    void setup()
    {
    Wire.begin();
    Serial.begin(9600);

    X.attach(11);
    Y.attach(12);

    Serial.println("Initialize MPU");
    mpu.initialize();
    Serial.println(mpu.testConnection() ? "Connected" : "Connection failed");
    }

    void loop()
    {
    if(millis()<5000){<br /> delay(5000);
    for(int i=0; i<10000; i++){<br /> mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
    bx=bx+gx;
    by=by+gy;
    bz=bz+gz;
    }
    bx=bx/10000;
    by=by/10000;
    bz=bz/10000;
    }

    mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

    x=x+gx-bx;
    y=y+gy-by;
    z=z+gz-bz;
    cx=map(x, -750000, 750000, -90, 90);
    cy=map(y, -750000, 750000, -90, 90);
    cz=map(z, -750000, 750000, -90, 90);
    Serial.print(cx);
    Serial.print(" , ");
    Serial.print(cy);
    Serial.print(" , ");
    Serial.println(cz);
    X.write(cx+90);
    Y.write(cy+90);
    }

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.