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
}