Sharp GP2D12 adalah sensor jarak dengan output analog yang menggunakan infrared untuk mendeteksi jarak antara 10 cm sampai 80 cm. GP2D12 mengeluarkan output voltase non-linear dalam hubungannya dengan jarak objek dari sensor dan menggunakan interface analog to digital converter (ADC).
Bentuk Fisik
Spesifikasi Teknis
• Range:10 to 80cm
• Update frequency / period:25Hz / 40ms
• Direction of the measured distance:Very directional, due to the IR LED
• Max admissible angle on flat surface:> 40°
• Power supply voltage:4.5 to 5.5V
• Noise on the analog output:< 200mV
• Mean consumption:35mA
• Peak consumption:about 200mA
Proses Pengukuran
Kelemahan
• Respon 40ms
• Error bila Jarak<10cm dan pada Cermin
• Hanya dapat mengukur <80cm
Kelebihan
• Dapat mengukur jarak pada bidang miring
• Sudut pengukuran sempit
• Sangat direktif
Berikut hubungan antara jarak deteksi objek terhadap output analog sensor.
Ada banyak cara tentunya untuk mencari persamaan dari kurva diatas untuk menentukan jarak dari nilai analog sensor tersebut. Salah satunya dengan cara sampling data dan kemudian menentukan persamaan dari kurva respon voltage terhadap jarak objek. Berikut percobaan yang saya lakukan dengan contoh sampel kurva respon di atas dengan menggunakan excel.
10 | 2.4 |
15 | 1.8 |
20 | 1.4 |
25 | 1.1 |
30 | 1 |
35 | 0.86 |
40 | 0.78 |
45 | 0.7 |
50 | 0.63 |
55 | 0.6 |
60 | 0.55 |
65 | 0.5 |
70 | 0.48 |
75 | 0.43 |
80 | 0.41 |
jarak | volt |
jika x^0.8519 susah direpresentasikan dalam bahasa programming, maka kita cari nilai yang mendekati dari x^0.8519
10 | 7.11E+00 |
15 | 1.00E+01 |
20 | 1.28E+01 |
25 | 1.55E+01 |
30 | 1.81E+01 |
35 | 2.07E+01 |
40 | 2.32E+01 |
45 | 2.56E+01 |
50 | 2.80E+01 |
55 | 3.04E+01 |
60 | 3.27E+01 |
65 | 3.50E+01 |
70 | 3.73E+01 |
75 | 3.96E+01 |
80 | 4.18E+01 |
jarak | jarak^0.67 |
persamaan linier yang mendekati jarak^0.8519 adalah 0.4918jarak + 3.0641
jadi persamaan yang kita dapat adalah volt=17.6951/(0.4918jarak + 3.0641)
Berikut adalah tabel pengecekan dari persamaan di atas.
10 | 2.2168477 |
15 | 1.69475438 |
20 | 1.37170254 |
25 | 1.15209224 |
30 | 0.99309691 |
35 | 0.87266424 |
40 | 0.77828212 |
45 | 0.70232307 |
50 | 0.63987257 |
55 | 0.58762133 |
60 | 0.54325942 |
65 | 0.50512545 |
70 | 0.47199394 |
75 | 0.44294114 |
80 | 0.41725755 |
jarak | volt |
Berikut adalah tabel hasil perbandingan persentase error antara data sampel dan data dari persamaan.
Hasil | Data awal | Selisih | Persentase Error | ||
10 | 2.2168477 | 2.4 | 0.183152 | 7.631346 | % |
15 | 1.69475438 | 1.8 | 0.105246 | 5.846979 | % |
20 | 1.37170254 | 1.4 | 0.028297 | 2.021247 | % |
25 | 1.15209224 | 1.1 | -0.05209 | 4.735659 | % |
30 | 0.99309691 | 1 | 0.006903 | 0.690309 | % |
35 | 0.87266424 | 0.86 | -0.01266 | 1.472586 | % |
40 | 0.77828212 | 0.78 | 0.001718 | 0.220242 | % |
45 | 0.70232307 | 0.7 | -0.00232 | 0.331867 | % |
50 | 0.63987257 | 0.63 | -0.00987 | 1.567074 | % |
55 | 0.58762133 | 0.6 | 0.012379 | 2.063111 | % |
60 | 0.54325942 | 0.55 | 0.006741 | 1.225561 | % |
65 | 0.50512545 | 0.5 | -0.00513 | 1.025089 | % |
70 | 0.47199394 | 0.48 | 0.008006 | 1.667929 | % |
75 | 0.44294114 | 0.43 | -0.01294 | 3.009568 | % |
80 | 0.41725755 | 0.41 | -0.00726 | 1.770135 | % |
jarak | volt | volt |
(17.6951/volt) = 0.4918jarak + 3.0641
(17.6951/volt) – 3.0641 = 0.4918jarak
jarak= (35.9803/volt) – 6.2304
jika dalam 8-bit adc, maka nilai adc (misal referensi voltage 5 volt) harus dikonversi ke volt, volt = adc*(5/255)
jarak= (35.9803/(adc*(5/255))) – 6.2304
jarak= (1834.9953/adc) – 6.2304
berikut file excel dari uraian perhitungan di atas. wangready.wordpress.com–gp2d12.
Kode dalam CodeVision AVR
Berikut contoh program dengan menggunakan mikrokontroler ATMega8535, xtal=11.059200 MHz, pin ADC untuk sensor = PINA0, PORT LCD = PORTD. Atau bisa download dalam bentuk CVAVR project berikut. http://www.mediafire.com/file/ogus3zlhpp9um28/GP2D12.rar
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Evaluation
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 4/2/2011
Author : Freeware, for evaluation and non-commercial use only
Company :
Comments:
Chip type : ATmega8535
Program type : Application
AVR Core Clock frequency: 11.059200 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 128
*****************************************************/
#include
#include
// Alphanumeric LCD Module functions
#include
#include
#define ADC_VREF_TYPE 0×60
// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0×40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0×10)==0);
ADCSRA|=0×10;
return ADCH;
}
unsigned char gp2d12()
{
unsigned char jarak;
jarak = (unsigned char)((1854.9953/(float)read_adc(0)) – 6.2304); //read_adc(0) membaca nilai analog dari PINA0
//nilai ADC sudah dikonversi dengan mengalikan konstanta yang dibagi dengan perbandingan konversi ADC return jarak;
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
unsigned char kata[16];
// 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=0×00;
DDRA=0×00;
// 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=0xFF
// OC0 output: Disconnected
TCCR0=0×00;
TCNT0=0×00;
OCR0=0×00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 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: Timer2 Stopped
// Mode: Normal top=0xFF
// 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;
// USART initialization
// USART disabled
UCSRB=0×00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;
// ADC initialization
// ADC Clock frequency: 691.200 kHz
// ADC Voltage Reference: AVCC pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: ADC Stopped
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0×84;
SFIOR&=0xEF;
// SPI initialization
// SPI disabled
SPCR=0×00;
// TWI initialization
// TWI disabled
TWCR=0×00;
// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS – PORTD Bit 0
// RD – PORTD Bit 1
// EN – PORTD Bit 2
// D4 – PORTD Bit 4
// D5 – PORTD Bit 5
// D6 – PORTD Bit 6
// D7 – PORTD Bit 7
// Characters/line: 16
lcd_init(16);
while (1)
{
// Place your code here
sprintf(kata,”jarak=%d”,gp2d12());//menyusun karakter dengan menggunakan fungsi sprinf
lcd_clear(); //membersihkan layar LCD
lcd_gotoxy(0,0); //mengatur kursor LCD menuju koordinat 0,0
lcd_puts(kata); //mengirim data LCD
delay_ms(300); //delay agar perubahan dari lcd_clear tidak terlalu cepat
}
}
Pustaka: http://wangready.wordpress.com
No comments:
Post a Comment