Jumat, 29 Januari 2010

program srf04

Program Mikrokontroler AVR Untuk Sensor SRF04 Menggunakan CVAVR

SRF04 adalah sensor non-kontak pengukur jarak menggunakan ultrasonik. Prinsip kerja sensor ini adalah transmitter mengirimkan seberkas gelombang ultrasonik, lalu diukur waktu yang dibutuhkan hingga datangnya pantulan dari obyek. Lamanya waktu ini sebanding dengan dua kali jarak sensor dengan obyek, sehingga jarak sensor dengan obyek dapat ditentukan persamaan
jarak = kecepatan_suara × waktu_pantul/2
SRF04 dapat mengukur jarak dalam rentang antara 3 cm – 3 m dengan output panjang pulsa yang sebanding dengan jarak obyek. Sensor ini hanya memerlukan 2 pin I/O untuk berkomunikasi dengan mikrokontroler, yaitu TRIGGER dan ECHO. Untuk mengaktifkan SRF04 mikrokontroler mengirimkan pulsa positif melalui pin TRIGGER minimal 10 us, selanjutnya SRF04 akan mengirimkan pulsa positif melalui pin ECHO selama 100 us hingga 18 ms, yang sebanding dengan jarak obyek.


Dibandingkan dengan sensor ultrasonik lain, seperti PING, SRF04 mempunyai kemampuan yang setara, yaitu rentang pengukuran antara 3 cm – 3 m, dan output yang sama, yaitu panjang pulsa. Meski cara pengoperasiannya juga mirip, namun kedua sensor tersebut berbeda jumlah pin I/O-nya, yaitu 2 untuk SRF04 dan 1 untuk PING. Jika boleh memilih di antara keduanya, penulis cenderung untuk memilih PING dengan pertimbangan harga dan juga adanya lampu indikator yang menunjukkan kondisi PING sedang aktif, selain juga jumlah pin I/O yang lebih sedikit.
Selain SRF04 Devantech juga mengeluarkan beberapa macam sensor ultrasonik lain. Tidak seperti kebanyakan saudaranya yang mempunyai 2 transduser ultrasonik sebagai transmitter dan receiver, SRF02 hanya mempunyai 1 transduser ultrasonik yang berfungsi sekaligus sebagai transduser dan receiver dengan output I2C dan serial UART. SRF05 mirip dengan SRF04, hanya jangkauan maksimumnya 4 m dan terdapat 2 mode operasi menggunakan 1 atau 2 pin I/O. SRF08 mampu mengukur jarak dalam rentang 3 cm – 6 m dengan antarmuka I2C.
Inti program yang dibuat adalah fungsi baca_srf04 yang disesuaikan dengan timing diagram dari datasheet.

unsigned char baca_srf04(){
count=0;
//pemberian pemicu berupa pulsa positif minimal 10us utk aktivasi sensor
PORTA.1=1;
delay_us(15);
PORTA.1=0;
//menunggu hingga ECHO = 1
while(PINA.0==0){};
//mencacah untuk mengukur waktu lamanya pulsa 1 dari ECHO
while(PINA.0==1)
{count++;
};
//mengkonversikan hasil cacahan menjadi jarak dalam cm
jrk=count*10/232;
return jrk;
}

Berikut adalah program selengkapnya untuk membaca data dari SRF04 dan menampilkannya pada LCD menggunakan ATMEGA8535 dan kristal 4 MHz dengan penggunaan pin mikrokontroler sebagai beikut :

* Echo – PINA.0 (sebagai input bagi mikrokontroler)
* Trigger – PINA.1 (sebagai output bagi mikrokontroler)
* LCD – PORTC (susunan pin disesuaikan dengan wizard LCD pada CVAVR)

Semoga bermanfaat.

/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.7d Evaluation
Automatic Program Generator
© Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com

Project : SRF04
Version :
Date : 12/14/2008
Author : Agung Nugroho A
Company : Lab. Mekatronika Jurusan Teknik Mesin UII
Comments:

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

#include
#include
#include

// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0×15 ;PORTC
#endasm
#include

// Declare your global variables here
unsigned int count=0;
unsigned char jrk;
unsigned char jrk_dpn;
unsigned char kata1[16];
unsigned char kata2[16];

unsigned char baca_srf04(){
count=0;
//pemberian pemicu berupa pulsa positif minimal 10us
PORTA.1=1;
delay_us(15);
PORTA.1=0;
//menunggu hingga ECHO = 1
while(PINA.0==0){};
//mencacah untuk mengukur waktu lamanya pulsa 1 dari ECHO
while(PINA.0==1)
{count++;
};
//mengkonversikan hasil cacahan menjadi jarak dalam cm
jrk=count*10/232;
return jrk;
}

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=Out Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=P
// 7 6 5 4 3 2 1 0
PORTA=0×01; //0 0 0 0 0 0 0 1 = 01h, PINA.0 pullup
DDRA=0×02; //0 0 0 0 0 0 1 0 = 02h, PINA.0 input, PINA.1 output

// 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=0×00;
DDRB=0×00;

// 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=0×00;
DDRC=0×00;

// 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=0×00;
DDRD=0×00;

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

// 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=0×00;
TCCR1B=0×00;
TCNT1H=0×00;
TCNT1L=0×00;
ICR1H=0×00;
ICR1L=0×00;
OCR1AH=0×00;
OCR1AL=0×00;
OCR1BH=0×00;
OCR1BL=0×00;

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

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

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

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;

// LCD module initialization
lcd_init(16);

while (1)
{
// Place your code here
jrk_dpn=baca_srf04();
sprintf(kata1,”jarak= %3d cm”,jrk_dpn);
if (jrk_dpn>30)
{
sprintf(kata2,”masih jauh”);
}
else
{
sprintf(kata2,”sudah dekat”);
};
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(kata1);
lcd_gotoxy(0,1);
lcd_puts(kata2);
delay_ms(500);
};
}

Sumber Pustaka

* ____, SRF04 - Ultra-Sonic Ranger Technical Specification, diakses dari http://www.robot-electronics.co.uk/htm/srf04tech.htm
* ____, Devantech SRF04 Ultrasonic Range Finder, Parallax Inc, 2003.
* Riyanto Sigit (Editor), Robotika, Sensor, dan Aktuator, Graha Ilmu, 2007
* Agung Nugroho, Bahan Ajar Kuliah Robotika, tidak diterbitkan, Jurusan Teknik Mesin & Teknik Elektro UII, 2008.

Tidak ada komentar:

Posting Komentar