Inspired by a $2.00 color detector by Gonzik on LetsMakeRobots my daughter created a color marble sorter for her elementary school science project.

 

#include  <Servo2>
 
Servo armServo; 
Servo gateServo; 
 
int pos = 0; 
int time = 300;
int redTest = 0;
int blueTest = 0;
int greenTest = 0;

#define BLUELIGHT   4
#define GREENLIGHT  3
#define REDLIGHT    2

#define ON 0
#define OFF 1

#define RedTestOrangeLow  30
#define RedTestOrangeHigh 90
 
#define OrangeArmPosition 0
#define BlackArmPosition 90
#define YellowArmPosition 180

#define OPEN 180 // LET GO (TO THE LEFT)
#define CLOSE 90 // PUSH IN
 
void setup() 
{ 
  Serial.begin(115200); 
  
  armServo.attach(9); 
  gateServo.attach(10); 
  
  pinMode(BLUELIGHT, HIGH);
  pinMode(GREENLIGHT, HIGH);
  pinMode(REDLIGHT, HIGH);
  
} 
 
boolean empty = true; 
 
void loop() 
{ 

  digitalWrite(REDLIGHT, ON);
  delay(time);
  redTest = analogRead(0);
  digitalWrite(REDLIGHT, OFF);

  digitalWrite(GREENLIGHT, ON);
  delay(time);
  greenTest = analogRead(0);
  digitalWrite(GREENLIGHT, OFF);

  digitalWrite(BLUELIGHT, ON);
  delay(time);
  blueTest = analogRead(0);

  digitalWrite(BLUELIGHT, OFF);

  Serial.print("R ");
  Serial.print(redTest);
  Serial.print(" G ");
  Serial.print(greenTest);
  Serial.print(" B ");
  Serial.print(blueTest);
  Serial.print("\n");

  if (greenTest < 30) // black
  {
    armServo.write (BlackArmPosition);
    Serial.print("black");
    empty = false;
  } else if ((redTest < 108) && (redTest > 80)) // orange
  {
    armServo.write (OrangeArmPosition);
    Serial.print("orange");
    empty = false;
//  } else if (redTest > 108) {
//    armServo.write (YellowArmPosition);
//    Serial.print("yellow");
//    empty = false;
  } else {
    Serial.print("empty");
    empty = true;
  }    

  if (empty == false)
  {  
    gateServo.write(OPEN);
    delay(2000);
    gateServo.write(CLOSE);
  }

}