Color Detector Sensor

This page describes a color detector sensor made by Atlas Scientific and how to use it to implement a BriteLED chasing demo.

Description

Atlas Scientific is on a mission to make high-quality sensors for environmental monitoring available to everyday hackers and makers. All of their kits are easy to calibrate and connect to your microcontroller-based project. https://www.sparkfun.com/products/11195

Features

https://www.sparkfun.com/products/11195

  • R,G,B data is in true 8-bit RGB format from 0-255
  • light intensity is output in lux (lx)
  • lx given for R ,G and B as well as full spectrum lx
  • RGB color data and lx can be output simultaneously
  • lx range from 0- 3,235 lux
  • Light saturation indicator if lx is over 3,235
  • Three different output modes:
  • RGB only
  • Lx only
  • RGB and lx
  • Data output is a single comma separated string
  • Simple RS-232 connectivity (voltage swing 0-VCC)
  • Harsh environment ready: NEMA 6P and IP 68 rated
  • Wide operating temperature range: -40 Celsius to +85 Celsius
  • Simple instruction set consisting of only 5 commands
  • Reading time: 620ms
  • Wide operating voltage range: 3.1V to 5.5V
  • Shock resistant to 16 mega Pascals

https://dlnmh9ip6v2uc.cloudfront.net//images/products/1/1/1/9/5/11195-01.jpg

Refresh Rate

This color sensor can only take a measurement every 620 millisecond.

Wiring

https://lh6.googleusercontent.com/-kjRSB24B-F0/Ul8rQMRq9MI/AAAAAAAAAvQ/26xYeqsSVnk/w346-h195/2013-10-16_19-26-35_30.jpg https://lh3.googleusercontent.com/-xRPaXOBRcaw/Ul8sU-S3pnI/AAAAAAAAAvk/X0ioO4__SbE/w346-h390/Screen+Shot+2013-10-16+at+12.23.20+AM.png

mbedshiftbrite with random colorshiftbrite with color sensor
p5DI
p7CI
p22LI
p21E1
p11DI
p13CI
p15LI
p23EI

Code

/* This program demonstrates the ability of a color sensor made by
 * Atlas Scientific through a shiftbrite LED chasing game.
 * Bi Ge bge6@gatech.edu
 */

#include "mbed.h"
DigitalOut latch(p15);
PwmOut enable(p23); // use PWM instead of DigitalOut to dim the LED
Serial color_sensor(p9, p10);

DigitalOut out_latch(p22);
PwmOut out_enable(p21);
SPI spi(p11, p12, p13); // the random shiftbrite
SPI out_spi(p5, p6, p7); // this shiftbrite is attached to the color sensor

// http://mbed.org/users/4180_1/notebook/shiftbrite1/
void RGB_LED(int red, int green, int blue)
{
    unsigned int low_color=0;
    unsigned int high_color=0;
    high_color=(blue<<4)|((red&0x3C0)>>6);
    low_color=(((red&0x3F)<<10)|(green));
    spi.write(high_color);
    spi.write(low_color);
    latch=1;
    latch=0;
}
/* This function is exactly the same as the one above, the only
 * difference is now it outputs value to the second shiftbrite
 */
void out_RGB_LED(int red, int green, int blue)
{
    unsigned int low_color=0;
    unsigned int high_color=0;
    high_color=(blue<<4)|((red&0x3C0)>>6);
    low_color=(((red&0x3F)<<10)|(green));
    out_spi.write(high_color);
    out_spi.write(low_color);
    out_latch=1;
    out_latch=0;
}
void split_RGB(char* color_str)
{
    char *save_ptr; // this ptr is used by strtok_r to save
    // the current parsing state
    char *p = strtok_r(color_str, ",", &save_ptr); // parse with ","
    int red = strtol(p, NULL, 10);
    p = strtok_r(NULL, ",", &save_ptr);
    int green = strtol(p, NULL, 10);
    p = strtok_r(NULL, ",", &save_ptr);
    int blue = strtol(p, NULL, 10);
    out_RGB_LED(red, green, blue);
    return;
}
void get_color()
{
    if(color_sensor.readable()) {
        char str[11];
        int i = 0;
        char c;
        /*
         * The color sensor sends its output in form
         * "rrr,ggg,bbb\r" in char. It can also output the
         * light intensity. See product document.
         */

        while(c=color_sensor.getc()) {
            // wait for the carriage return
            if(c!='\r') {
                str[i] = c;
                i++;
            } else {
                break;
            }
        }
        split_RGB(str);
    }
    return;
}
int main()
{
    int red=0;
    int green=0;
    int blue=0;
    spi.format(16,0);
    spi.frequency(500000);
    out_spi.format(16,0);
    out_spi.frequency(500000);
    enable=0.5; // set PWM to half, full on is too bright
    latch=0;
    out_enable=0.5;
    out_latch=0;
    color_sensor.baud(38400);
    wait(2);
    while(1) {
        red = rand() % 50;
        green = rand() % 50;
        blue = rand() % 50;
        RGB_LED( red, green, blue);
        /* IMPORTANT: The color sensor can only take a measurement every 620ms
         * Have to wait for the instruction to complete.
         */
        get_color();
        wait(1);
    }


}

Program

Import programmini

demo program of color sensor


Please log in to post comments.