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 (idealnya) 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. Berikut saya sertakan keterangan gambar dari konfigurasi pin dan ilustrasi sudut pembacaan dari sensor SRF04 :
Menurut pengamatan dari hasil percobaan selama ini, dibanding dengan sensor ultrasonic lain (ex : PING), saya lebih memilih menggunakan SRF04 karena rentang pembacaan data jarak terhadap noise (ex : sound damper >> yang familiar dengan KRCI pasti tau) cukup presisi akan tetapi dari sisi harga dan penggunaan pin I/O pada microcontroller memang lebih unggul PING. Untuk SRF04 kebanyakan toko menjual dengan harga sekitar 380 - 400 ribu sedangkan PING dipatok sekitar 350 - 375 ribu dan penggunaan pin I/O pada SRF04 menggunakan 2 pin untuk membaca datanya (Trigger & Echo) sedangkan untuk PING cukup menggunakan 1 pin I/O padamicrocontroller (SIG).
Masih ada jenis lain dari sensor jarak keluaran Devantech, seperti SRF02 yang hanya mempunyai 1 transducer yang berfungsi sebagai transreceiverdengan output pembacaan yang dapat diakses melalui komunikasi serial i2C dan UART, kemudian jenis lain yaitu SRF05 yang mirip dengan SRF04 perbedaannya pada jangkauan SRF05 yang dapat mencapai 4m dan terdapat 2 mode operasi menggunakan 1 pin atau 2 pin I/O, SRF08 mampu mengukur jarak dalam rentang 3 cm – 6 m dengan antarmuka I2C (sebagai catatan semakin panjang jangkauannya maka semakin besar pula data error yang dihasilkan dari pembacaan sensor tsb >> baca rumus pembacaan jarak ultrasonic diatas).
Sepertinya ada yang kurang jika saya tidak menyertakan bagaimana cara akses SRF04 pada microcontroller, berikut saya sertakan source codeuntuk SRF04 dengan menggunakan AVR microcontroller ATMEL8535 danLCD 16x2 untuk menampilkan hasil pembacaan sensor SRF04 :
/****************************************************************This program was produced by theCodeWizardAVR V1.25.3 StandardAutomatic Program Generator© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.http://www.hpinfotech.com
Project :Version :Date : 4/9/2009Author : Heri Tri SusantoCompany : the-loba.blogspot.comComments:
Chip type : ATmega8535Program type : ApplicationClock frequency : 11.059200 MHzMemory model : SmallExternal SRAM size : 0Data Stack size : 128****************************************************************/
#include #include #include
//~~~~~~INISIALISASI PIN SRF04~~~~~~\\
#define pulse_kn PORTB.0#define echo_kn PINB.1
equ __lcd_port=0x15 ;PORTC
// 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=Out Func0=In// State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=TPORTA=0x00;DDRA=0x01;
// Port B 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=TPORTB=0x00;DDRB=0x01;
// 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=TPORTC=0x01;DDRC=0x01;
// Port D initialization// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0PORTD=0x00;DDRD=0xFF;
// Timer/Counter 0 initialization// Clock source: System Clock// Clock value: Timer 0 Stopped// Mode: Normal top=FFh// OC0 output: DisconnectedTCCR0=0x00;TCNT0=0x00;OCR0=0x00;
// Timer/Counter 1 initialization// Clock source: System Clock// Clock value: 10.800 kHz// Mode: Fast PWM top=00FFh// OC1A output: Non-Inv.// OC1B output: Non-Inv.// Noise Canceler: On// Input Capture on Falling Edge// Timer 1 Overflow Interrupt: Off// Input Capture Interrupt: Off// Compare A Match Interrupt: Off// Compare B Match Interrupt: OffTCCR1A=0xA1;TCCR1B=0x8D;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: DisconnectedASSR=0x00;TCCR2=0x00;TCNT2=0x00;OCR2=0x00;
// External Interrupt(s) initialization// INT0: Off// INT1: Off// INT2: OffMCUCR=0x00;MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initializationTIMSK=0x00;
// Analog Comparator initialization// Analog Comparator: Off// Analog Comparator Input Capture by Timer/Counter 1: OffACSR=0x80;SFIOR=0x00;
// LCD module initializationlcd_init(16);
while (1){count_kn=0;pulse_kn=0;pulse_kn=1;delay_us(10);pulse_kn=0;while (echo_kn==0){};while (echo_kn==1){delay_us(100);count_kn++;}
sprintf(kata2,"jarak kn=%3d",count_kn);lcd_clear();lcd_gotoxy(0,1);lcd_puts(kata2);delay_ms(70);
};}
Sensor ultrasonic tipe SRF05 ini secara prinsip sama saja dengan sensor ultrasonic PING))). Memancarkan gelombang ultrasonic dengan frekuensi 40 KHz kemudian menunggu sampai pantulan gelombangnya diterima kembali. Tanda kalau gelombang sudah diterima atau belum berupa sinyal HIGH – LOW.Terdapat 10 pin, tapi kita cukup memakai 4 pin saja (sebenarnya 3 pin juga bisa). Perhatikan gambar berikut :- Pin 5v untuk koneksi ke tegangan 5V dc.
- Echo Output untuk memantau kondisi logika, apakah gelombang ultrasonic sudah diterima kembali atau belum.
- Trigger Input dipakai untuk memicu pembangkitan gelombang ultrasonic. Berupa sinyal ‘HIGH’ selama minimal 100 us.
- 0 V (GND) dihubungkan ke ground.
Kita coba aplikasi sensor ultrasonic SRF05 untuk mengukur jarak dengan mikrokontroler. AVR ATmega16 dan LCD sudah cukup sebagai komponen utama. Buat rangkaiannya seperti berikut ini :Programnya kebetulan saya buat dengan bahasa C, memakai compiler CodeVision AVR.#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#define trigger PORTC.1
#define echo PINC.0
unsigned int jarak;
char buf[33];
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>void ukur_jarak()
{
unsigned int i;
jarak=0;
delay_us(100);
trigger=1; //tout, H=5 us
delay_us(15);
trigger=0;
delay_us(100);
while(!echo);
for (i=0;i<=500;i++)
{
if (echo) {jarak++;}
delay_us(58);
}
}
void main(void)
{
lcd_init(16);
DDRC.O=0;
DDRC.1=1;
lcd_clear ();
lcd_putsf (“SRF05 non timer”);
lcd_gotoxy(0,1);
lcd_putsf (“Range=”);
while (1)
{
ukur_jarak();
sprintf (buf,”%d cm”,jarak);
lcd_gotoxy (6,1);
lcd_puts (buf);
delay_ms(500);
}
}Metode pengukurannya mengikuti timing diagram yang ada di datasheet SRF05. Pada prmograman kali ini saya tidak memakai timer.Nah setelah di-compile trus di-download, hasilnya seperti ini :
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 (idealnya) 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. Berikut saya sertakan keterangan gambar dari konfigurasi pin dan ilustrasi sudut pembacaan dari sensor SRF04 :
Menurut pengamatan dari hasil percobaan selama ini, dibanding dengan sensor ultrasonic lain (ex : PING), saya lebih memilih menggunakan SRF04 karena rentang pembacaan data jarak terhadap noise (ex : sound damper >> yang familiar dengan KRCI pasti tau) cukup presisi akan tetapi dari sisi harga dan penggunaan pin I/O pada microcontroller memang lebih unggul PING. Untuk SRF04 kebanyakan toko menjual dengan harga sekitar 380 - 400 ribu sedangkan PING dipatok sekitar 350 - 375 ribu dan penggunaan pin I/O pada SRF04 menggunakan 2 pin untuk membaca datanya (Trigger & Echo) sedangkan untuk PING cukup menggunakan 1 pin I/O padamicrocontroller (SIG).
Masih ada jenis lain dari sensor jarak keluaran Devantech, seperti SRF02 yang hanya mempunyai 1 transducer yang berfungsi sebagai transreceiverdengan output pembacaan yang dapat diakses melalui komunikasi serial i2C dan UART, kemudian jenis lain yaitu SRF05 yang mirip dengan SRF04 perbedaannya pada jangkauan SRF05 yang dapat mencapai 4m dan terdapat 2 mode operasi menggunakan 1 pin atau 2 pin I/O, SRF08 mampu mengukur jarak dalam rentang 3 cm – 6 m dengan antarmuka I2C (sebagai catatan semakin panjang jangkauannya maka semakin besar pula data error yang dihasilkan dari pembacaan sensor tsb >> baca rumus pembacaan jarak ultrasonic diatas).
Sepertinya ada yang kurang jika saya tidak menyertakan bagaimana cara akses SRF04 pada microcontroller, berikut saya sertakan source codeuntuk SRF04 dengan menggunakan AVR microcontroller ATMEL8535 danLCD 16x2 untuk menampilkan hasil pembacaan sensor SRF04 :
/****************************************************************
This program was produced by the
CodeWizardAVR V1.25.3 Standard
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 4/9/2009
Author : Heri Tri Susanto
Company : the-loba.blogspot.com
Comments:
Chip type : ATmega8535
Program type : Application
Clock frequency : 11.059200 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 128
****************************************************************/
#include
#include
#include
//~~~~~~INISIALISASI PIN SRF04~~~~~~\\
#define pulse_kn PORTB.0
#define echo_kn PINB.1
equ __lcd_port=0x15 ;PORTC
// 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=Out Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=T
PORTA=0x00;
DDRA=0x01;
// Port B 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=T
PORTB=0x00;
DDRB=0x01;
// 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=0x01;
DDRC=0x01;
// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0xFF;
// 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: 10.800 kHz
// Mode: Fast PWM top=00FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: On
// 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=0xA1;
TCCR1B=0x8D;
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;
// LCD module initialization
lcd_init(16);
while (1)
{
count_kn=0;
pulse_kn=0;
pulse_kn=1;
delay_us(10);
pulse_kn=0;
while (echo_kn==0){};
while (echo_kn==1)
{
delay_us(100);
count_kn++;
}
lcd_clear();
lcd_gotoxy(0,1);lcd_puts(kata2);
delay_ms(70);
};
}
Sensor ultrasonic tipe SRF05 ini secara prinsip sama saja dengan sensor ultrasonic PING))). Memancarkan gelombang ultrasonic dengan frekuensi 40 KHz kemudian menunggu sampai pantulan gelombangnya diterima kembali. Tanda kalau gelombang sudah diterima atau belum berupa sinyal HIGH – LOW.
Terdapat 10 pin, tapi kita cukup memakai 4 pin saja (sebenarnya 3 pin juga bisa). Perhatikan gambar berikut :
- Pin 5v untuk koneksi ke tegangan 5V dc.
- Echo Output untuk memantau kondisi logika, apakah gelombang ultrasonic sudah diterima kembali atau belum.
- Trigger Input dipakai untuk memicu pembangkitan gelombang ultrasonic. Berupa sinyal ‘HIGH’ selama minimal 100 us.
- 0 V (GND) dihubungkan ke ground.
Kita coba aplikasi sensor ultrasonic SRF05 untuk mengukur jarak dengan mikrokontroler. AVR ATmega16 dan LCD sudah cukup sebagai komponen utama. Buat rangkaiannya seperti berikut ini :
Programnya kebetulan saya buat dengan bahasa C, memakai compiler CodeVision AVR.
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#define trigger PORTC.1
#define echo PINC.0
unsigned int jarak;
char buf[33];
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>
#include <delay.h>
#include <stdio.h>
#define trigger PORTC.1
#define echo PINC.0
unsigned int jarak;
char buf[33];
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>
void ukur_jarak()
{
unsigned int i;
jarak=0;
delay_us(100);
trigger=1; //tout, H=5 us
delay_us(15);
trigger=0;
delay_us(100);
while(!echo);
for (i=0;i<=500;i++)
{
if (echo) {jarak++;}
delay_us(58);
}
}
void main(void)
{
lcd_init(16);
DDRC.O=0;
DDRC.1=1;
lcd_clear ();
lcd_putsf (“SRF05 non timer”);
lcd_gotoxy(0,1);
lcd_putsf (“Range=”);
while (1)
{
ukur_jarak();
sprintf (buf,”%d cm”,jarak);
lcd_gotoxy (6,1);
lcd_puts (buf);
delay_ms(500);
}
}
{
unsigned int i;
jarak=0;
delay_us(100);
trigger=1; //tout, H=5 us
delay_us(15);
trigger=0;
delay_us(100);
while(!echo);
for (i=0;i<=500;i++)
{
if (echo) {jarak++;}
delay_us(58);
}
}
void main(void)
{
lcd_init(16);
DDRC.O=0;
DDRC.1=1;
lcd_clear ();
lcd_putsf (“SRF05 non timer”);
lcd_gotoxy(0,1);
lcd_putsf (“Range=”);
while (1)
{
ukur_jarak();
sprintf (buf,”%d cm”,jarak);
lcd_gotoxy (6,1);
lcd_puts (buf);
delay_ms(500);
}
}
Metode pengukurannya mengikuti timing diagram yang ada di datasheet SRF05. Pada prmograman kali ini saya tidak memakai timer.
Nah setelah di-compile trus di-download, hasilnya seperti ini :
0 komentar:
Post a Comment