LIS302DL3 axis accelerometer açı sorunu

Başlatan Gökhan BEKEN, 16 Temmuz 2014, 02:20:03

Gökhan BEKEN

Bülent hocanın, bu örneğini, sonuçları seri porttan görecek şekilde kullandım.
www.picproje.org/index.php/topic,35896.msg262643.html#msg262643
Değerler 0 ila 255 arasında değişiyor. Bana açı değeri gerekiyor, yani x'in 0 ila 360 arasındaki gerçek açı değerleri lazım. Oran orantı ile yapmak yerine daha işe yarar bir yöntem var mı?
Özel mesaj okumuyorum, lütfen göndermeyin.

kantirici

#1
Hocam gelen ham verileri basit bir formülasyon ile açı ya dönüştürmek mümkün.

http://www.hobbytronics.co.uk/accelerometer-info

http://www.barissamanci.net/Makale/26/accelerometer-gyroscope-imu-nedir/

Xangle = (Math.atan(Xaxis / Math.sqrt((Yaxis * Yaxis) + (Zaxis * Zaxis))) * 180) / Math.PI;
			Xangle = Math.round(Xangle);

Gökhan BEKEN

Hocam
sqrt(y * y);
komutu işlemiyor, double türünde parametre alıyor bu fonksiyon. Oysa benim ham verilerim unsigned char türünde.
Özel mesaj okumuyorum, lütfen göndermeyin.

kantirici

Hocam tip dönüşümü yapsanız   sorun hallolur diye düşünüyorum.

mir_as82


Gökhan BEKEN

#5
denex = sqrt(4); yapınca sorun yok.

@mir_as82  o da olmadı,
denex değişkeninin türünü double yaptım, çünkü dönen değer double
denex = sqrt((double) y); yaptım yine olmadı,
verdiği hata çok garip. "undefined reference to `sqrt'" diyor

denex = sqrt(denex); bile yaptım aynı hatayı veriyor.
Bu arada COOCOX ile oldu bunlar, keil'da hiç denemedim.
Özel mesaj okumuyorum, lütfen göndermeyin.

Gökhan BEKEN

Alıntı yapılan: kantirici - 16 Temmuz 2014, 02:26:52
Xangle = (Math.atan(Xaxis / Math.sqrt((Yaxis * Yaxis) + (Zaxis * Zaxis))) * 180) / Math.PI;
			Xangle = Math.round(Xangle);

Bu formülde anlamadığım birşeyler var. Neden x açısını bulmak için x ham verisinin dışında, y ham verisi ve z ham verisini işin içine katıyoruz?
Özel mesaj okumuyorum, lütfen göndermeyin.

Kabil ATICI

Sanırım burada X eksenini harekete paralel olduğu ve Y ile Z eksenlerinin x ekseni etrafında döndüğü esasına göre hesaplanıyor. X ekseni etrafında  dönerse Y değeri değişir onun için Y değeri harekete paralel olma durumuna göre hesabı dengelemeye çalışıyor.

Basitçe X ekseni boyunca Y dönerse y değeri daha küçük olur. (vektörel olarak) Tam değerini bulmak için
Z değerini hesaba katmak gerekir.
X ekseni düz olduğ varsayılıyor. Normalde X eksenine göre de kayma olabilir, ama hesaplar çok karışır.
ambar7

Mucit23

Alıntı yapılan: meftun - 17 Temmuz 2014, 13:22:36
Bu formülde anlamadığım birşeyler var. Neden x açısını bulmak için x ham verisinin dışında, y ham verisi ve z ham verisini işin içine katıyoruz?

@Meftun formül öyle aslında


Sanırım durum ambar7 nin açıkladığı gibi.

Kabil ATICI

Xaxis ile Z axis parantez için neden aynı? Z axis için en azından X ile Z'nin yerinin değişmesini beklerdim.
ambar7

Gökhan BEKEN

45 derece kendime doğru eğdiğim zaman:
x=10, y=37, z=37
-----------------------------------------
45 derece karşıya doğru eğdiğim zaman:
x=7, y=223, z=41
-----------------------------------------
boşta dururken:
x=0, y=0, z=52
-----------------------------------------
45 derece sağa doğru eğdiğim zaman:
x=223, y=0, z=39
-----------------------------------------
45 derece sola doğru eğdiğim zaman:
x=35, y=0, z=43
-----------------------------------------
90 derece sola doğru eğdiğim zaman:
x=60, y=0, z=0
-----------------------------------------
90 derece sola doğru eğdiğim zaman:
x=202, y=0, z=0
-----------------------------------------
boştayken ve ters durumdayken
x=0, y=0, z=195
-----------------------------------------
90 derece karşıya doğru eğdiğim zaman:
x=0, y=202, z=0
-----------------------------------------
90 derece kendime doğru eğdiğim zaman:
x=0, y=55, z=0
-----------------------------------------

c deki "atan" fonksiyonun windows hesap makinesindeki karşılığı sanırım, derece kısmındaki "tanh" işlemi. Doğru mudur?


Alıntı YapBir programda math.h kütüphanesi kullanılacakca, GCC derleyicisi -lm seçeneği ile birlikte kullanılmalıdır.
    Örneğin test.c içinde math.h'i kullanıyorsa derleme:    gcc -lm test.c -o test

    şeklinde yapılmalıdır. Aksi halde bir hata mesajı ile karşılaşılır.
Şeklinde yorumlar gördüm, coocox ta bu ayarı yapamadım nasıl yapıldığını bilen var mı?
Özel mesaj okumuyorum, lütfen göndermeyin.

muhittin_kaplan

#11
arc tanjant
ayrıca meftun, math i kullanacaksan gcc de, coide de "m" i eklemen gerekir



http://www.coocox.org/forum/topic.php?id=1040

açılara gelince

The Aerospace Euler Angles

fahri-

Alıntı yapılan: meftun - 23 Temmuz 2014, 04:14:11

c deki "atan" fonksiyonun windows hesap makinesindeki karşılığı sanırım, derece kısmındaki "tanh" işlemi. Doğru mudur?



Yanlış hocam. "tanh" tanjant hiperbolik demektir. atan karşılığı : inv tan  dır (tanjant üzeri -1)

Gökhan BEKEN

Teşekkürler Muhittin hocam, math.h sorunu düzeldi.

projeyi nihayet derledikten sonra, aşağıdaki şekilde yazdığım kodlar başarılı olamadı.
x_derece=(atan(x / sqrt((y * y) + (z * z))) * 180) / PI_SAYISI;
			x_derece = round(x_derece);

			y_derece=(atan(y / sqrt((x * x) + (z * z))) * 180) / PI_SAYISI;
			y_derece = round(y_derece);

z_derece=(atan(z / sqrt((y * y) + (z * z))) * 180) / PI_SAYISI;
z_derece = round(z_derece);




cihazı sola doğru x ekseninde eğdiğimde, 0 ila 88 derece arası sonucu başarıyla gösterebiliyor
x ekseninde sağa doğru eğdiğimde, direkt 78 den başlıyor, ve 45 derece sağa eğdikten sonra 90 dereceye doğru biraz daha eğdiğimde cihaz 88 dereceye kadar sonuç üretiyor.

cihazı kendime doğru eğdiğimde y derecesi 75 dereceye kadar doğru gösteriyor
fakat karşıya doğru eğdiğimde 78 dereceden başlıyor, 45 dereceden sonra daha da eğersem 80 ila 83 arası sonuç gösteriyor

formüller mi yanlış ben mi yanlış birşey yapıyorum?

İnternette benzer formüller bulup denedim onlarda yanlış sonuç üretiyor.
Mesela:
x_derece  = atan2(sqrt(y*y + x*x),z)* 180/PI_SAYISI;
y_derece = atan2( sqrt(x*x + z*z), y) * 180/PI_SAYISI;

burdaki formülü de denedim: http://www.biopac.com/manuals/app_pdf/app273.pdf
Özel mesaj okumuyorum, lütfen göndermeyin.