Jumat, 29 Januari 2010

perogram

Program Mikrokontroler AVR Untuk Sensor GP2D12 Menggunakan CVAVR

Posted by adjie on December 15th, 2008

GP2D12 adalah sensor pengukur jarak yang diproduksi oleh Sharp. Sensor ini mengeluarkan sinyal analog dan mampu mengukur jarak pada rentang 10 – 80 cm. Versi lain dari jenis ini adalah GP2D15 yang mengeluarkan sinyal biner (0 atau 1 saja) dengan treshold 24 cm (dan ternyata cukup sulit untuk mengatur treshold ini) dan GP2D02 dengan output serial digital.
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, terutama karena telah terdapat ADC internal yang dimiliki AVR. Namun sayangnya output analog sensor ini sangatlah tidak linier. Ada beberapa cara yang dapat dilakukan untuk mengatasi hal ini, yaitu

* lookup table
* interpolasi
* persamaan non-linier

Untuk melakukan ketiga cara tersebut diperlukan data hubungan input-output yang dapat diperoleh dari datasheet ataupun proses kalibrasi. Pada tulisan ini yang digunakan adalah cara ketiga.
Hal pertama yang dilakukan adalah melakukan kalibrasi. Tabel 1 di bawah ini menunjukkan hasil kalibrasi yang telah dilakukan menggunakan ADC 8 bit dan tegangan referensi VCC.
data_adc jarak,cm
120 10
88 15
69 20
57 25
49 30
42 35
37 40

Meskipun jarak tidak proporsional terhadap data_adc, namun ternyata mempunyai hubungan yang cukup linier terhadap 1/data_adc (tabel 2)
1/data_adc jarak,cm
0.008333 10
0.011364 15
0.014493 20
0.017544 25
0.020408 30
0.02381 35
0.027027 40
Gambar 1 menunjukkan hasil grafik yang diperoleh dari tabel 2 beserta persamaan korelasinya yang dapat dibuat dengan mudah menggunakan sembarang software spreadsheet. Pada MS Excel cukup menambahkan trendline pada grafik.

Dari gambar 1 diperoleh persamaan (setelah dibulatkan)
jarak = (1611/data_adc)-3
Meskipun ketelitiannya hanya dalam orde cm, namun sudah cukup memadai untuk berbagai macam aplikasi, misalnya untuk deteksi jarak pada robot.
Program yang dibuat cukup sederhana. Jika menggunakan wizard yang diatur adalah ADC (8 bit dan tegangan referensi VCC) dan LCD (PORTC). Sebuah sensor GP2D12 dihubungkan dengan input 0 ADC (PINA.0).
Inti dari program ini adalah fungsi baca_gp2d12
unsigned char baca_gp2d12()
{
data_adc=read_adc(0);
jrk=(1611/data_adc)-3;
return jrk;
}
Fungsi ini mengambil data dari input 0 ADC, yang kemudian hasilnya dimasukkan ke persamaan hasil kalibrasi untuk memperoleh jarak dalam cm.
Hal yang perlu diperhatikan dalam penggunaan sensor GP2D12 adalah :

* Hasil dari proses kalibrasi tergantung banyak hal. Untuk itu sebaiknya persamaan yang digunakan berasal data hasil kalibrasi anda sendiri.
* Output sensor ini akan menghasilkan pembacaan yang salah untuk pengukuran jarak kurang dari 8 cm. Cara pemecahan paling sederhana adalah dengan mengatur posisi sensor sehingga obyek tidak akan berjarak kurang dari 8 cm. Misalnya jika dipasang pada robot maka sensor tidak dipasang di tepi badan robot, namun agak masuk di tengah badan robot.

Dibandingkan dengan sensor jarak ultrasonik, seperti PING atau SRF04, harga GP2D12 relatif lebih murah, namun rentang dan jangkauan pengukurannya lebih sempit (10-80 cm) dibanding PING dan SRF04 yang berkisar antara 3 cm – 3 m.
Selain itu karena outputnya analog diperlukan ADC. Meski demikian keberadaan mikrokontroler dengan ADC internal, seperti seri AVR, mempermudah penggunaan sensor ini.
Berikut adalah program selengkapnya untuk membaca data dari GP2D12 dan menampilkannya pada LCD menggunakan ATMEGA8535 dan kristal 4 MHz. Output GP2D12 dihubungkan dengan PINA.0 sedangkan LCD dengan PORTC. 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 : GP2D12
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

#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;
// Start the AD conversion
ADCSRA|=0×40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0×10)==0);
ADCSRA|=0×10;
return ADCH;
}

// Declare your global variables here
unsigned char data_adc;
unsigned char kata[16];
unsigned char jrk;
unsigned char jarak;

// Fungsi untuk membaca data GP2D12
unsigned char baca_gp2d12()
{
//ambil data ADC
data_adc=read_adc(0);
//masukkan ke dalam persamaan hasil kalibrasi
//untuk mendapatkan jarak dalam cm
jrk=(1611/data_adc)-3;
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=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=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;

// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: None
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE;
ADCSRA=0×85;
SFIOR&=0xEF;

// LCD module initialization
lcd_init(16);

while (1)
{
// Place your code here
jarak=baca_gp2d12();
sprintf(kata,”Jarak = %2d cm”,jarak);
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(kata);
delay_ms(500);
};
}

Sumber Pustaka

* Braunl, Embedded Robotics, Mobile Robot Design and Applications with Embedded Systems, Springer, 2006
* McComb & Priedko, Robot Builder’s Bonanza, McGraw-Hill, 2006.
* ___, Datasheet GP2D12/GP2D15, Sharp.

Posted in Uncategorized | No Comments »
Program Mikrokontroler AVR Untuk Sensor SRF04 Menggunakan CVAVR

Posted by adjie on December 15th, 2008

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.

1 komentar: