Lompat ke konten Lompat ke sidebar Lompat ke footer

Menampilkan nilai RGB suatu object dengan sensor warna TCS230 berbasis AVR ATMega8535

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 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.
006 
008 
009Project :
010Version :
011Date    : 5/15/2009
012Author  : GreenBlack
013Company : LakoV
014Comments:
015 
016Chip type           : ATmega8535
017Program type        : Application
018Clock frequency     : 11.059200 MHz
019Memory model        : Small
020External SRAM size  : 0
021Data Stack size     : 128
022 
023S0 dan S1 5 volt
024S2=0 ; S3=0 -> filter merah
025S2=0 ; S3=1 -> filter biru
026S2=1 ; S3=0 -> filter clear
027S2=1 ; S3=1 -> filter hijau
028*****************************************************/
029 
030#include <mega8535.h>
031#include <stdio.h>
032#include <delay.h>
033#define redref (27795/255)
034#define greenref (33066.7/255)
035#define blueref (34720/255)
036 
037// Alphanumeric LCD Module functions
038#asm
039.equ __lcd_port=0x15 ;PORTC
040#endasm
041#include <lcd.h>
042 
043// Declare your global variables here
044 
045unsigned char lcd_buffer[33];
046unsigned int count, red, green, blue,a=0,b=0,c=0;
047float periode, frekuensi;
048 
049void red_filter()
050{
051PORTA.5=0;
052PORTA.6=0;
053for(a=0; a<=5; a++)
054{
055while(PINB.1 == 0){}
056while(PINB.1 == 1){}
057}
058 
059while(PINB.1 == 0)
060{
061count++;
062}
063 
064while(PINB.1 == 1)
065{
066count++;
067}
068 
069periode = ((float)count*0.0000014400921658986175115207373271889);
070frekuensi = ((float)1/periode);
071red = (frekuensi/redref);
072 
073count=0;
074 
075}
076 
077void green_filter()
078{
079PORTA.5=1;
080PORTA.6=1;
081for(b=0; b<=5; b++)
082{
083while(PINB.1 == 0){}
084while(PINB.1 == 1){}
085}
086 
087while(PINB.1 == 0)
088{
089count++;
090}
091 
092while(PINB.1 == 1)
093{
094count++;
095}
096 
097periode = ((float)count*0.0000014400921658986175115207373271889);
098frekuensi = ((float)1/periode);
099green = (frekuensi/greenref);
100 
101count=0;
102 
103}
104 
105void blue_filter()
106{
107PORTA.5=0;
108PORTA.6=1;
109for(c=0; c<=5; c++)
110{
111while(PINB.1 == 0){}
112while(PINB.1 == 1){}
113}
114 
115while(PINB.1 == 0)
116{
117count++;
118}
119 
120while(PINB.1 == 1)
121{
122count++;
123}
124 
125periode = ((float)count*0.0000014400921658986175115207373271889);
126frekuensi = ((float)1/periode);
127blue = (frekuensi/blueref);
128 
129count=0;
130 
131}
132 
133void main(void)
134{
135// Declare your local variables here
136 
137// Input/Output Ports initialization
138// Port A initialization
139// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
140// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
141PORTA=0x00;
142DDRA=0xFF;
143 
144// Port B initialization
145// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
146// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
147PORTB=0x02;
148DDRB=0x00;
149 
150// Port C initialization
151// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
152// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
153PORTC=0x00;
154DDRC=0x00;
155 
156// Port D initialization
157// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
158// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
159PORTD=0x00;
160DDRD=0x00;
161 
162// Timer/Counter 0 initialization
163// Clock source: System Clock
164// Clock value: Timer 0 Stopped
165// Mode: Normal top=FFh
166// OC0 output: Disconnected
167TCCR0=0x00;
168TCNT0=0x00;
169OCR0=0x00;
170 
171// Timer/Counter 1 initialization
172// Clock source: System Clock
173// Clock value: Timer 1 Stopped
174// Mode: Normal top=FFFFh
175// OC1A output: Discon.
176// OC1B output: Discon.
177// Noise Canceler: Off
178// Input Capture on Falling Edge
179// Timer 1 Overflow Interrupt: Off
180// Input Capture Interrupt: Off
181// Compare A Match Interrupt: Off
182// Compare B Match Interrupt: Off
183TCCR1A=0x00;
184TCCR1B=0x00;
185TCNT1H=0x00;
186TCNT1L=0x00;
187ICR1H=0x00;
188ICR1L=0x00;
189OCR1AH=0x00;
190OCR1AL=0x00;
191OCR1BH=0x00;
192OCR1BL=0x00;
193 
194// Timer/Counter 2 initialization
195// Clock source: System Clock
196// Clock value: Timer 2 Stopped
197// Mode: Normal top=FFh
198// OC2 output: Disconnected
199ASSR=0x00;
200TCCR2=0x00;
201TCNT2=0x00;
202OCR2=0x00;
203 
204// External Interrupt(s) initialization
205// INT0: Off
206// INT1: Off
207// INT2: Off
208MCUCR=0x00;
209MCUCSR=0x00;
210 
211// USART initialization
212// Communication Parameters: 8 Data, 1 Stop, No Parity
213// USART Receiver: On
214// USART Transmitter: On
215// USART Mode: Asynchronous
216// USART Baud rate: 9600
217UCSRA=0x00;
218UCSRB=0x18;
219UCSRC=0x86;
220UBRRH=0x00;
221UBRRL=0x23;
222 
223// Timer(s)/Counter(s) Interrupt(s) initialization
224TIMSK=0x00;
225 
226// Analog Comparator initialization
227// Analog Comparator: Off
228// Analog Comparator Input Capture by Timer/Counter 1: Off
229ACSR=0x80;
230SFIOR=0x00;
231 
232// LCD module initialization
233lcd_init(16);
234 
235count=0;
236PORTA=0b10011000;
237 
238while (1)
239{
240// Place your code here
241red_filter();
242delay_ms(50);
243green_filter();
244delay_ms(50);
245blue_filter();
246delay_ms(50);
247lcd_gotoxy(0,0);
248lcd_clear();
249sprintf(lcd_buffer,"R:%d G:%d B:%d",red,green,blue);
250lcd_puts(lcd_buffer);
251a=0; b=0; c=0;
252};
253}
Link untuk download Full Sourcecode :

Profit Blogger
INCOME BLOGGER