Using an RGB LED to Detect Colours

 by fjordcarver
Contest WinnerFeatured
cover.jpg
DSC03098.JPG
I am going to show you how you can use an RGB LED and a Cds photocell as a colour sensor for a micro-controller. I will illustrate the method to retrieve a colour using Arduino, and I will show you a how you can verify the colour being scanned with a small Processing sketch.

We will be making this colour sensor on a breadboard, but it is easily transferred onto a prototyping board, and for those who fab their own boards, this would be an awesome kit that is super cheap to throw together. I am sure it would only take about two minutes to write a gerber file for this circuit and make a nice little finished sensor.
 
Remove these adsRemove these ads by Signing Up

Step 1: Gather Some Parts

For this sensor you will need
  • a breadboard (not required, but it is how I will walk you through it.)
  • an RGB LED (alternatively you could use 3 LEDs)
  • A 220 ohm resistor
  • A CdS photocell (these can be salvaged out of all kinds of things like nightlights or garden lamps)
  • An Arduino, or a clone. I am using a RBB in this example
  •  

Tools you will need
  • A computer
  • a cable to upload to your Arduino
1-40 of 46Next »
hexdim26 says: Sep 20, 2012. 8:47 PM
thank you for the idea!!!
shooper3 says: Aug 2, 2012. 2:58 PM
My son is color blind. Often times he'll ask us what color something is. Could this help with that. Is it able to detect colors that are not real brigh, such as in clothing?
_SarahC_ says: Apr 25, 2012. 6:29 AM
This is excellent!

Have you seen any problems with the red color - due to the spike in sensitivity that the LDR has?
fjordcarver (author) in reply to _SarahC_Apr 25, 2012. 7:35 AM
Not so much, balancing against the white and black is important. Basically you are subtracting the reflection recieved from the black (theoretically 'no reflection') before deciding what colour you are seeing. each colour is flashed seperate and has its own balancing value. This does a fairly decent job at correction.
If you are having difficulty with a certain range, you can 'trick' it to perform better by changing your black balance. Might have been a good idea to add a pot for fine tuning without rescanning. Thanks for the compliment. Not much to it, throw one together and play. Cheers.
Little Mom on the Prairie says: Feb 28, 2012. 12:06 PM
This is pretty neat! Thanks for sharing and good luck in the contest. :)
haidamous says: Jan 12, 2012. 9:29 PM
Hello,

I have a project and I need to detect White Red Blue and green colors.
The PIC microcontroller code is done, i just need the schematic to build my project
I must also use 4 sirenges (one for each color) for the color mixing part
I appreciate your prompt help, i need it for my project.
Plzzz

Thank you :D
fjordcarver (author) in reply to haidamousJan 13, 2012. 3:41 AM
Sounds like an interesting project, but it is well beyond the scope of this instructable.
haidamous says: Jan 12, 2012. 10:51 AM
Hello,

I have a project and I need to detect White Red Blue and green colors.
I must also use 4 sirenges (one for each color)
I appreciate your prompt help.

Thank you :D
fjordcarver (author) in reply to haidamousJan 12, 2012. 5:49 PM
This sensor will help you with detecting the colours.
mccoywm says: Jan 5, 2012. 9:45 PM
This is a great project. I documented my results doing the same here http://uscee.wordpress.com/
fjordcarver (author) in reply to mccoywmJan 8, 2012. 11:02 AM
Great Job!! Glad to see that everything works well. Nice documentation too.
Did you try out the processing sketch? It is a quicker way to see the colour.
I noticed that you will be working on getting an LED to light the same colour next, check out my Magical chameleon lamp project if you need any pointers.
Cheers!
Sky-Monkey says: Jan 4, 2012. 10:56 AM
Nicely written -

I will put it together and try it, but until then - curious if know how surface finish/texture of the object being scanned effects the reading. Also, as a derivative of that question, will it sense equally well through a clear film, glass, etc?

Thanks
fjordcarver (author) in reply to Sky-MonkeyJan 4, 2012. 11:14 AM
It should work fine through a film so long as no frequecies are being blocked. Reflectivity will play with the readings a bit.
Cheers.
yardleydobon says: Dec 28, 2011. 12:44 PM
I think it should be noted that the colors output are qualitative only. The RGB values output by this device are from it's own non-standard color space that is not the same as sRGB (i.e. the RGB displayed by a monitor). Your code also assumes that LEDs and photoresistors have linear responses which they do not. Calibration should only need to be done once, if the calibration values are stored in the EEPROM. However, it might be interesting to see what strange colors you get when you calibrate using a non-white target.
fjordcarver (author) in reply to yardleydobonDec 28, 2011. 2:05 PM
I don't claim that the values output by the sensor are the the same output as a monitor, only that it is easy to ouput the colour that the sensor 'sees' to the monitor, given that the values are in the same range. Have you tried it out? Or are you finding flaws in theory? I find that it gives quite accurate results. I.e the colours being displayed on the monitor very closely resemble the object being scanned.
You can certainly mess with the readings by providing a yellow sample in place of white. But that would be true of just about anything. Just try wearing a pair of yellow ski goggles around and see how effective your own colour perception becomes.
yardleydobon in reply to fjordcarverDec 28, 2011. 3:47 PM
I'm not saying that this device doesn't work. I'm sure it works well enough. I'm saying that it should be noted that the results are qualitative only. It can't be used to take accurate, quantitative measurements because of nonlinearites and its unknown color space. Your intro image makes it look like you are using your device to measure sRGB, which it can't do as is. It's not my intention to disparage your work, but simply to clarify your device's limitations.

