Sunday, April 03, 2011

Hamamatsu UVTron dan AVR

Hamamatsu UVTron dan AVR

Mmhh.. saya pertama kali menggunakan UV Tron (Hamamatsu R2868) sekitar awal 2007 (kalau tidak salah). Saya coba googling penggunaan UV Tron dan AVR, tapi belum menemukan hasil yang memuaskan. Jadi dulu seharian saya mengoprek ATMega8535 dan UV Tron, alhamdulillah akhirnya bisa juga. Well, tulisan kali ini saya akan sharing bagaimana menggunakan AVR (chipnya tidak masalah) dan Hamamatsu UV Tron. Banyak robot fire fighting menggunakan sensor UV ini untuk mendeteksi nyala lilin. Nyala sebuah lilin dapat dideteksi oleh UV Tron yang masih apik hingga jarak 5 meter, bahkan bara rokok juga dapat dideteksi dari jarak lebih dari 5 meter. UV Tron ini mendeteksi ultraviolet dari penggunaan efek photoelektrik dari logam dikombinasikan dengan efek penggandaan gas. Spektral cahaya yang dijangkau adalah 185 - 260 nm, jadi cahaya terlihat tidak mempengaruhi UV Tron (Nah, bagi yang menganggap senstifitas UV Tron dipengaruhi oleh terang tidaknya ruangan sepertinya salah ;) Tapi untuk mengantisipasi kondisi di luar ruangan bisa menggunakan background cancel level pada board - akan saya jelaskan di bawah ). UV Tron ini mempunyai sudut sensitivitas seperti gambar di bawah:



Gambar 1. Sudut jangkauan UV Tron

Dengan jangkauan sudut seperti gambar 1, maka cukup sulit menentukan posisi absolut sebuah lilin. Teknik yang lazim dilakukan adalah menggunakan pelindung untuk mengurangi jangkauan sudut. Pelindung yang digunakan kurang lebih nampak seperti ini:



