Rabu, 29 Juni 2011

PROGRAM MENGAKSES SENSOR JARAK SHARP GP2D12 MENGGUNAKAN CODEVISION AVR

Pada postingan ini saya akan menjelaskan bagaimana cara mengkalibrasi sensor GP2D12 dan programnya menggunakan CodeVision AVR. Akhirnya saya dapat menyelesaikan kalibrasi sensor Sharp GP2D12, dimana saya sebelumnya hanya mencoba program yang berasal dari beberapa blog.

Dari blog tersebut saya mendapatkan persamaan jarak untuk sensor GP2D12 adalah sebagai berikut.
jarak = (1611/data_adc)-3;   (tidak saya rekomendasikan untuk range 10-80 cm)

Ternyata setelah saya coba hasilnya lumayan baik, tetapi hanya pada range 10-40 cm saja. Dikarenakan saya membutuhkan pembacaan yang presisi dan mempunyai range yang cukup lebar yaitu full range (10-80 cm), maka saya mencoba melakukan kalibrasi sendiri dengan menggunakan metode Trendline (fitur dari MS. Excel). Baiklah dibawah ini beberapa penjelasan singkat tentang sensor Sharp GP2D12.

GP2D12 adalah sensor pengukur jarak yang diproduksi oleh Sharp. Sensor ini mengeluarkan sinyal analog dan mampu mengukur jarak pada rentang 10 – 80 cm.

Prinsip kerja sensor inframerah ini dalam mengukur jarak berbeda dengan sensor ultrasonik yang menggunakan waktu pantul gelombang bunyi karena waktu pantul cahaya jelas terlalu singkat untuk dapat diukur. Cahaya inframerah dengan frekuensi 40 kHz dipancarkan dan hasil pantulannya diterima oleh susunan detektor inframerah. Sudut pantulan sinar inframerah akan berubah sesuai jarak sensor dan obyek.

Antarmuka sensor GP2D12 dengan AVR sangatlah mudah, namun sayangnya output analog sensor ini sangatlah tidak linier.

Untuk mengatasi masalah ketidaklinearan sensor tersebut disini saya melakukan kalibrasi menggunakan metode Trendline dengan menggunakan MS. Exel.

Dari hasil kalibrasi yang saya lakukan dengan menggunakan ADC 8 bit, didapat persamaan jarak untuk sensor GP2D12 adalah:


atau jika direalisasikan ke dalam program CodeVision AVR, menjadi:

jarak=(float)((1/((0.04*Vout)-0.006)-0.42));

Nilai dari variabel Vout pada persamaan diatas masih merupakan tegangan keluaran (Volt) sensor GP2D12, sehingga perlu pengubahan dari nilai biner ADC 8 bit ke dalam bentuk tegangan keluaran sensor (Vout) tersebut, caranya:

Vout=read_adc(0);
Vout=Vout/51;

Berdasarkan datasheet GP2D12 perbandingn tegangan keluaran sensor dengan jarak adalah sebagai berikut: 

GAMBAR 1

Terlihat jelas dari grafik diatas bahwa hubungan antara tegangan keluaran sensor dengan jarak sangat tidak linear.

Tetapi menurut application note sensor GP2D12 mempunyai hubungan yang cukup linear antara tegangan keluaran sensor (Vout) dengan 1/(distance+K), K bernilai 0,42 untuk tipe GP2D12. Berukut adalah grafik hubungannya: 

GAMBAR 2

Sumbu X merupakan output sensor sedangkan sumbu Y adalah 1/(distance+K). Berdasarkan grafik diatas kita sudah dapat menggunakan persamaan metode Trendline yang ada pada MS. Exel. Baiklah berikut adalah beberapa langkah panduan melakukan kalibrasi sensor GP2D12:

LANGKAH PERTAMA
Teman-teman harus melakukan pengukuran dari 10-80 cm setiap kelipatan 5. Kemudian me-Record setiap tegangan keluarannya.  Kemudian berikan nilai untuk X=Vout dan untuk Y=1/(distance+K), K=0,42. Teman-teman dapat menggunakan Voltmeter untuk me-Record tegangan keluaran sensor.

Atau jika teman-teman malas menggunakan Voltmeter teman-teman dapat melihat tegangan keluarannya menggunakan sebuah program yang difungsikan untuk menghitung tegangan keluran sensor yang kemudian ditampilkan pada LCD menggunakan mikrokontroler. Untuk programnya dapat mendownloadnya disini.
Berikut adalah hasil yang saya dapatkan:



K=0.42
jarak X=Vout (Volt) Y=1/(distance+k)
10 2.4 0.09596929
15 1.8 0.064850843
20 1.4 0.048971596
25 1.1 0.039339103
30 1 0.03287311
35 0.86 0.028232637
40 0.78 0.024740228
45 0.7 0.022016733
50 0.63 0.019833399
55 0.6 0.018044027
60 0.55 0.016550811
65 0.5 0.015285845
70 0.48 0.014200511
75 0.43 0.013259082
80 0.41 0.012434718

LANGKAH KEDUA
Setelah mendapatkan nilai X dan Y untuk tabel diatas, plot tabel tersebut kedalam grafik pada MS. Exel dengan type grafik XY scatter. Maka akan muncul grafik seperti GAMBAR 2 seperti diatas.

