Classificador de bolles per colorIES 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. |
2. Components |
|
Placa Arduino UNO o compatible | |
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 de Color TCS34725 |
3. 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: -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 } |