Gambar 2. UV Tron dengan pelindung (sumber: http://www.superdroidrobots.com/product_info/uvtron_files/image017.jpg)

Dalam kompetisi fire fighting robot seperti Trinity College Fire Fighting Robot Contest (atau kalau di Indonesia adalah KRCI), umumnya robot akan menjelajahi empat ruangan dan mengecek apakah ada lilin atau tidak. Jika kita menggunakan satu UV Tron yang sudah diberi pelindung tentu akan memakan waktu men-scanning posisi absolut lilin di setiap ruangan. Umumnya pemain lama menggunakan 2 UV Tron. Satu UV Tron dengan pelindung untuk menemukan posisi absolut lilin dan satu lagi UV Tron tanpa pelindung untuk mengecek ada tidaknya lilin di ruangan (Biasanya disebut UV Tron global. Jadi robot cukup berada dekat pintu dan mengecek UV Tron global untuk mengetahui apakah ada nyala lilin, dan jika ada baru gunakan UV Tron dengan pelindung untuk mengetahui posisi absolut lilin).



Gambar 3. UV Tron yang terpasang di C3704 (sumber: http://www.superdroidrobots.com/product_info/uvtron_files/image002.gif)

Nah untuk input tegangan, banyak referensi yang cukup membingunkan. Menurut spesifikasi, board C3704 membutuhkan input tegangan 10 - 30V DC. Sebenarnya input tersebut tetap diregulasi oleh C3704 menjadi 5V. Kita bisa melewati regulator pada C3704 dengan memberikan langsung tegangan 5 V ke kaki output regulator C3704. Regulator pada C3704 merupakan regulator 7805 dengan tanda ICI. Ada 4 lubang (3 digunakan oleh regulator) dengan tanda O (output), G (ground), I(input) dan 0 (output). Lubang ke-4 yang bertanda “0″ tidak digunakan dan bisa digunakan sebagai input tegangan 5 V. Perhatikan gambar di bawah ini:



Sekarang saatnya menghubungkan UV Tron dengan AVR. Pastinya Anda beli UV Tron (yang seperti bola lampu) dengan board pengaturnya kan (C3704)? Hubungkan anoda UV Tron (yang kakinya lebih panjang) dengan lubang di C3704 dengan tanda A dan katoda (kaki lebih pendek) dengan lubang bertanda K.

Gambar 4. Hubungan sumber tegangan C3704 (sumber: http://www.superdroidrobots.com/product_info/uvtron_files/image003.gif)

Jika Anda menggunakan sumber tegangan 10 - 30V DC, bisa disambungkan ke lubang dengan tanda “+” dan groundnya tetap ke lubang bertanda “-”. Oh iya, perhatikan seri boardnya! Jika C3704 maka penjelasan di atas dapat diterapkan (seri ini yang saya gunakan), jika C3704-2 maka inputnya bisa langsung 5V, jika C3704-3 inputnya antara 6 - 9V. Hubungan ke AVR adalah melalui lubang Q (lubang dengan tanda 1) dan Q bar (lubang dengan tanda 2). Lubang 1 dan 2 ini merupakan sinyal output berupa pulsa high atau low. Jika diingikan uC untuk membaca masukkan 5v, maka pin uC dihubungkan dengan lubang Q. Jika diinginkan uC untuk membaca kondisi low, maka hubungkan dengan lubang Q bar. Lebar pulsa saat mendeteksi adanya nyala lilin adalah 10ms (tanpa adanya penggunaan kapasitor pada lubang Cx - lihat datasheetnya). Di board C3704 juga terdapat setting jumper berlabel 3, 5, 7 dan 9 (atau disebut setting background cancel level). Jika merasa banyak pancaran cahaya natural bisa diset jumpernya ke 9, defaultnya adalah 3. Jadi saat UV Tron memberikan 3 sampai 9 pulsa ke board dengan interval waktu 2 detik atau kurang, rangkaian pemroses sinyal baru akan memberikan output pulsa yang selebar 10 ms itu (nah banyak pulsa dari UV Tron yang diinginkan bisa diset melalui jumper ini).

Lihat gambar 4. Katakanlah IO line (Q bar) dari C3704 saya hubungkan dengan pin INT2 AVR. Sebenarnya kalau untuk mengetes pulsa output dari C3704 bisa langsung menggunakan logic probe. Tapi saya coba iseng tes pakai AVR dan menampilkannya di LCD. Pertama-tama set waktu lama pembacaan. Lalu set INT2 dengan falling edge (karena kita menggunakan Q bar untuk membaca pulsa output saat low). Rutin INT2 hanya menaikkan variabel (yang menyatakan banyaknya pulsa yang masuk). Lalu tampilkan di LCD variabel tersebut setelah waktu pembacaan selesai. Kurang lebih kodenya seperti berikut:

#include
#include

// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORT A
#endasm
#include

int photon_c;
// External Interrupt 2 service routine
interrupt [EXT_INT2] void ext_int2_isr(void)
{
photon_c++;
}

void scan_candle(void unsigned int time) {
photon_c = 0;

//enable int2 falling edge
GICR|=0x20;

//wait
delay_ms(time);

//disable int2
GICR&=0xdf;
}

void tampil(unsigned char dat)
{
unsigned char data;

data = dat / 100;
data+=0x30;
lcd_putchar(data);

dat%=100;
data = dat / 10;
data+=0x30;
lcd_putchar(data);

dat%=10;
data = dat + 0x30;
lcd_putchar(data);
}

void main(void)
{
int num;

GICR|=0x00;
MCUCR=0x00;
MCUCSR=0x00;
GIFR=0x00;

lcd_init(16);
#asm("sei")

num = 0;
photon_c = 0;
while (1) {
num++;
scan_candle(1000);
lcd_gotoxy(0,0);
tampil(num);
lcd_putchar(0x20);
tampil(photon_c);
delay_ms(1000);
};
}

Kalau tidak mau ambil pusing, bisa saja cek apakah PIN.X pada AVR bernilai low atau high. Jika terhubung dengan Q bar dan PIN.X membaca low, maka dapat dinyatakan UV Tron mendeteksi adanya nyala lilin. Kalau dibuat sederhana, kodenya dapat diubah menjadi seperti ini:

...
#define flame PINB.0

...
unsigned char banyaknya;
while (1) {
if (flame==0) {
banyaknya++;
}
if (banyaknya>=3) {
lcd_putsf("ada lilin");
banyaknya=0;
}
}

Referensi:

* Hamamatsu UVTron Interface to an OOPic Example
* Interfacing a Hamamatsu UVTron to a PIC16F84 Microcontroller
* http://gedex.web.id/archives/2008/05/26/hamamatsu-uv-tron-dan-avr/
Example
* Flame Detection Support

No comments:

Post a Comment

Terima kasih atas komentar yang anda sampaikan , sehingga dapat menambah wawasan saya sebagai penulis dan membuat blog ini semakin berguna banyak orang