Thursday, May 12, 2011

Mengkases Sensor Jarak SRF02 dengan AVR dan bahasa C



SRF02 adalah modul sensor jarak yang memiliki 2 mode komunikasi yaitu mode serial UART dan mode serial I2C. Informasi tentang bagaimana prinsip kerja SRF02 secara detail dapat dilihat disini (SRF02 , Mode Serial UART , Mode Serial I2C ). Berikut adalah penjelasan singkat tentang cara mengakses SRF02 baik dalam mode serial UART maupun mode serial I2C beserta dengan cuplikan kode programnya dalam bahasa C.
* Mode Serial UART

Deskripsi pin untuk mode Serial UART adalah sebagai berikut :
1. VCC, pin ini dihubungkan ke sumber tegangan 5 Volt.
2. RX, pin ini digunakan untuk jalur penerimaan data.
3. TX, pin ini digunakan untuk jalur pengiriman data.
4. Mode, pin ini digunakan untuk menentukan mode kerja SRF02.5. Jika dihubungkan ke ground maka bekerja pada mode serial UART dan jika di hubungkan ke VCC (atau dibiarkan saja) maka bekerja pada mode serial I2C.
5. Ground, pin ini dihubungkan ke ground.

Agar bekerja pada mode serial UART maka pin Mode harus diberi logika low atau dihubungkan ke ground. Modul SRF02 hanya akan melakukan proses pengukuran jarak jika telah diberikan perintah terlebih dahulu. Dengan mengirimkan data serial yang berisi alamat sensor kemudian diikuti dengan data 84 (0x54) sebagai perintah maka SRF02 akan mulai melakukan proses pengukuran jarak dan setelah selesai dengan segera akan mengirimkan data 2 byte sebagai data hasil pengukurannya. Data 2 byte hasil pengukuran ini akan dikirimkan byte atasnya (upper byte) terlebih dahulu kemudian diikuti byte rendahnya (lower byte). Jika data perintahnya 84 (0x54) maka hasil pengukurannya akan memiliki satuan centimeter. Jika anda menghendaki satuan inch atau us maka anda dapat merubah data perintahnya dengan 83 (0x53) atau 85 (0x55). Sesuai dengan spesifikasi yang diberikan oleh produsen modul SRF02 ini, mode serial UART ini hanya dapat bekerja pada kecepatan transmisi (baud rate) 9600 bps dan dengan format data 1-bit start, 8-bit data, 2-bit stop, dan tidak ada paritas.

Contoh program berikut ini adalah program untuk mengukur jarak dengan menggunakan SRF02 mode serial UART kemudian byte rendah dari data hasil pengukuran ini akan ditampilkan ke lampu LED yang terhubung ke port C. Anggap modul SRF02 memiliki alamat hardware 0 (Address Devices = 0).

Listing Program :

1: #include <mega8515.h>
2: #include <stdio.h>

3: unsigned char jarak_up,jarak_low;
4: const long int osilator=8000000;
5: unsigned long int UBRR;
/*prototipe fungsi*/
6: void InisialisasiUART( unsigned long int baud_rate );
7: void main( void )
8: {
9: DDRC=0xFF;
10: PORTC=0x00;
11: InisialisasiUART(9600);
12: while ( 1 )
13: {
14: putchar(0);
15: putchar(84);
16: jarak_up=getchar();
17: jarak_low=getchar();
18: PORTC=~jarak_low;
19: };
20: }

21: void InisialisasiUART( unsigned long int baud_rate )
22: {
23: UBRR = (osilator/(16*baud_rate))-1;
24: UBRRL = UBRR;
25: UBRRH = UBRR>>8;
26: UCSRA = 0x00;
27: UCSRB = 0x18;
28: UCSRC = 0x8E;
29: }

* Mode Serial I2C

{mosimage}

Deskripsi pin untuk mode Serial I2C adalah sebagai berikut :
1. SDA, pin ini sebagai jalur data yang bersifat bi-directional atau dua arah yang digunakan untuk mengirimkan dan menerima data.
2. SCL, pin ini sebagai jalur clock yang digunakan untuk menghasilkan detak sinyal sinkronisasi.

Berikut ini adalah contoh kode program untuk mengakses SRF02 dalam mode serial I2C. Port D bit 0 terhubung ke pin SDA dan port D bit 1 terhubung ke pin SCL. Address devices = 0 pada mode I2C setara dengan 0xE0 :

Listing Program SRF02i2c.c :

1: #include <mega8535.h>
2: #asm
3: .equ __i2c_port=0x12
4: .equ __sda_bit=1
5: .equ __scl_bit=0
6: #endasm
7: #include <i2c.h>
8: #include <delay.h>

9: #define SRF02_ADDRESS 0xE0
/*Prototype fungsi*/
10: unsigned char baca_SRF02 (unsigned char address);
11: void tulis_SRF02 (unsigned char address, unsigned char data);
12: unsigned int jarak=0;

13: void main(void)
14: {
15: i2c_init();
16: #asm("sei")
17: while (1)
18: {
19: tulis_SRF02(0,81);
20: delay_ms(100);
21: #asm("cli")
22: jarak=baca_SRF02(3);
23: #asm("sei")
24: };
25: }

26: unsigned char baca_SRF02 (unsigned char alamat)
27: {
28: unsigned char data;
29: i2c_start();
30: i2c_write(SRF02_ADDRESS);
31: i2c_write(alamat);
32: i2c_start();
33: i2c_write(SRF02_ADDRESS | 1);
34: data=i2c_read(0);
35: i2c_stop();
36: return data;
37: }

38: void tulis_SRF02 (unsigned char alamat, unsigned char data)
39: {
40: i2c_start();
41: i2c_write(SRF02_ADDRESS);
42: i2c_write(alamat);
43: i2c_write(data);
44: i2c_stop();
45: }

No comments:

Post a Comment

Terima kasih atas komentar yang anda sampaikan , sehingga dapat menambah wawasan saya sebagai penulis dan membuat blog ini semakin berguna banyak orang