Also, I suggested calibrating on a non-white target not as a criticism but as a fun way to play with your device.
fjordcarver (author) in reply to yardleydobonDec 28, 2011. 4:24 PM
Try it out. then we can discuss the limitations. It works fantastically, not moderately well. The colour put in front of it IS accurately displayed to the screen. 'nuff said.
I notice that we are in some of same competitions. ;) Cheers.
endolith says: Dec 15, 2011. 8:20 PM
LEDs can be used as sensors, too.
fjordcarver (author) in reply to endolithDec 19, 2011. 7:44 AM
Yes they can, but I don't think they would have the sensitivity for this. Maybe if you took a reading from a Red housing one, a green housing one, and a blue housing one(do they make those) and really padded the numbers.......hmmm, I might look into it in the future. But my gut says that it probably would not have the sensitivity of this setup.
TheDodgyLodger says: Dec 15, 2011. 7:43 PM
I want to incorporate this into a robot run greenhouse so it can tell me when the tomatoes and peppers are ripe.
fjordcarver (author) in reply to TheDodgyLodgerDec 19, 2011. 7:41 AM
Cool idea, I want to see that.
wgrube says: Dec 15, 2011. 2:42 PM
Very nice instructable!
fjordcarver (author) in reply to wgrubeDec 19, 2011. 7:41 AM
Thanks
mathman47 says: Dec 17, 2011. 9:43 PM
Perfect Instructable. I've have everything except for the CDS cell. Making a run to the Shack tomorrow. Very well written - covers the subject very thoroughly. Thanks. Hope you win something with this. I'm now a follower and I voted.
Dennis, KC9PYD
fjordcarver (author) in reply to mathman47Dec 19, 2011. 7:40 AM
Cool, thank you. Let us know how it turned out.
stringstretcher says: Dec 18, 2011. 4:23 AM
A stop light interpreter for blind drivers! I know a few who need this badly. Neat device, great work.
fjordcarver (author) in reply to stringstretcherDec 19, 2011. 7:40 AM
Thanks.
dokcal says: Dec 15, 2011. 10:31 AM
Brilliant idea, and probably the best-written instructable I've ever seen!

I've only ever programmed in BASIC, but your breakdown of the Arduino code was really easy to follow. I wish more people would take the time to explain their code, rather than just presenting it as a "black box."

fjordcarver (author) in reply to dokcalDec 15, 2011. 11:18 AM
Cheers! One of the best comments(compliments) I have received!
It is really great to hear such positive feedback, moreover, I am really glad that people 'get it'.
Thanks again. (I am beaming)
rick6213 says: Dec 15, 2011. 10:20 AM
Really nice instructable, the drawings are great and easy to read and understand!
fjordcarver (author) in reply to rick6213Dec 15, 2011. 11:14 AM
Thanks!!
matt.e.jenkins says: Dec 13, 2011. 7:24 AM
Hey, congrats on the LED contest!!!
fjordcarver (author) in reply to matt.e.jenkinsDec 13, 2011. 8:13 AM
Thanks!! Cheers! I am so excited. This will be the best Christmas ever! A robot shirt for me to hack! I can't wait!!!! I have had a lilypad sitting on a shelf for awhile, keep tossing ideas around for it, but never found the perfect garment.
I think I will no longer have an excuse.
thecapt says: Dec 9, 2011. 4:43 PM
Great timing! I am in the process of writing a routine for a marble sorter and was just going to use a white LED. I was thinking of doing this with RGB, but since I was only concerned with 3 marble colors I assumed that the value from the white LED would vary enough based on color. If it does not, I'll have to try with this RGB style. Even if I don't, this code is a good reference tool. Thank you very much.
fjordcarver (author) in reply to thecaptDec 9, 2011. 6:08 PM
Cheers!
jamian says: Dec 9, 2011. 7:29 AM
I think there is a slight problem here.

Red LEDs work at 2v, green LEDs work at 2.1v, and blue LEDs work at 3.6v.
The resistor should not be on the GND (common). There should be an exclusive resistor per LED. Otherwise, the blue LED will most likely be dimmed in excess.

I might be wrong tho.
fjordcarver (author) in reply to jamianDec 9, 2011. 8:18 AM
We are actually using 5 volts here, so there is more than enough voltage to light each LED. The resistor is to limit the current, and not change the voltage, that would require 2 resistors I think.
So long as you are not trying to light the three together, which we are not in this application, the single resistor is sufficient.
fjordcarver (author) in reply to fjordcarverDec 9, 2011. 8:29 AM
Further to the point, the code takes care of a good portion of correcting for different outputs of LEDs anyways, being that it balances against both black and white, and individually for each colour value (red,green,blue), so a different quality of light (dimmer slighty or brighter).
Not that it is a problem with this particular setup, but you can get quite good results even if you are using three seperate LEDs of different quality. (see my chameleon lamp, it uses three LEDs from a dollar store toy...on one resistor as well)
I hope this alleviates your concerns, go try it out, you will be surprised at how well it works.
Event Horizon says: Dec 9, 2011. 6:25 AM
Nice! I've done a similar thing before, but yours is nicer.
matt.e.jenkins says: Dec 7, 2011. 11:49 AM
Very cool, Thanks for writing this out.
1-40 of 46Next »
Pro

Get More Out of Instructables

Already have an Account?

close

PDF Downloads
As a Pro member, you will gain access to download any Instructable in the PDF format. You also have the ability to customize your PDF download.

Upgrade to Pro today!