demo program of color sensor

Dependencies:   mbed

Committer:
chenjian221
Date:
Thu Oct 17 00:05:21 2013 +0000
Revision:
1:131a940a952c
Parent:
0:07ac8eb1700b
add comments, change enable from DigitalOut to PwmOut

Who changed what in which revision?

UserRevisionLine numberNew contents of line
chenjian221 0:07ac8eb1700b 1
chenjian221 1:131a940a952c 2 /* This program demonstrates the ability of a color sensor made by
chenjian221 1:131a940a952c 3 * Atlas Scientific through a shiftbrite LED chasing game.
chenjian221 1:131a940a952c 4 * Bi Ge bge6@gatech.edu
chenjian221 1:131a940a952c 5 */
chenjian221 1:131a940a952c 6
chenjian221 1:131a940a952c 7 #include "mbed.h"
chenjian221 0:07ac8eb1700b 8 DigitalOut latch(p15);
chenjian221 1:131a940a952c 9 PwmOut enable(p23); // use PWM instead of DigitalOut to dim the LED
chenjian221 0:07ac8eb1700b 10 Serial color_sensor(p9, p10);
chenjian221 0:07ac8eb1700b 11
chenjian221 0:07ac8eb1700b 12 DigitalOut out_latch(p22);
chenjian221 1:131a940a952c 13 PwmOut out_enable(p21);
chenjian221 1:131a940a952c 14 SPI spi(p11, p12, p13); // the random shiftbrite
chenjian221 1:131a940a952c 15 SPI out_spi(p5, p6, p7); // this shiftbrite is attached to the color sensor
chenjian221 0:07ac8eb1700b 16
chenjian221 1:131a940a952c 17 // http://mbed.org/users/4180_1/notebook/shiftbrite1/
chenjian221 0:07ac8eb1700b 18 void RGB_LED(int red, int green, int blue)
chenjian221 0:07ac8eb1700b 19 {
chenjian221 0:07ac8eb1700b 20 unsigned int low_color=0;
chenjian221 0:07ac8eb1700b 21 unsigned int high_color=0;
chenjian221 0:07ac8eb1700b 22 high_color=(blue<<4)|((red&0x3C0)>>6);
chenjian221 0:07ac8eb1700b 23 low_color=(((red&0x3F)<<10)|(green));
chenjian221 0:07ac8eb1700b 24 spi.write(high_color);
chenjian221 0:07ac8eb1700b 25 spi.write(low_color);
chenjian221 0:07ac8eb1700b 26 latch=1;
chenjian221 0:07ac8eb1700b 27 latch=0;
chenjian221 0:07ac8eb1700b 28 }
chenjian221 1:131a940a952c 29 /* This function is exactly the same as the one above, the only
chenjian221 1:131a940a952c 30 * difference is now it outputs value to the second shiftbrite
chenjian221 1:131a940a952c 31 */
chenjian221 0:07ac8eb1700b 32 void out_RGB_LED(int red, int green, int blue)
chenjian221 0:07ac8eb1700b 33 {
chenjian221 0:07ac8eb1700b 34 unsigned int low_color=0;
chenjian221 0:07ac8eb1700b 35 unsigned int high_color=0;
chenjian221 0:07ac8eb1700b 36 high_color=(blue<<4)|((red&0x3C0)>>6);
chenjian221 0:07ac8eb1700b 37 low_color=(((red&0x3F)<<10)|(green));
chenjian221 0:07ac8eb1700b 38 out_spi.write(high_color);
chenjian221 0:07ac8eb1700b 39 out_spi.write(low_color);
chenjian221 0:07ac8eb1700b 40 out_latch=1;
chenjian221 0:07ac8eb1700b 41 out_latch=0;
chenjian221 0:07ac8eb1700b 42 }
chenjian221 0:07ac8eb1700b 43 void split_RGB(char* color_str)
chenjian221 0:07ac8eb1700b 44 {
chenjian221 1:131a940a952c 45 char *save_ptr; // this ptr is used by strtok_r to save
chenjian221 1:131a940a952c 46 // the current parsing state
chenjian221 1:131a940a952c 47 char *p = strtok_r(color_str, ",", &save_ptr); // parse with ","
chenjian221 0:07ac8eb1700b 48 int red = strtol(p, NULL, 10);
chenjian221 0:07ac8eb1700b 49 p = strtok_r(NULL, ",", &save_ptr);
chenjian221 0:07ac8eb1700b 50 int green = strtol(p, NULL, 10);
chenjian221 0:07ac8eb1700b 51 p = strtok_r(NULL, ",", &save_ptr);
chenjian221 0:07ac8eb1700b 52 int blue = strtol(p, NULL, 10);
chenjian221 0:07ac8eb1700b 53 out_RGB_LED(red, green, blue);
chenjian221 0:07ac8eb1700b 54 return;
chenjian221 0:07ac8eb1700b 55 }
chenjian221 0:07ac8eb1700b 56 void get_color()
chenjian221 0:07ac8eb1700b 57 {
chenjian221 0:07ac8eb1700b 58 if(color_sensor.readable()) {
chenjian221 0:07ac8eb1700b 59 char str[11];
chenjian221 0:07ac8eb1700b 60 int i = 0;
chenjian221 0:07ac8eb1700b 61 char c;
chenjian221 1:131a940a952c 62 /*
chenjian221 1:131a940a952c 63 * The color sensor sends its output in form
chenjian221 1:131a940a952c 64 * "rrr,ggg,bbb\r" in char. It can also output the
chenjian221 1:131a940a952c 65 * light intensity. See product document.
chenjian221 1:131a940a952c 66 */
chenjian221 1:131a940a952c 67
chenjian221 0:07ac8eb1700b 68 while(c=color_sensor.getc()) {
chenjian221 1:131a940a952c 69 // wait for the carriage return
chenjian221 0:07ac8eb1700b 70 if(c!='\r') {
chenjian221 0:07ac8eb1700b 71 str[i] = c;
chenjian221 0:07ac8eb1700b 72 i++;
chenjian221 0:07ac8eb1700b 73 } else {
chenjian221 0:07ac8eb1700b 74 break;
chenjian221 0:07ac8eb1700b 75 }
chenjian221 0:07ac8eb1700b 76 }
chenjian221 0:07ac8eb1700b 77 split_RGB(str);
chenjian221 0:07ac8eb1700b 78 }
chenjian221 0:07ac8eb1700b 79 return;
chenjian221 0:07ac8eb1700b 80 }
chenjian221 0:07ac8eb1700b 81 int main()
chenjian221 0:07ac8eb1700b 82 {
chenjian221 0:07ac8eb1700b 83 int red=0;
chenjian221 0:07ac8eb1700b 84 int green=0;
chenjian221 0:07ac8eb1700b 85 int blue=0;
chenjian221 0:07ac8eb1700b 86 spi.format(16,0);
chenjian221 0:07ac8eb1700b 87 spi.frequency(500000);
chenjian221 0:07ac8eb1700b 88 out_spi.format(16,0);
chenjian221 0:07ac8eb1700b 89 out_spi.frequency(500000);
chenjian221 1:131a940a952c 90 enable=0.5; // set PWM to half, full on is too bright
chenjian221 0:07ac8eb1700b 91 latch=0;
chenjian221 1:131a940a952c 92 out_enable=0.5;
chenjian221 0:07ac8eb1700b 93 out_latch=0;
chenjian221 0:07ac8eb1700b 94 color_sensor.baud(38400);
chenjian221 0:07ac8eb1700b 95 wait(2);
chenjian221 0:07ac8eb1700b 96 while(1) {
chenjian221 0:07ac8eb1700b 97 red = rand() % 50;
chenjian221 0:07ac8eb1700b 98 green = rand() % 50;
chenjian221 0:07ac8eb1700b 99 blue = rand() % 50;
chenjian221 0:07ac8eb1700b 100 RGB_LED( red, green, blue);
chenjian221 1:131a940a952c 101 /* IMPORTANT: The color sensor can only take a measurement every 620ms
chenjian221 1:131a940a952c 102 * Have to wait for the instruction to complete.
chenjian221 1:131a940a952c 103 */
chenjian221 0:07ac8eb1700b 104 get_color();
chenjian221 0:07ac8eb1700b 105 wait(1);
chenjian221 0:07ac8eb1700b 106 }
chenjian221 1:131a940a952c 107
chenjian221 0:07ac8eb1700b 108
chenjian221 0:07ac8eb1700b 109 }