Kemudian klik pada grafik dan pilih menu trendline di MS. Exel, caranya LAYOUT → ANALYSIS → TRENDLINE → MORE TRENDLINE OPTIONS → sesuaikan dengan gambar berikut. Kemudian CLOSE.

 

Maka akan muncul trendline persamaan seperti gambar dibawah ini:

 
 Akhirnya sekarang kita dapat persamaan trendline nya yaitu Y=0.04X-0.006

Disini saya juga menyertakan hasil kalibrasi saya dalam MS. Exel, silakan download disini.

LANGKAH KETIGA (TERAKHIR)
Langkah terakhir ini digunakan untuk mendapatkan persamaan akhir yang akan dipakai pada program untuk menghitung jarak dari sensor Sharp GP2D12.

Caranya:
X=Vout
Y=1/(distance+K) → K=0.42

Disubtitusikan ke persamaan trendline yaitu:
Y=0.04X-0.006

Menjadi:
1/(distance+0.42)=(0.04*Vout)-0.006
Sehingga:
distance=((1/((0.04*Vout)-0.006)-0.42))

Atau dalam program menggunakan CodeVision menjadi:

jarak=(float)((1/((0.04*Vout)-0.006)-0.42));

Nilai dari Vout masih merupakan tegangan keluaran sensor GP2D12, sehingga perlu pengubahan dari nilai biner ADC 8 bit ke dalam bentuk tegangan keluaran sensor (Vout) tersebut, caranya:

Vout=read_adc(0);
Vout=Vout/51;

Berikut adalah listing program lengkap GP2D12, dengan output sensor GP2D12 masuk ke PA0:

//output sensor ke PA0
#include <mega16.h>
#include <lcd.h>
#include <stdlib.h>
#include <delay.h>     

int baca_adc;
float jarak, vo;
char temp[6];

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

#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;
}

void baca_sensor()
{      
baca_adc=read_adc(0);   
vo= (float)baca_adc/51;
}

void gp2d12()
{
jarak=(float)((1/((0.04*vo)-0.006)-0.42));
}

void tampil_lcd()//menampilkan jarak ke LCD
{
        lcd_clear();
        lcd_putsf(“ElectO-cOntrOl”);
        ftoa(jarak,1,temp);//menampilkan nilai jarak yg sesungguhnya
        lcd_gotoxy(0,1);
        lcd_puts(temp);    
        lcd_gotoxy(4,1);
        lcd_putsf(“cm”);
        ftoa(vo,2,temp); //menampilkan nilai dari Vout (tegangan keluaran sensor)
        lcd_gotoxy(9,1);
        lcd_puts(temp);
        delay_ms(2000);
}

void main(void)
{
// 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: 750.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC Auto Trigger Source: None
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0×84;

// LCD module initialization
lcd_init(16);

while (1)
      {
      baca_sensor();
      gp2d12();
      tampil_lcd();
      };
}

Jika anda ingin mendapatkan file program dalam bentuk CodeVision AVR silakan download link dibawah ini.

File program CodeVision AVR mengukur jarak GP2D12

CATATAN: sebenarnya teman-teman sudah bisa langsung menggunakan program diatas, tetapi dikarenakan karakteristik setiap sensor dengan tipe yang sama bisa saja berbeda, maka saya merekomendasikan untuk melakukan kalibrasi terlebih dahulu.

Semoga bermanfaat…

9 komentar:

  1. gimana cara kalibrasinnya mas?

    BalasHapus
  2. silakan dibaca kemudian anda cermati artikel diatas, ketika tidak mengerti baru ditanyakan..

    BalasHapus
  3. Makasih artikelnya mas.
    Oya, saya nyoba di simulasi proteus bisa nyala, namun tampilan LCDnya gk berubah mas, baik itu tegangan maupun jaraknya....gimana penyelesaiannya?

    Trus, saya coba langsung download di hardware, tapi juga sama saja. bahkan, tampilan di LCD gk kluar tulisan sama sekali....solusinya gimana ya?

    Makasih atas jawabannya :)

    BalasHapus
  4. LCD saya koneksikan ke PORT C, silakan dicek kembali... karena program diatas telah saya coba dan berhasil

    BalasHapus
  5. Tumben gk ada simulasi proteusnya mas?? padahal di proteus kan ada sensor GP2D12 nya..... apakah sensor ini tidak dapat disimulasikan di proteus mas?
    thanks

    BalasHapus
    Balasan
    1. saya sudah pernah simulasikan... tetapi hasilnya kurang baik (tidak berjalan seperti sebenarnya). Tetapi aplikasi ini sudah saya coba dihardware yang sesungguhnya dan berjalan lancar... lumayan presisi

      Hapus
  6. mas kalau u mengakses sensor alkohol mq303a dg data yang tdk linier, apakah caranya sama?
    tolong dong bikin project pendeteksi kadar alkohol...

    BalasHapus
  7. mas,sama ga kode avr sensor IR GP2D12 dengan sensor IR GP2D120?saya menggunakan GP2D120 karena deteksi jara terdekatnya bisa dari 4 cm,sedangkan sensor GP2D12 jarak deteksinaya mulai dari 10 cm.mohon pencerahan.

    BalasHapus
  8. mas, saya kmren beli sensor sharp 2d120x f13
    saya cari cara kalibrasi nya di google gak ktmu mas,,
    bisa gak dipakek referensi di blog mas ini untuk sensor saya??
    mksh

    BalasHapus