Download

11/19/2012

Menampilkan nilai RGB suatu object dengan sensor warna



Kali ini saya akan sharing tentang interfacing module sensor warna tcs230 produksi parallax yang juga telah saya posting pada situs avrfreaks. Dalam pembacaan data, sebenarnya sensor ini cukup rumit karena data outputnya berupa frekuensi pulsa kotak dengan duty cycle 50 %. Maka dari itu diperlukan suatu frekuensi reader. disini saya memfungsikan uC ATMega8535 sebagai pembaca frekuensi. saya tidak menggunakan timer/counter uC untuk menghitung frekuensi yang masuk, melainkan menghitung lama waktu high dan low satu gelombang penuh sebagai periode nya, maka tinggal 1/periode akan menghasilkan nilai frekuensi. pada sourcecode dapat dilihat count++ akan mencacah pada high dan low 1 gelombang penuh. jumlah cacahan tersebut dikalikan dengan lama waktu 1 kali pengulangan count++ sehingga diperoleh periodenya.

modul sensor warna tcs230
sensor ini mempunya 4 buah mode filter warna yaitu mode clear, mode filter merah,mode filter hijau,mode filter biru. disini filter yang dimaksud adalah range panjang gelombang atau lambda  cahaya yang bisa diterima oleh photodioda. grafik range lambda bisa dilihat pada datasheet. output akhir dari sensor ini adalah komposisi warna Red-Green-Blue atau bisa dikenal dengan RGB. unuk bisa mendapakan RGB dari suatu object, maka sensor harus dikalibrasi dulu dengan warna putih sebagai referensinya. jarak pengambilan data harus 2 cm dari sensor. kalibrasi warna putih menggunakan kertas HVS putih.
kalibrasi dilakukan dengan cara mengganti mode filter. yang pertama filter diset mode merah kemudian frekuensinya dicatat dan perlakuan ini berlaku juga untuk filter hijau dan filter biru.  nilai frekuensi yang diperoleh diasumsikan sebagai nilai maksimum atau 255 untuk R ,G dan B. frekuensi maksimum tersebut kemudian dibagi dengan 255 untuk mendapatkan resolusi 8 bit tiap warna. pada project ini, mode filter berganti terus-menerus secara otomatis dengan urutan R-G-B. untuk mengetahui setting dari filter silakan merujuk ke datasheet.
input yang saya gunakan adalah PORTB.1. tetapi anda bisa menggantinya sesuai dengan keinginan anda sendiri. secara berurutan S0,S1,S2,S3 dimasukkan pada PORTA.3 – PORTA.6 dari mikrokontroller. PORTA.7 untuk tegangan LED di sensor.  data RGB tersebut akan ditampilkan pada LCD 16×2. sourcecode ditulis dalam bahasa C dengan kompiler CodeVisionAVR.
Berikut adalah potongan sourcecode yang bisa digunakan :

001/*****************************************************
002This program was produced by the
003CodeWizardAVR V1.25.3 Professional
004Automatic Program Generator
005© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
007
008Project :
009Version :
010Date    : 5/15/2009
011Author  : GreenBlack
012Company : LakoV
013Comments:
014
015Chip type           : ATmega8535
016Program type        : Application
017Clock frequency     : 11.059200 MHz
018Memory model        : Small
019External SRAM size  : 0
020Data Stack size     : 128
021
022*****************************************************/
023
024#include <mega8535.h>
025#include <stdio.h>
026#include <delay.h>
027#define redref (27795/255)
028#define greenref (33066.7/255)
029#define blueref (34720/255)
030
031// Alphanumeric LCD Module functions
032#asm
033.equ __lcd_port=0x15 ;PORTC
034#endasm
035#include <lcd.h>
036
037// Declare your global variables here
038
039void main(void)
040{
041// Declare your local variables here
042
043// Input/Output Ports initialization
044// Port A initialization
045// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
046// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
047PORTA=0x00;
048DDRA=0xFF;
049
050// Port B initialization
051// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
052// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
053PORTB=0x02;
054DDRB=0x00;
055
056// Port C initialization
057// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
058// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
059PORTC=0x00;
060DDRC=0x00;
061
062// Port D initialization
063// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
064// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
065PORTD=0x00;
066DDRD=0x00;
067
068// Timer/Counter 0 initialization
069// Clock source: System Clock
070// Clock value: Timer 0 Stopped
071// Mode: Normal top=FFh
072// OC0 output: Disconnected
073TCCR0=0x00;
074TCNT0=0x00;
075OCR0=0x00;
076
077// Timer/Counter 1 initialization
078// Clock source: System Clock
079// Clock value: Timer 1 Stopped
080// Mode: Normal top=FFFFh
081// OC1A output: Discon.
082// OC1B output: Discon.
083// Noise Canceler: Off
084// Input Capture on Falling Edge
085// Timer 1 Overflow Interrupt: Off
086// Input Capture Interrupt: Off
087// Compare A Match Interrupt: Off
088// Compare B Match Interrupt: Off
089TCCR1A=0x00;
090TCCR1B=0x00;
091TCNT1H=0x00;
092TCNT1L=0x00;
093ICR1H=0x00;
094ICR1L=0x00;
095OCR1AH=0x00;
096OCR1AL=0x00;
097OCR1BH=0x00;
098OCR1BL=0x00;
099
100// Timer/Counter 2 initialization
101// Clock source: System Clock
102// Clock value: Timer 2 Stopped
103// Mode: Normal top=FFh
104// OC2 output: Disconnected
105ASSR=0x00;
106TCCR2=0x00;
107TCNT2=0x00;
108OCR2=0x00;
109
110// External Interrupt(s) initialization
111// INT0: Off
112// INT1: Off
113// INT2: Off
114MCUCR=0x00;
115MCUCSR=0x00;
116
117// USART initialization
118// Communication Parameters: 8 Data, 1 Stop, No Parity
119// USART Receiver: On
120// USART Transmitter: On
121// USART Mode: Asynchronous
122// USART Baud rate: 9600
123UCSRA=0x00;
124UCSRB=0x18;
125UCSRC=0x86;
126UBRRH=0x00;
127UBRRL=0x23;
128
129// Timer(s)/Counter(s) Interrupt(s) initialization
130TIMSK=0x00;
131
132// Analog Comparator initialization
133// Analog Comparator: Off
134// Analog Comparator Input Capture by Timer/Counter 1: Off
135ACSR=0x80;
136SFIOR=0x00;
137
138// LCD module initialization
139lcd_init(16);
140
141count=0;
142PORTA=0b10011000;
143
144while (1)
145{
146// Place your code here
147red_filter();
148delay_ms(50);
149green_filter();
150delay_ms(50);
151blue_filter();
152delay_ms(50);
153lcd_gotoxy(0,0);
154lcd_clear();
155sprintf(lcd_buffer,"R:%d G:%d B:%d",red,green,blue);
156lcd_puts(lcd_buffer);
157a=0; b=0; c=0;
158};
159}

0 komentar:

Post a Comment

Newer Post Older Post Home
Aulia DirUt. Powered by Blogger.
 

Blog Archive

Followers

 

Templates by Nano Yulianto | CSS3 by David Walsh | Powered by {N}Code & Blogger