Merhaba Arkadaşlar, Epeyce oldu okul ve işler derken hiç vakit bulamıyorum, Malum yaz geldi, vakit buldukça biriktirdiğim yazılarımı yazmaya çalışacağım.
Bu yazımda ADXL345 ivme ölçer çipine ait örnek uygulama paylaşacağım. ADXL345 SMD kılıfta olan bir çip, Deneysel amaçlı kullanmanız için Kendiniz bir board yapabileceğiniz gibi Hazır yapılmış boardlar kullanabilirsiniz. Zira boardla birlikte fiyatları diğer hemcinslerine göre nispeten ucuz. Bende bu yüzden bu çipi kullandım.
Yurtdışında ortalama fiyatı 5-6 dolar. Aynı ürün Türkiyedeki firmalardan 10-15 TL arası bir ücrete temin edilebiliyor.
ADXL345 ivme ölçer çipinin özellikleri
Ultra düşük enerji Tüketimi(Vs=2,5V, Measurement Mode 23uA, StandBy Mode 0.1uA)
10Bit veya 13 Çözünürlük Seçeneği
Serbest Düşüş Tespiti
2.0 ile 3.6v arası çalışma gelirimi
1.7v ile Vs arası I/O voltajı
SPI veya I2C iletişim seçenekleri
-40 ile +85C sıcaklık aralığında çalışma
Esnek interrupt Seçenekleri şeklinde sıralanabilir.
Çipin özellikleri fena değil, I2C ve SPI desteklemesi çok hoş. Başta söylediğim gibi çipi deneysel amaçlı kulllanabilmek için board temin etmek gerekiyor. Benim kullandığım board aşağıdaki resimdekinden.
Buna benzer birçok board bulunmaktadır. Bu board’ın güzel bir tarafı hem 5V hemde 3.3V desteğinin bulunmasıdır. Normalde ADXL345 3.3V ile çalışıyor. Board üzerinde 5V->3.3V gelirim regülatörü var. Ayrıca SCL ve SDA hattı pull-up yapılmış. I2C ile haberleşirken ayrıca hatta pull-up direnci eklemenize gerek yok.
PIC16F628 ADXL345 Devre Şeması
Yazılıma gelirsek, Aslında fazla karmaşık değil. ADXL345′den veri alabilmek için Asgari düzeyde bir iki registeri init ederek veri alabilecek konuma getirebiliyoruz çipi. Bütün Registerlere değinmeye gerek yok zaten, Çalışması için gerekli bilgileri bilelim yeter. Fazlası Datasheette ayrıntılı olarak yazıyor.
ADCL345 Kütüphane
için ufak bir kütüphane hazırladım.
// ADXL345 Registers #define ADXL345_DEVID 0x00 // R Device ID #define ADXL345_THRESH_TAP 0x1D // R/W Tap threshold #define ADXL345_OFSX 0x1E // R/W X-axis offset #define ADXL345_OFSY 0x1F // R/W Y-axis offset #define ADXL345_OFSZ 0x20 // R/W Z-axis offset #define ADXL345_DUR 0x21 // R/W Tap duration #define ADXL345_Latent 0x22 // R/W Tap latency #define ADXL345_Window 0x23 // R/W Tap window #define ADXL345_THRESH_ACT 0x24 // R/W Activity threshold #define ADXL345_THRESH_INACT 0x25 // R/W Inactivity threshold #define ADXL345_TIME_INACT 0x26 // R/W Inactivity time #define ADXL345_ACT_INACT_CTL 0x27 // R/W Axis enable control for activity and inactivity detection #define ADXL345_THRESH_FF 0x28 // R/W Free-fall threshold #define ADXL345_TIME_FF 0x29 // R/W Free-fall time #define ADXL345_TAP_AXES 0x2A // R/W Axis control for single tap/double tap #define ADXL345_ACT_TAP_STATUS 0x2B // R Source of single tap/double tap #define ADXL345_BW_RATE 0x2C // R/W Data Rate and power mode control #define ADXL345_POWER_CTL 0x2D // R/W Power-saving features control #define ADXL345_INT_ENABLE 0x2E // R/W Interrupt enable control #define ADXL345_INT_MAP 0x2F // R/W Interrupt mapping control #define ADXL345_INT_SOURCE 0x30 // R Source of interrupts #define ADXL345_DATA_FORMAT 0x31 // R/W Data format control #define ADXL345_DATAX0 0x32 // R X-Axis Data 0 #define ADXL345_DATAX1 0x33 // R X-Axis Data 1 #define ADXL345_DATAY0 0x34 // R Y-Axis Data 0 #define ADXL345_DATAY1 0x35 // R Y-Axis Data 1 #define ADXL345_DATAZ0 0x36 // R Z-Axis Data 0 #define ADXL345_DATAZ1 0x37 // R Z-Axis Data 1 #define ADXL345_FIFO_CTL 0x38 // R/W FIFO control #define ADXL345_FIFO_STATUS 0x39 // R FIFO status #define ADXL345_OUTPUTS 0x32 void adxl345_write(int add, int data) { i2c_start(); i2c_write(0xA6); i2c_write(add); i2c_write(data); i2c_stop(); } int adxl345_read(int add){ int retval; i2c_start(); i2c_write(0xA6); i2c_write(add); i2c_start(); i2c_write(0xA7); retval=i2c_read(0); i2c_stop(); return retval; } void adxl345_init(){ adxl345_write(ADXL345_DATA_FORMAT,0x0B); delay_ms(2); adxl345_write(ADXL345_POWER_CTL,0x08); delay_ms(2); }
İlk etapta DATA_FORMAT Registerine bakalım. Bu Register 0×31 adresinde bulunuyor.
7. Bit SELF_TEST biti. Şayet Bu bit 1 olursa ADXL345 SelfTest moduna girer. Bizim bu bitle işimiz yok bu yüzden 0 veriyoruz
6. Bit SPI Seçim biti. Şayet Bu bit 1 olursa ADXL345 SPI haberleşme moduna girer. Biz I2C kullandığımız için yine bu bite 0 veriyoruz.
5. Bit INT_INVERT biti. Görevi ise ADXL345′in interrupt çıkışlarını terslemesi. Biz interrupt kullanmadığımız için bu bitede 0 veriyoruz.
4. Bit Kullanılmıyor
3. Bit FULL_RES biti. Bu bit 1 olursa ADXL345 13 Bit yani full resolution modunda ölçüm yapar. Biz ivme ölçeri full resolution modunda kullandığımız için bu biti 1 yapıyoruz.
2. Bit Justify biti MSB ile LSB yi terslemeye yarıyor. Bizim buna ihtiyacımız yok bu yüzden 0 yapıyoruz. 1. ile 0. Bitler Range Bitleri, İvme ölçerin ölçüm aralığını ayarlamaya yarar. Datasheet Tablo 21′de açıklanmış
Biz 16G modunda kullanıyoruz. Dolayısıyla 1. ve 0. bitlerin ikisinide 1 yapmamız gerekiyor. DATA_FORMAT Registerinin ayarları bu kadar. Birde POWER_CTL Registeri var.
POWER_CTL Registeri
Bu registerin Çipin Power control işlemlerini yapılmasını olanak sağlar. Örneğin Çipi uyku moduna sokmak isterseniz 2. Biti 1 yapmanız gerekir. Biz sürekli ölçüm yapacağız. Bu yüzden Measure bitini 1 yapıyoruz. Diğerlerine karışmamıza gerek yok. İlk çalışmada bu ayarları yaptıktan sonra ivme ölçer bize değer verecek hale geliyor. Bundan sonra ADXL345′den eksen bilgileri okunabilir. X,Y ve Z eksenlerine ait değerler 16 bit olduğu için iki ayrı paket halinde gönderiliyor. Datasheette Okunacak adresler aşağıdaki gibi belirtilmiş.
Bizde okuma yaparken 0×32 adresinden itibaren okuma yapıp gelen paketleri 8 bitlik değerlerde topluyoruz. Ardından 16 bitlik tek paket halinde birleştirmek gerekiyor. Tabi 16 bitlik değer Signed yani işaretli olması gerekiyor. çünkü gelen değerler pozitif veya negatif değerler alabilmektedir.
ADXL345 PIC16F628 Yazılım
#include <16F628A.h> #FUSES NOWDT //No Watch Dog Timer #FUSES INTRC_IO //Internal RC Osc, no CLKOUT #FUSES NOBROWNOUT //No brownout reset #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOMCLR #use delay(clock=4000000) #use I2C(master, sda=PIN_B0, scl=PIN_B1, slow) #use fast_io(a) #use fast_io(b) #include <lcd_driver.cgt; #include <ADXL345.cgt; int8 accel_data[6]; int16 xaxis=0,yaxis=0,zaxis=0; void main() { set_tris_a(0x00); set_tris_b(0x00); output_a(0x00); output_b(0x00); setup_ccp1(CCP_OFF); delay_ms(2); lcd_init(); adxl345_init(); printf(lcd_putc,"\f"); lcd_gotoxy(1,1); printf(lcd_putc," ADXL345 "); lcd_gotoxy(1,2); printf(lcd_putc," Accelerometer "); delay_ms(1000); printf(lcd_putc,"\f"); while(TRUE) { accel_data[0]=adxl345_read(0x32); //Read X axis(LSB) accel_data[1]=adxl345_read(0x33); //Read X axis(MSB) accel_data[2]=adxl345_read(0x34); //Read Y axis(LSB) accel_data[3]=adxl345_read(0x35); //Read Y axis(MSB) accel_data[4]=adxl345_read(0x36); //Read Z axis(LSB) accel_data[5]=adxl345_read(0x37); //Read Z axis(MSB) xaxis=make16(accel_data[1],accel_data[0]); yaxis=make16(accel_data[3],accel_data[2]); zaxis=make16(accel_data[5],accel_data[4]); lcd_gotoxy(1,1); printf(lcd_putc,"X=%ld ",xaxis); lcd_gotoxy(1,2); printf(lcd_putc,"Y=%ld ",yaxis); lcd_gotoxy(11,2); printf(lcd_putc,"Z=%ld ",zaxis); delay_ms(100); } }
Yazılım son derece sade ve anlaşılır. Umarım Faydalı olmuştur. ADXL345 İvme Ölçer Projesine ait proteus isis PCB, Şema ve kod dosyaları;
İyi çalışmalar.
Şifre-Pass: 320volt.com
Yayım tarihi: 2014/07/28 Etiketler: adxl345, ivme ölçer, microchip pic projeleri, PIC16F628 örnekleri
mucit23 kardeşim.çok güzel bir uygulama.emeğinize sağlık.fakat ben bu uygulamayı bir iki haftadır uğraşmama rağmen çalıştıramadım.bana bu konuda yardımcı olabilirmisiniz.
Saygılarımla.
Özcan ÇELİK
[email protected]