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 (https://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ı?
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.hobbytronics.co.uk/accelerometer-info)
http://www.barissamanci.net/Makale/26/accelerometer-gyroscope-imu-nedir/ (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);
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.
Hocam tip dönüşümü yapsanız sorun hallolur diye düşünüyorum.
sqrt(1.0*y*y);
Bu olabilir mi?
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.
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?
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.
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
(http://farm3.staticflickr.com/2827/12257663885_a76066b835_o.jpg)
Sanırım durum ambar7 nin açıkladığı gibi.
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.
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ı?
arc tanjant
ayrıca meftun, math i kullanacaksan gcc de, coide de "m" i eklemen gerekir
(http://www.coocox.org/userfiles/add%20math.JPG)
http://www.coocox.org/forum/topic.php?id=1040 (http://www.coocox.org/forum/topic.php?id=1040)
açılara gelince
The Aerospace Euler Angles (http://www.youtube.com/watch?v=UpSMNYTVqQI#ws)
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)
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 (http://www.biopac.com/manuals/app_pdf/app273.pdf)