• Content count

  • Joined

  • Last visited

Community Reputation

0 Neutral

About panlyu

  • Rank
  1. Hello,I want to share an interesting project of designing a color detector by using RGB LEDs with you. If you have any interests, then keep on reading. Have you ever wanted an automated way to detect the color of an object? By shining light of a certain color on the object and looking at how much light is reflected back, you can tell what color the object is. For example, if you shine a red light on a red object, that light will be reflected back. If you shine a blue light on a red object, the object will absorb some of that light and less of it will be reflected back. Step 1: Parts Needed I used a PIC 16F887 Microcontroller, but almost any with a pulse-width-modulation capability will work. 1 RGB LED ( 1 Microcontroller ( 1 Standard red LED 1 1k ohm resistor 1 Photoresistor (changes resistance depending on the amount of light shone on it) Some wires I only need the microcontroller and RGB LED to have a wide range of color detectors, but if you only want a circuit that detects one color, you don't need a microcontroller - you only need a bright LED of the color you want to detect. The standard red LED is the "indicator LED" - it lights up when the right color is detected. Step 2: Build the Circuit The schematic is rather simple, and in general form, is shown below. The RGB LED is externally powered by a PWM signal. I put electrical tape around the photoresistor so ambient light doesn't get in - only the light directly above it will be detected. Step 3: The Code This code was written for a Microchip PIC 16F887, but hopefully you can get the general idea. I used the built-in potentiometer on my development board to vary the color spectrum of the RGB LED (and it doesn't go through the entire spectrum because I don't have 3 PWM modules, but it's good enough) Comments included. #include <16F887.h> #include <delay.h> #include "delay.c" #include <stdlib.h> #include <STRING.h> #use delay(clock = 4000000) #FUSES INTRC,NOWDT,NOPUT,NOMCLR,NOPROTECT,NOCPD,NOBROWNOUT,NOIESO,NOFCMEN,NOLVP #byte CCP1CON = 0x17 #byte CCP2CON = 0x1D #byte PWM1CON = 0x9B int value = 128; int p1 = 0; int p2 = 0; void my_setup_ccp1(int8 value) { output_low(PIN_C2); CCP1CON = value; PWM1CON = 0; } void my_setup_ccp2(int8 value) { output_low(PIN_C1); CCP2CON = value; } //=================================== void main() { //A4 = power source for photodiode output_high(PIN_A4); output_high(PIN_B1); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(0); setup_adc_ports(sAN0); //Timer/Interrupt setup enable_interrupts(INT_TIMER2); my_setup_ccp1(CCP_PWM); my_setup_ccp2(CCP_PWM); setup_timer_2(T2_DIV_BY_1, 128, 1); //setup_compare(2,COMPARE_PWM|COMPARE_TIMER2); while(1){ // Prevent PIC from going to sleep. //SET PWM DUTY CYCLE output_high(PIN_A5); //Pin A3 is the photodiode connection if(input(PIN_A3) == 1) output_high(PIN_A4); else output_low(PIN_A4); //Read value of potentiometer to change color of LED value = read_adc(); switch (value) { case 0: p1 = value; output_low(PIN_C0); p2 = value; break; case 50: p1 = value; output_high(PIN_C0); p2 = value; break; case 100: p1 = value; output_high(PIN_C0); p2 = value; break; case 150: output_high(PIN_C0); p1 = 50; p2 = value; break; case 200: output_low(PIN_C0); p1 = 0; p2 = value; break; case 250: p1 = 0; p2 = value; output_low(PIN_C0); break; } p1 = value; p2 = 128 - p1; set_pwm1_duty(p1); set_pwm2_duty(p2); } } Step 4: Applications! A simple color detector like this can be used in robotics, or for cool projects like separating legos by color, sorting M&Ms;, or as an aid for color blindness. Hopefully this guide was helpful in enhancing a project you had in mind! LEDs are good for so many things....