Jian Chen
/
mini
demo program of color sensor
main.cpp@1:131a940a952c, 2013-10-17 (annotated)
- 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?
User | Revision | Line number | New 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 | } |