"Enter"a basıp içeriğe geçin

Ankakit ile L3G4200D Gyro Okuma

Uzun zamandır bir şeyler yazmıyorum. İçimdeki isteksizlik ve tezimle olan husumetimi kırabildim ve tekrar sahalara döndüm diyebilirim. Ardunio ile başladığım bu serüvene pic ile devam edecekmişim gibi gözüküyor. Zırt pırt tatil olan çin yüzünden hala devrelerimi yollayamadım. Bu yüzden artık bir yerden başlama kararımı hayata geçirdim ve sonunda başladım 😀

gyro_devre

Programı PIC C üzerinde kurgulayacağız. Öncelikle kullanacağımız elemanları tanıyalım.

Ankakit V1.0 (http://emrahbudak.com/2013/02/04/ankakit-2-hafta-2/)

Üzerinde 18F4550 mikro denetleyicisi bulunan naçizane tasarımımdır. USB portu hariç tüm portları dışarıya çıkartılmış ve maksimum 1 amper güç sağlayacak lm2574 regülatörüyle servo kontrol gibi uygulamalarda gerekli enerjiyi gözü kapalı sağlayabiliriz. 7805 ler gibi 12 volttan sonra ısınma yapmaz 24 voltta bile 1Amper çekersiniz. Ra4 pini çıkış olarak verilmemiştir, bir buton bağlanarak kullanılması sağlanmıştır. Bir sonraki versiyonda T0CKI uygulamaları için onuda pin olarak çıkışa koymayı planlıyorum. ayrıca transistörle güçlendirilerek d2 ve d3 pinlerine led bağlanmıştır. (transistörler başka uygulamalarda yükleme etkisi olmaması için bağlanmıştır)
Ayırca ICSP pinleri (b6 ve b7) çıkartılarak mikro denetleyici çıkartılmadan programlanması sağlanmıştır.

HC-05

Kendisi Bluetooth seri port çevirici olur. çok işlevsel ve hayat kurtarır. Kablosuz çalışmak isteyenlere öneririm 🙂 Çok detaya girmeyeceğim çünkü önemli olan gyro 🙂

L3G4200D

SPI ve I2C özelliği olan bir gyrodur. Bu gyroyu tercih etmemin tek bir nedeni var oda kullanmış olduğum 10dof IMU nun içerisinde olması, yoksa başka bir özel nedeni yok. 3 eksende gyro verisi üretmekte. Gyro için ayrıntılı bilgi için burası değil tabi 😀 tam olarak şu oluyor Gyro. Gyro uçaklarda uçağın açısını bulmak için, ya da günümüzde moda olan quadrocopter gibi hava araçlarında sıklıkla kullanılmaktadır.

Peki Gyro ne işe yarar?
Gyro yere göre olan açıyı vermektedir. yani yere göre dikseniz o halde çıkışınız 0, açı küçüldükçe negatife büyüdükçe pozitife doğru değişim göstermektedir. Önemli bir nokta daha var ki o da gyro nun çıkışı değişim bittikten sonra tekrar 0 ‘a düşmesidir. yani hareketsiz dururken 0 değerini veriyorken söz gelimi 15 derelik bir açı yaptınız çıkışınız belli bir değere kadar yükselir ve eğer konumunuzda bir değişme olmazsa tekrar 0’a düşer.

Şimdi birazda yazılımı inceleyelim. Öncelikle L3G4200D gyrosunun veri sayfasında (datasheet) bulunan değişken adreslerini yazıp gerekli okuma ve yazma fonksiyonları hazırlanmalı. İlk kurulumda who i am (kaydedici)registeri okunup bağlı olup olmadığı kontrol edilir. Daha sonra X,Y ve Z registerleri okunarak veriler çekilir.

L3G4200D.h

[php]
//////////////////////////////////////////////////////////////

/* L3G4200D gyro i2c programı */
/* */
/* init_gyro(); okuma işlemi yapabilmek için main */
/* foknsiyonu içerisinde bir kez çağırın */
/* 03.01.2014 Cuma */
/* Düzenleme Emrah BUDAK */
/* */
//////////////////////////////////////////////////////////////

//Output register mapping page 27
//http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00265057.pdf
#define Gyro_Read 0xD3
#define Gyro_Write 0xD2
#define Who_AM_I 0x0F
#define X_LSB 0x28
#define X_MSB 0x29
#define Y_LSB 0x2A
#define Y_MSB 0x2B
#define Z_LSB 0x2C
#define Z_MSB 0x2D
#define CTRL_REG1 0x20
#define CTRL_REG2 0x21
#define CTRL_REG3 0x22
#define CTRL_REG4 0x23
#define CTRL_REG5 0x24
#define FIFO_CTRL_REG 0x2E
#define OUT_TEMP 0x26

//i2c Yazma fonksiyonu
void writeReg(unsigned int8 address,unsigned int8 data)
{
i2c_start();
i2c_write(Gyro_Write);
i2c_write(address);
i2c_write(data);
i2c_stop();
return;
}

//i2c Okuma foksiyonu
int8 readReg(unsigned int8 address)
{
unsigned int8 data;
i2c_start();
i2c_write(Gyro_Write); // Okuma işleminin yapılacağı yazdırılır
i2c_write(address); // Okunacak adres yazdırılır
i2c_start();
i2c_write(Gyro_Read); // okuma işlemine hazır olunduğu yazdırılır
data = i2c_read(0); // Okunulan veri data ya aktarılır
i2c_stop();
return data;
}

//Gyro ön kurulum fonksiyonu
void init_gyro(void)
{
int8 kimlik;
writeReg(CTRL_REG1,0b00001111);
writeReg(CTRL_REG2,0b00000001);
writeReg(CTRL_REG3,0b00000000);
writeReg(CTRL_REG4,0b00100000); // 0x00-250dps, 0x10-500dps, 0x20-2000dps
writeReg(CTRL_REG5,0b00000000);

kimlik = readReg(Who_AM_I); //sensörün kimliği kontrol edilir
while(kimlik!=0xD3)
{
kimlik = readReg(Who_AM_I); //sensörden kimlik verisi alınana kadar okuma işlemine devam edilir
}
return ;
}

void Gyro_Oku(int16 &valuex, int16 &valuey, int16 &valuez)
{
int8 M=0,L=0;
L=readReg(X_LSB);
M=readReg(X_MSB);
valuex=make16(M,L);

L=readReg(Y_LSB);
M=readReg(Y_MSB);
valuey=make16(M,L);

L=readReg(Z_LSB);
M=readReg(Z_MSB);
valuez=make16(M,L);
}
[/php]

gyro.c

[php]
#include <18F4550.h>
#device adc=10

#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES CPUDIV4 //System Clock by 4
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(crystal=20000000, clock=5000000)

#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)
#use i2c(master,sda=pin_b0, scl=pin_b1, slow=100000)</pre>
#include "L3G4200D.c"

char Gelen=0;
int16 GyroX=0,GyroY=0,GyroZ=0;

#int_RDA
void RDA_isr(void)
{
Gelen = getch();
}

void main()
{
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
init_gyro();
while(TRUE)
{
if(Gelen==’a’)
{
Gyro_Oku(GyroX,GyroY,GyroZ);
printf("%ld %ld %ld\n\r",GyroX,GyroY,GyroZ);
Gelen=0;
}
}
}

[/php]

Yukarı kodda klavyeden a harfine basıldığında o anki değerleri gönderen bir program mevcut. Eğer sürekli akmasını istiyorsanız if ‘i silip 10 msn lik bir gecikme ile sürekli verinin gönderilmesini sağlayabilirsiniz. Aşağıdaki grafikte başlangıçta yüzeye paralel olan devremizi y düzleminde 90 derece çevirdiğimizde karşımıza çıkan sinyallerdir.

gyro_grafik

İlk Yorumu Siz Yapın

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir