
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