Sensor Kompas CMPS03

Modul kompas ini dirancang khusus untuk digunakan dalam robot sebagai bantuan untuk navigasi. Tujuannya adalah untuk menghasilkan nomor unik untuk mewakili arah robot yang dihadapi. Kompas ini menggunakan sensor KMZ51 Philips untuk mendeteksi medan magnet, yang cukup sensitif untuk mendeteksi medan magnet Bumi.
Koneksi ke modul kompas.

<–  UTARA


Modul ini membutuhkan power sebesar 5 volt dengan konsumsi arus 15 mA. Ada dua cara untuk mendapatkan data kompas, dari koneksi  PWM atau I2C.

Sinyal PWM adalah sinyal yang lebar dari pulsanya termodulasi dengan lebar positif dari pulsanya yang mewakili sudut. Lebar pulsa bervariasi dari 1ms (0 °) untuk 36.99mS (359,9 °) – dalam kata lain 100uS / ° dengan 1 mS offset. Sinyal menjadi rendah untuk 65mS antara pulsa, sehingga waktu siklus adalah 65mS + lebar pulsa – yaitu. 66ms-102ms. Osilator dihasilkan oleh timer 16 bit di prosesor memberikan resolusi 1US, namun tidak direkomendasikan pengukuran ini untuk sesuatu yang lebih baik dari 0,1 ° (10uS). Pastikan Anda menghubungkan pin I2C, SCL dan SDA, untuk pasokan 5v jika Anda menggunakan PWM, karena tidak ada pull-up resistor pada pin ini.

Pin 2,3 adalah untuk antarmuka I2C dan dapat digunakan untuk mendapatkan pembacaan langsung dari modul. Jika antarmuka I2C tidak digunakan maka pin ini harus
di pulled high (untuk +5 v) melalui beberapa resistor. Sekitar 47k ok, nilai-nilai sama sekali tidak kritis.

I2C protokol komunikasi dengan modul kompas adalah sama dengan eeprom populer seperti 24C04 .. Pertama mengirim start bit, modul Alamat (0xC0) dengan  read/write bit low, sesuai nomor register yang ingin Anda baca. Ini diikuti dengan awal yang berulang dan modul alamat lagi dengan read/write bit high (0XC1). Anda sekarang membaca satu atau dua byte untuk 8bit atau 16bit register masing-masing. Register 16bit yang membaca byte tinggi terlebih dahulu. Kompas memiliki array 16 byte dari register, beberapa di antaranya ganda sebagai register 16 bit sebagai berikut;

Register Function
0 Software Revision Number
2,3 Compass Bearing as a byte, i.e. 0-255 for a full circle
4,5 Internal Test – Sensor1 difference signal – 16 bit signed word
6,7 Internal Test – Sensor2 difference signal – 16 bit signed word
8,9 Internal Test – Calibration value 1 – 16 bit signed word
10,11 Internal Test – Calibration value 2 – 16 bit signed word
12 Unused – Read as Zero
13 Unused – Read as Zero
14 Unused – Read as Undefined
15 Calibrate Command – Write 255 to perform calibration step. See text.

Antarmuka I2C tidak mempunyai pull-up resistor di modulnya, ini harus disediakan tempat lain, kemungkinan besar dengan bus master. Pullup diwajibkan pada kedua SCL dan jalur SDA, tapi hanya sekali untuk seluruh bus, bukan pada setiap modul. Disarankan nilai 1k8 jika Anda akan bekerja sampai 400KHz dan 1k2 atau bahkan 1k jika Anda pergi ke 1MHz. Kompas ini dirancang untuk bekerja sampai clock speed standar (SCL) dari 100KHz, namun kecepatan clock dapat ditingkatkan sampai 1MHz menyediakan tindakan pencegahan berikut ini diambil; Pada kecepatan di atas sekitar 160KHz CPU tidak dapat merespon cukup cepat untuk membaca I2C data. Oleh karena itu delay kecil 50uS harus dimasukkan kedua sisi penulisan  register address. Tidak ada delay yang diperlukan di tempat lain dalam urutan. Dengan melakukan ini, sudah diuji modul kompas hingga 1.3MHz clock speed SCL.

