Sensor CMPS10 terdiri magnetometer 3-axis dan accelerometer 3-axis serta mengunakan prosesor 16-bit, CMPS10 telah dirancang untuk mengurangi kesalahan yang disebabkan oleh miringnya PCB.CMPS10 menghasilkan hasil nilai keluaran dari 0-3599 mewakili 0-359,9 atau 0 sampai 255. Sedangkan CMPS10 membutuhkan power supply pada tegangan 3,3 - 5V dan arus minimal 25mA. Untuk mengakses sensor CMPS-10 ada 3 cara yaitu dengan antarmuka serial, antarmuka I2C atau output PWM. Kali ini kita akan mengaksesnya dengan mengunaka interface I2C dengan mengunakan pemograman bahasa C dengan complier Codevision AVR.
Berikut ini konfigurasi pin jika kita mengaksesnya melalui I2C :
Berikut ini alamat-alamat register :
Sekarang kita hubungkan sensor CMPS-10 dengan mikrokontroler (disini saya mengunakan At-Mega 16) dan jangan lupa menambahkan Resistor Pull Up karena rangkaian I2C yang bersifat Open Collector.
Setelah rangkaian komunikasi sudah beres saatnya sekarang kita mengatur programnya, defaultnya alamat dari CMPS-10 ini ialah 0xC0 sehingga nantinya kita atur untuk membaca alamat tersebut. Kita atur port I2C di Codewizard terlebih dahulu.
Berikut ini program untuk mengakses alamat dan membaca data dari alamat register yang ditentukan (dikarenakan At-Mega 16 8 Bit data maka yang kita akses yang 8 Bit data saja) :
/***************************************************** This program was produced by the CodeWizardAVR V2.05.3 Standard Automatic Program Generator © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Author : Andi Holmes Web : Electro-Bee.blogspot.com Chip type : ATmega16 Program type : Application AVR Core Clock frequency: 11.059200 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega16.h> #include <delay.h> #include <i2c.h> #include <stdio.h> #include <alcd.h> char lcd_buf[16]; char komp; #define compass_addr 0xc0 //0xc0 alamat default dari cmps-10 atau bisa dsesuaikan // Declare your global variables here unsigned char compass_read(unsigned char address) { unsigned char data_kompas; i2c_start(); // kirim bit start komunikasi I2C i2c_write(compass_addr); // mengakses alamat cmps-10 i2c_write(address); // alamat register data yang mau diakses i2c_start(); // kirim ulang bit start komunikasi I2C i2c_write(compass_addr | 1);// melakukan setting bit R/W data_kompas=i2c_read(0); // ambil data jika low byte i2c_stop(); // stop pengiriman bit data delay_ms(100); // dibutuhkan delay sesuai datasheet return data_kompas; // mengembalikan data kompas } void main(void) { // Declare your local variables here // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // I2C Bus initialization // I2C Port: PORTA // I2C SDA bit: 1 // I2C SCL bit: 0 // Bit Rate: 100 kHz // Note: I2C settings are specified in the // Project|Configure|C Compiler|Libraries|I2C menu. i2c_init(); // Alphanumeric LCD initialization // Connections are specified in the // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS - PORTB Bit 0 // RD - PORTB Bit 1 // EN - PORTB Bit 2 // D4 - PORTB Bit 4 // D5 - PORTB Bit 5 // D6 - PORTB Bit 6 // D7 - PORTB Bit 7 // Characters/line: 16 lcd_init(16); lcd_gotoxy(0,0);lcd_puts("Akses Sensor"); lcd_gotoxy(0,1);lcd_puts(" Kompas "); delay_ms(1000); lcd_clear(); while (1) { // Place your code here komp=compass_read(1);// angka "1" menunjukan alamat register untuk pembacaan kompas 8 byte sprintf(lcd_buf,"Kompas=%3d",komp); lcd_gotoxy(0,0); lcd_puts(lcd_buf); } }
Selain itu kalian juga dapat memanggil data Pitch dan Roll Angel sehingga dapat digunakan untuk sensor kemiringan. Semoga bermanfaat dan CMIIW (Correct Me If I'm Wrong)..Regards!
mas admin saya mau tanya:
cara memprogram buat cmps10 biar datanya kluar 360 derajat gmn ya?
terima kasih
@Anonymous bisa dengan cara menambahkan varibel bertipe float misal "float derajat;" lalu dibuat perintah/rumus "derajat = (float)komp*360/255; ". Lalu jika ingin di tampilkan atau dikirim "sprintf(lcd_buf,"Kompas=%0.0f",derajat);" dan jangan lupa Project >> Konfigurasinya >>(s)printf features dganti float. Regards!
min, sudah di program 360 derajat tapi malah jadi kurang presisi ya, ada program lainnya min? tks
@Anonymous Gunakan yang 16 bit atau kalibrasi ulang atau bisa juga dengan algorithma fuzzy.
cara ganti jadi 16 bit gimana gan? punten *nubie
@AnonymousGanti alamat registernya ke 2
Post a Comment
Silahkan tinggalkan komentar jika ada pertanyaan, saran atau kritikan yang sifatnya membangun.
Berkomentarlah dengan sopan, AMAT SANGAT DILARANG berkomentar berbau POLITIK,KONSPIRASI,SARA dan PORNOGRAFI.
Terima Kasih Atas Kunjunganya. Jangan lupa tekan CTRL+D yaa...
Salam @dmin electro-bee.blogspot.com