Classificador de bolles per color

IES Port d'Alcúdia


1. Introducció


El següent projecte consisteix en construir un dispositiu que sigui capaç de classficar de forma autònoma un nombre indefinit de bolles pel seu color. Es fonamenta en el sensor de color TCS34725, controlat per un arduino. A continuació teniu una sèrie d'imatges i un video on podreu veure el seu funcionament.

front
back



2. Components

arduino
Placa Arduino UNO o compatible
servo Servomotor. Dues unitats. Un que acciona el mecanisme que captura les bolles una a una i que anomenarem "Servo Capturador". L'altre acciona el mecanisme que desvia les bolles cap a un lloc o un altre en funció del color i que anomenarem "Servo Selector"
sensor Sensor de Color TCS34725


3. Esquema


  • Pin SCL del sensor al pin A5 de l'Arduino
  • Pin SDA del sensor al pin A4 de l'Arduino
  • VIN de sensor es connecta a 3,3v
  • Cable de control taroja del servo captador al pin 9 de l'arduino
  • Cable de control taroja del servo selector al pin 10 de l'arduino

esquema



4. Codi Arduino


-S'ha d'incloure la biblioteca ColorConverterLib.h. Es pot decarregar el zip a: https://github.com/luisllamasbinaburo/Arduino-ColorConverter.
-S'ha d'afegir la biblioteca del sensor de color. Aquesta es pot afegir des del gestor de biblioteques:

biblioteca


-S'han d'anar fent proves per ajustar les posicions dels servors i els llindars de colors segons les bolles a classificar.



#include <Servo.h>
#include <ColorConverterLib.h>
#include <Adafruit_TCS34725.h>
#include <Wire.h>

int servoPin1  = 9;
Servo servoMotor1; //servo captador

int servoPin2  = 10;
Servo servoMotor2; //servo selector

Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_700MS, TCS34725_GAIN_1X);


//**********valors a ajustar*************
int angle_capturador_agafa = 36;
int angle_capturador_amolla = 95;
int angle_selector_blau = 165;
int angle_selector_vermell = 95;
int llindar_blau_1 = 105;
int llindar_blau_2 = 115;
int llindar_vermell_1 = 80;
int llindar_vermell_2 = 90;
//***************************************


void setup() {
  Serial.begin(9600);
 
  Serial.flush();
  delay(100);
  servoMotor1.attach( servoPin1 );
  servoMotor2.attach( servoPin2 );
  servoMotor1.write(angle_capturador_agafa);
 
  delay(100);

  if (!tcs.begin())
  {
    Serial.println("Error al iniciar TCS34725");
    while (1) delay(1000);
  }  
  delay(10000); //deixam un temps abans de començar per si col.locam les bolles
}

void loop() {

  uint16_t clear, red, green, blue;

  tcs.setInterrupt(false);
  delay(60); // Costa 50ms capturar el color
  tcs.getRawData(&red, &green, &blue, &clear);
  tcs.setInterrupt(true);

  uint32_t sum = clear;
  float r, g, b;
  r = red; r /= sum;
  g = green; g /= sum;
  b = blue; b /= sum;

  // Escalar rgb a bytes
  r *= 256; g *= 256; b *= 256;

  // Convertir a hue, saturation, value
  double hue, saturation, value;
  ColorConverter::RgbToHsv( static_cast<uint8_t>(r), static_cast<uint8_t>(g), static_cast<uint8_t>(b), hue, saturation, value );

  // Mostrar nombre de color per calibrar
  Serial.println(hue*360);


  if( ((hue*360)>= llindar_blau_1) && ((hue*360)<= llindar_blau_2) ) {
    servoMotor2.write( angle_selector_blau );
    servoMotor1.write( angle_capturador_amolla );
    delay( 1000 );
    servoMotor1.write( angle_capturador_agafa );    
  }
 
  if( ((hue*360)>= llindar_vermell_1) && ((hue*360)<= llindar_vermell_2) ) {
    servoMotor2.write( angle_selector_vermell );
    servoMotor1.write( angle_capturador_amolla );
    delay( 1000 );
    servoMotor1.write( angle_capturador_agafa );    
  }

  delay(1000); //esperam un segon entre captures
}