|
|
Riadok 1: |
Riadok 1: |
− |
| |
| == Software for Color Sensors == | | == Software for Color Sensors == |
− |
| |
− |
| |
− | Demo program:
| |
− |
| |
− | <source lang="c">
| |
− | /*====================================================
| |
− | / Connect ColorPAL SIG signal to Arduino pin 2 and 3
| |
− | / Add 2K pullup resistor from pins 2 & 3 to +5v
| |
− | / See the result on the serial terminal,
| |
− | / Baud Rate = 115200 kbps
| |
− | / Works with Arduino 0.20, not with 1.00 and above?
| |
− | / Source: http://be470merchantuy.blogspot.com/2012/02/lab-3-serialread-and-colorpal.html
| |
− | /====================================================*/
| |
− |
| |
− | #include <SoftwareSerial.h>
| |
− | SoftwareSerial ColorPAL(2, 3); // rx = 2, tx = 3
| |
− |
| |
− | int red, grn, blu;
| |
− |
| |
− | int gotcolor = 0;
| |
− | int letter;
| |
− |
| |
− | int redBlackRef=8;
| |
− | int redWhiteRef=234;
| |
− |
| |
− | int grnBlackRef=3;
| |
− | int grnWhiteRef=166;
| |
− |
| |
− | int bluBlackRef=6;
| |
− | int bluWhiteRef=285;
| |
− |
| |
− |
| |
− | void setup(){
| |
− |
| |
− | Serial.begin(115200); // Start communication with serial port read value
| |
− | ColorPAL.begin(4800); // Send signal to led to read value
| |
− |
| |
− | pinMode(2,INPUT); // serial pin out from color pal
| |
− | pinMode(3,INPUT); // from same serial pin, signal pulls up, sends, pulls down, reads
| |
− | digitalWrite(2,HIGH); // Enable the pull-up resistor
| |
− | digitalWrite(3,HIGH); // Enable the pull-up resistor
| |
− |
| |
− | pinMode(2,OUTPUT); // send signal out
| |
− | pinMode(3,OUTPUT);
| |
− | digitalWrite(2,LOW); // turn pin off so pin 3 can go high
| |
− | digitalWrite(3,LOW);
| |
− |
| |
− | pinMode(2,INPUT); // Input signal to print
| |
− | pinMode(3,INPUT);
| |
− |
| |
− | Serial.println("Pass 1");
| |
− | delay(20);
| |
− |
| |
− | while( digitalRead(2) != HIGH || digitalRead(3) != HIGH ) {
| |
− | Serial.println("In the loop");
| |
− | delay(50);
| |
− | }
| |
− |
| |
− | Serial.println("Pass 2");
| |
− |
| |
− | pinMode(2,OUTPUT);
| |
− | pinMode(3,OUTPUT);
| |
− | digitalWrite(2,LOW);
| |
− | digitalWrite(3,LOW);
| |
− | delay(100); // spec is 80, but not all ColorPAL units work with 80
| |
− |
| |
− | pinMode(2,INPUT);
| |
− | pinMode(3,OUTPUT);
| |
− | delay(100);
| |
− |
| |
− | }
| |
− |
| |
− | // This oscillates back and forth on one wire to turn off led, send signal,
| |
− | // turn on led, read signal. very fast strobe read - arduino is not capable of
| |
− | // one wire signal communication over digital ports, so this is a way around
| |
− | // that over 2 wires communicating with 1 pin on the sensor.
| |
− | //---------------------------------
| |
− |
| |
− | void loop()
| |
− | {
| |
− |
| |
− | readColor();
| |
− |
| |
− | int redCorrect = (255*(red-redBlackRef))/(redWhiteRef-redBlackRef);
| |
− | int bluCorrect = (255*(blu-bluBlackRef))/(bluWhiteRef-bluBlackRef);
| |
− | int grnCorrect = (255*(grn-grnBlackRef))/(grnWhiteRef-grnBlackRef);
| |
− |
| |
− |
| |
− | Serial.print("R");
| |
− | Serial.print(redCorrect);
| |
− | Serial.print(" ");
| |
− | Serial.print(red);
| |
− | Serial.print(" G");
| |
− | Serial.print(grnCorrect);
| |
− | Serial.print(" ");
| |
− | Serial.print(grn);
| |
− | Serial.print(" B");
| |
− | Serial.print(bluCorrect);
| |
− | Serial.print(" ");
| |
− | Serial.println(blu);
| |
− |
| |
− | //int redCorrect = red;
| |
− | //int bluCorrect = grn;
| |
− | //int grnCorrect = blu;
| |
− |
| |
− | if (redCorrect > 240 && redCorrect <=255 && grnCorrect >240 && grnCorrect <=255 && bluCorrect >240 && bluCorrect <= 255)
| |
− | {
| |
− | Serial.print("White");
| |
− | delay(100);
| |
− | }
| |
− |
| |
− |
| |
− | if (redCorrect > 0 && redCorrect <= 40 && grnCorrect >0 && grnCorrect <=40 && bluCorrect >0 && bluCorrect <= 40){
| |
− | Serial.print("Black");
| |
− | delay(100);
| |
− | }
| |
− |
| |
− | if (redCorrect > 140 && redCorrect <= 255 && grnCorrect >0 && grnCorrect <=80 && bluCorrect >0 && bluCorrect <= 130){
| |
− | Serial.print("Red");
| |
− | delay(100);
| |
− | }
| |
− |
| |
− | if (redCorrect > 200 && redCorrect <= 255 && grnCorrect >0 && grnCorrect <=200 && bluCorrect >130 && bluCorrect <= 255){
| |
− | Serial.print("Pink");
| |
− | delay(100);
| |
− | }
| |
− |
| |
− | if (redCorrect > 200 && redCorrect <= 255 && grnCorrect >80 && grnCorrect <=160 && bluCorrect >0 && bluCorrect <= 120){
| |
− | Serial.print("Orange");
| |
− | delay(100);
| |
− | }
| |
− |
| |
− | if (redCorrect > 180 && redCorrect <= 255 && grnCorrect >200 && grnCorrect <=255 && bluCorrect >0 && bluCorrect <= 255){
| |
− | Serial.print("Yellow");
| |
− | delay(100);
| |
− | }
| |
− |
| |
− | if (redCorrect > 120 && redCorrect <= 200 && grnCorrect >0 && grnCorrect <=230 && bluCorrect >120 && bluCorrect <= 255){
| |
− | Serial.print("Purple");
| |
− | delay(100);
| |
− | }
| |
− |
| |
− | if (redCorrect > 0 && redCorrect <= 180 && grnCorrect >100 && grnCorrect <=255 && bluCorrect >0 && bluCorrect <= 170){
| |
− | Serial.print("Green");
| |
− | delay(100);
| |
− | }
| |
− |
| |
− | if (redCorrect > 0 && redCorrect <= 180 && grnCorrect >0 && grnCorrect <=255 && bluCorrect >170 && bluCorrect <= 255){
| |
− | Serial.print("Blue");
| |
− | delay(100);
| |
− | }
| |
− |
| |
− | gotcolor = 0;
| |
− | delay(100);
| |
− |
| |
− | } /* End of loop() */
| |
− |
| |
− | /* ***************************************** */
| |
− | /* Function readColor() */
| |
− | /* Reads ColorPAL, putting results in the */
| |
− | /* red, grn, blu variables */
| |
− | /* ***************************************** */
| |
− | void readColor()
| |
− | {
| |
− | char rByte[9];
| |
− | char dummy[4];
| |
− |
| |
− | delay(20);
| |
− | ColorPAL.begin(4800);
| |
− | ColorPAL.print("= (00 $ m) !"); // set up loop to continuously send color data
| |
− | pinMode(3,INPUT);
| |
− | gotcolor = 0;
| |
− | while (gotcolor == 0)
| |
− | {
| |
− | rByte[0] = ColorPAL.read();
| |
− | if( rByte[0] == '$' )
| |
− | {
| |
− | gotcolor = 1;
| |
− | for (int i=0; i<9; i++)
| |
− | {
| |
− | rByte[i] = ColorPAL.read();
| |
− | // Serial.print(rByte[i]);
| |
− | }
| |
− | Serial.println("");
| |
− | dummy[0] = rByte[0];
| |
− | dummy[1] = rByte[1];
| |
− | dummy[2] = rByte[2];
| |
− | dummy[3] = 0;
| |
− |
| |
− | red = strtol(dummy,NULL,16);
| |
− |
| |
− | dummy[0] = rByte[3];
| |
− | dummy[1] = rByte[4];
| |
− | dummy[2] = rByte[5];
| |
− |
| |
− | grn = strtol(dummy,NULL,16);
| |
− |
| |
− | dummy[0] = rByte[6];
| |
− | dummy[1] = rByte[7];
| |
− | dummy[2] = rByte[8];
| |
− |
| |
− | blu = strtol(dummy,NULL,16);
| |
− | }
| |
− | }
| |
− | } /* End of function readColor() */
| |
− |
| |
− | </source>
| |
− |
| |
− | If the program works correctly, it will send to the serial port (115 200 Bd) following data:
| |
− |
| |
− |
| |
− | R27 32 G106 71 B40 50
| |
− | Green
| |
− | R37 41 G134 89 B50 61
| |
− | Green
| |
− | R34 39 G126 84 B46 57
| |
− | Green
| |
− |
| |
− | R19 25 G84 57 B27 36
| |
− |
| |
− | R18 24 G78 53 B26 35
| |
− |
| |
− | R15 22 G65 45 B23 32
| |
− |
| |
− | R15 22 G68 47 B22 31
| |
− |
| |
− | R14 21 G68 47 B21 30
| |
− |
| |
− | R16 23 G31 23 B26 35
| |
− | Black
| |
− | R16 23 G32 24 B30 39
| |
− | Black
| |
− | R15 22 G26 20 B21 30
| |
− | Black
| |
− | R10 17 G21 17 B19 27
| |
− |
| |
− |
| |
− |
| |
− |
| |
| | | |
| | | |
| == Demo software == | | == Demo software == |
− |
| |
| | | |
| Following Arduino code works with an original Parallax (or PhiPi) ColorDemo.exe program available at | | Following Arduino code works with an original Parallax (or PhiPi) ColorDemo.exe program available at |
/*====================================================
/ Connect ColorPAL SIG signal to Arduino pin 2 and 3
/ Baud Rate = 9600 kbps
/ Works with Arduino 0.20, not with 1.00 and above?
/====================================================*/
#include <SoftwareSerial.h>
SoftwareSerial ColorPAL(2, 3); // rx = 2, tx = 3
int red, grn, blu;
int gotcolor = 0;
int letter;
char colorByte[9];
void setup(){
// for colordemo 9600,
Serial.begin(9600); // Start communication with serial port read value
ColorPAL.begin(4800); // Send signal to led to read value
pinMode(2,INPUT); // serial pin out from color pal
pinMode(3,INPUT); // from same serial pin, signal pulls up, sends, pulls down, reads
digitalWrite(2,HIGH); // Enable the pull-up resistor
digitalWrite(3,HIGH); // Enable the pull-up resistor
pinMode(2,OUTPUT); // send signal out
pinMode(3,OUTPUT);
digitalWrite(2,LOW); // turn pin off so pin 3 can go high
digitalWrite(3,LOW);
pinMode(2,INPUT); // Input signal to print
pinMode(3,INPUT);
delay(20);
while( digitalRead(2) != HIGH || digitalRead(3) != HIGH ) {
delay(50);
}
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
delay(100); // spec is 80, but not all ColorPAL units work with 80
pinMode(2,INPUT);
pinMode(3,OUTPUT);
delay(100);
delay(20);
ColorPAL.begin(4800);
ColorPAL.print("= (00 $ m) !"); // set up loop to continuously send color data
pinMode(3,INPUT);
}
// This oscillates back and forth on one wire to turn off led, send signal,
// turn on led, read signal. very fast strobe read - arduino is not capable of
// one wire signal communication over digital ports, so this is a way around
// that over 2 wires communicating with 1 pin on the sensor.
//---------------------------------
void loop()
{
readColor();
gotcolor = 0;
delay(100);
} /* End of loop() */
/* ***************************************** */
/* Function readColor() */
/* Reads ColorPAL, putting results in the */
/* red, grn, blu variables */
/* ***************************************** */
void readColor()
{
char rByte[9];
char dummy[4];
// delay(20);
// ColorPAL.begin(4800);
// ColorPAL.print("= (00 $ m) !"); // set up loop to continuously send color data
pinMode(3,INPUT);
gotcolor = 0;
while (gotcolor == 0)
{
rByte[0] = ColorPAL.read();
if( rByte[0] == '$' )
{
gotcolor = 1;
for (int i=0; i<9; i++)
{
rByte[i] = ColorPAL.read();
}
Serial.print("R0");
Serial.print(rByte[0]);
Serial.print(rByte[1]);
Serial.print(rByte[2]);
Serial.print(" G0");
Serial.print(rByte[3]);
Serial.print(rByte[4]);
Serial.print(rByte[5]);
Serial.print(" B0");
Serial.print(rByte[6]);
Serial.print(rByte[7]);
Serial.print(rByte[8]);
Serial.println();
}
}
} /* End of function readColor() */