Kalibrasi

Kalibrasi dibutuhkan setidaknya satu kali. Penting untuk dijaga bahwa keadaan sensor selalu datar terhadap permukaan bumi (flat, tidak miring) dan jauhkan dari benda bermagnet.

I2C Method
Untuk mengkalibrasi menggunakan I2C bus, Anda hanya perlu untuk menuliskan 255 (0xff) pada register 15 untuk empat kutub utama Utara, Timur, Selatan dan Barat. Nilai 255 terhapus secara internal dengan otomatis setelah setiap poin terkalibrasi. Poin kompas dapat diatur dalam urutan apapun, tapi semua empat poin harus dikalibrasi. Misalnya
1. Pastikan kompas CMPS03 dalam keadaan datar, menunjuk ke Utara. Write 255 pada register 15
2. Pastikan kompas CMPS03 dalam keadaan datar, menunjuk ke Timur. Write 255 pada register 15
3. Pastikan kompas CMPS03 dalam keadaan datar, menunjuk ke Selatan. Write 255 pada register 15
4. Pastikan kompas CMPS03 dalam keadaan datar, menunjuk ke Barat. Write 255 pada register 15

Pin Method
Pin 6 digunakan untuk mengkalibrasi kompas. Pin input kalibrasi (pin 6) sudah mempunya pullup pada modul dan dapat dibiarkan tidak tersambung setelah kalibrasi. Untuk mengkalibrasi kompas Anda hanya perlu mengatur pin kalibrasi dengan logic low and lalu high kembali untuk setiap poin utama kompas Utara, Timur, Selatan dan Barat. Sederhananya tekan switch yang sudah terhubung dari pin6 ke 0V (Ground). Poin kompas dapat diatur dalam urutan apapun, tapi semua empat poin harus dikalibrasi. Misalnya
1. Pastikan kompas CMPS03 dalam keadaan datar, menunjuk ke Utara. Tekan dan lepas switch
2. Pastikan kompas CMPS03 dalam keadaan datar, menunjuk ke Timur. Tekan dan lepas switch
3. Pastikan kompas CMPS03 dalam keadaan datar, menunjuk ke Selatan. Tekan dan lepas switch
4. Pastikan kompas CMPS03 dalam keadaan datar, menunjuk ke Barat. Tekan dan lepas switch

Contoh C Code dengan Compiler CodeVisionAVR

Berikut adalah controh program untuk mengakses modul kompas via I2C dengan menggunakan mikrokontroler AVR ATmega8535 dengan xtal 4MHz yang terhubung dengan LCD pada PORTA dan I2C  (SCL = PORTC.0 dan SDA PORTC.1)

/*****************************************************
Chip type           : ATmega8535
Program type        : Application
Clock frequency     : 4,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 128
*****************************************************/

#include <mega8535.h>
#include <delay.h>
#include <stdio.h>

// I2C Bus functions
#asm
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=1
.equ __scl_bit=0
#endasm
#include <i2c.h>

// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>

// Declare your global variables here
unsigned char kata[16];
// Declare your global variables here
unsigned char compas_readb(unsigned char addr)
{
unsigned int posisi;
i2c_start();
i2c_write(0xC0);
i2c_write(addr);
i2c_start();
i2c_write(0xC1);
posisi=i2c_read(0);
i2c_stop();
return posisi;
}
void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// I2C Bus initialization
i2c_init();

// LCD module initialization
lcd_init(16);

while (1)
{
// Place your code here
lcd_clear();
sprintf(kata,”%d”, compas_readb(1));
lcd_gotoxy(0,0);
lcd_puts(kata);
delay_ms(50);
};
}

__________________________________________________

Daftar Pustaka

http://digi-ware.com/img/d/kompas.PDF

http://www.robotstorehk.com/CMPS03_release.pdf

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s