Color sensor
I built this color sensor to equip my third
implementaton of brick sorter. Michael
Gasperi presents such a sensor in an article
of Nuts and Volts magazine. His circuit is based on an input
multiplexor. Three CdS photo-resistors, connected to this multiplexor,
receive light through RGB colored filters (cleverly done with
Lego transparent bricks).
This one takes a somewhat opposite route: a
multiplexor (similar to Michael's) drives three RGB leds that
cast light onto the object. Reflected light is measured by a
single photo-resistor. Another (non-Lego) home
built color sensor, based on the same idea, can be found
in David Cook's robotics pages.
Circuit
analysis
The heart of this circuit is a CD4017 (IC1), CMOS counter
with decoded output. On each pulse received on its clock input,
this IC drives high the next output (all the other are driven
low).
Output 0, 1 and 2 drives
red, green and blue LEDs through transistors Q2, Q3, Q4 (emitter
follower is used to avoid the need of a base resistor). During
the first three phases, output 4 is driven low and provide ground
reference for photo-resistor R8: the RCX can read light level
reflected in each color. In phase 4 photo-resistor is no longer
grounded, value returned to RCX is maximum (note the 1 Mohm
resistor paralleled with R8 to prevent maximum value to be reached
in phases 1/2/3). RCX can detect this special condition and
synchronize its readings to CD4017 state.
The oscilloscope hard-copy shows clock pulse
on top trace, output 1/2/3 below.
To generate a clock pulse,
you have to switch from active sensor mode (sensor voltage is
higher than Zener D4 threshold, Q1 is conducting, clock input
is low) to passive sensor mode (sensor voltage is lower than
D4 threshold, Q1 is blocked, clock input is high) and back to
active sensor. C1 filters out short power supply pulses occuring
in active mode evey 3ms while RCX reads value.
The oscilloscope hard-copy shows clock pulse
on top trace, sensor voltage on bottom trace showing 2 short
reading pulses and wide command pulse generated by sensor mode
switching.
When reaching step 5, CD4017 activates D04 and reset itself
to step1 through R4/C3. This RC network delays reset pulse well
after clock transition: without it, the current rush of the
LED, coupled through power supply, modifies clock threshold
and CD4017 goes directly to step 2...
Power supply is rectified by D1 and filtered
by C2. As in my other sensors, I keep on with single diode instead
of full bridge to minimize components count (3 diodes instead
of 8!) but as you can see I built the breadboard with a full
bridge module I constructed to ease my prototypes.
The power-supply
module I use for breadboards.
|
The breadboard
|
Component selection
Nothing is really critical: D1 to D3 are small signal diodes
(i.e. 1N4148), Q1 to Q4 are general purpose NPN transistors
(BC548, 2N2222...). Photo-resistor I used is a MPY54C569
(any similar size LDR will probably work fine). Leds are high
efficiency 3mm ones. I used Agilent: red HLMP-K105
for D5, blue HLMP-KB45
for D8, green HLMP-1540
for D6 and D7. I was somewhat disappointed by green Leds efficiency.
Though the photoresistor has its peak sensitivity around green
wavelength, read value was fairly low with green lighting. After
testing different Led types and brands, I finally chose to use
two green leds with maximum current. Even then color sensor
sometimes has troubles to distinguish between green and black
(!) Lego bricks... Green bricks reflects surprisingly very little
light, I guess the problem is that my green leds have a too
yellowish wavelength. Most of the components were bought from
Farnell.
Led current is limited by R5, R6 and R7. To
set their values, I placed the breadboard in front of a white
piece of paper and adjusted them to get about the same reading
for all colors.
Building
color sensor: photo gallery
Test
programs
test programs (requires
RCX 2.0 firmware that you can get here)
Real
applications
Brick Sorter 3: see it
here
!
Color follower: when I was a Mindstorms
newbie, I tried the roverbot-and-light-sensor line follower
on my tiled floor. Unfortunately there is not enough contrast
between tiles to be able to get a reliable working. With
the color sensor, the difference between blue and red channels
enables to tell blue from grey tiles and is relatively independent
of ambient light level. The robot must be slow though because
of the time it takes to cycle through color sensor states.
Get NQC program for the color
follower.
Color follower on tiled floor
|
QuickTime movie of the color follower (200K)
|