Monday 12 January 2015

Menggunakan Sensor CMPS10

Salam Kapasitorrr!!!
Pada kesempatan kali ini kita akan membahas salah satu sensor yang sering digunakan dalam perlombaan kontes robot pemadam api indonesia (KRPAI) atau yang dulu dikenal dengan nama kontes robot cerdas indonesia (KRCI). Sensor CMPS10 adalah sensor yang bekerja berdasarkan magnet bumi. Jalur data untuk mengakses sensor ini berupa jalur data serial dan dalam kesempatan ini kita akan menggunakan jalu data serial I2C. Sensor ini juga dapat menggunakan mengukur sudut kemiringan pada 2 axis (roll dan pitch). Untuk lebih jelas dapat dibaca / didownload pada link berikut DataSheet CMPS10 .

Langsung saja kita mulai, seperti yang kita bicarakan sebelumnya bahwa jalur data yang akan kita gunakan adalah jalur data serial I2C. Berikut register - register yang akan digunakan apabila kita menggunakan jalur data I2C.



Dari tabel tersebut kita mendapatkan informasi penting berupa alamat alamat register. Sala satunya adalah terdapat 2 cara untuk mendapatkan nilai sudt compass yaitu pertama dapat diakses dari register 1 dimana nilai 0 - 255 mewakili sudut 0 - 360 derajat. Dan cara yang kedua adalah dapat diakses melalui register 2 dan 3 dimana nilai 0 - 3599 mewakili nilai sudut 0 - 359,9 derajat.

Langsung saja berikut programnya.

#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

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


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

signed int compass_high, compass_low;

float compass;

char buff[20];



#define compass_address 0xC0  // address compas

#define compass_8bit 0x01

#define compass_16bit1 0x02
#define compass_16bit2 0x03

unsigned char read_i2c(unsigned char address, unsigned char reg)
{  
    unsigned char data;
    i2c_start();
    i2c_write(address); 
    i2c_write(reg);
    i2c_start();
    i2c_write(address|1);
    data=i2c_read(0);
    i2c_stop();
    return data;
}

void write_i2c(unsigned char address,unsigned char reg, unsigned char data)
{
    i2c_start();
    i2c_write(address);
    i2c_write(reg);
    i2c_write(data);
    i2c_stop();
    delay_ms(10);
}

void akusisi_compass()
{
compass_high=read_i2c(compass_address,compass_16bit1);
compass_low=read_i2c(compass_address,compass_16bit2);
compass =(float)((compass_high<<8)|compass_low)/10;
}

void akusisi_compass_8bit()
{
compass = (float)(read_i2c(compass_address,compass_8bit) * 1.41176);
}

// Declare your global variables here

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
      akusisi_compass();
      lcd_gotoxy(0,0);
      lcd_putsf(Sudut=);
      lcd_gotoxy(0,1);
      ftoa(compass,2,buff);
      lcd_puts(buff);
      delay_ms(100);
      lcd_clear();
      };
}

Semoga bermanfaatttt!!!!!!
Salam Kapasitor!! hehehe
Iklannya diklik ya gan hehehe
Matur nuwun..









6 comments:

  1. sore gan, mau tanya ini ada video konfigurasi di cvavrnya tidak ya? atau gambar rangkaian elektronikanya

    ReplyDelete
    Replies
    1. sori gan baru bls.. klo video konfigurasinya sama sperti setting I2C pd umumnya gan, disesuaikan dgn port yang akan kita gunakan, klo rangkaianya sama seperti sensor Mpu6050, bs dilihat dipostingan http://prasetyoabdi.blogspot.co.id/2014/12/menggunakan-sensor-mpu6050-pada.html

      Delete
    2. saya udah coba, tapi kok keluarannya cuman -0.10 dan ga bisa berubah derajatnya ya? apa perlu di kalibrasi ulang?

      Delete
    3. kalo kalibrasi ulang ga perlu mas, cb cek programnya mas, cek dari header smp address nya mas..

      Delete
    4. makasih mas tutorialnya sangat membantu bagi newbie kaya ane. btw keluaran kode ane juga -0.10, port i2c yg ane pake PC0 sbg SDA, PC1 sbg SCL

      Delete