Operácie

Acrob040: Rozdiel medzi revíziami

Z SensorWiki

Riadok 18: Riadok 18:
  
 
<source lang="c">
 
<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>
 
</source>
  
 
If the program works correctly, it will send to the serial port (115 200 Bd) following data:
 
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:
 +
 +
TODO

Verzia zo dňa a času 14:53, 28. február 2012

Color sensor

Following text will show You a basic connection and operation of the Parallax ColorPal digital colour sensor module.

Parallax ColorPal.jpg

Product page: #28380 ColorPAL

Schematic diagram:

Parallax ColorPAL Schematic.png

Demo program:

/*====================================================
/ 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() */

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:

TODO