Se trata de detectar colores y transmitirlos por bluetooth a un teléfono Android que dice el color con voz. De utilidad en procesos industriales, pero también por personas con déficit visual para que puedan oírlo directamente desde su teléfono. Así mismo, la conexión BT se realiza automáticamente por emparejamiento por MAC, sin necesidad de seleccionar visualmente el BT de una lista.
El circuito es muy sencillo, el sensor GY31 (o TCD3210), un Arduino Pro Mini a 3,3v 8Mhz, un módulo BT HC-06 y un botón. Y un cuello de botella pintado de negro para proteger el sensor de colores y luces externas. El uso del Arduino a 3,3v nos permite alimentarlo con una sola pila de litio de 3,7v por la entrada RAW (NO por la Vin)
El módulo GY-31 integra el sensor CMOS TCS3200 para reconocimiento de colores con un voltaje de funcionamiento de 3 - 5 VDC.
El TCS3200 es un conversor de color a frecuencia integrado en un circuito CMOS. Dispone de una salida de onda cuadrada con una frecuencia directamente proporcional a la intensidad de la luz..Dispone de 4 LED blancos que iluminan la superficie a medir. Integra 4 canales de detección (filtros): rojo, verde, azul y blanco (sin filtro) en un sensor CMOS de 64 píxeles (8x8, 16 foto diodos para cada color, incluido blanco)
- S0/S1 pins controlan la escala de frecuencia.
- S2/S3 pins controlan cual grupo de fotodiodos están midiendo (Red/Green/Blue/Clear)
Normalmente para Arduino se elige S0/S1 para el 20%
Así pues, con un sensor como este y suponiéndole una precisión absoluta podríamos distinguir 256 x 256 x 256 = 16.777.216 colores distintos. Ni que decir, que traducir un color RGB concreto con palabras es misión imposible, incluso para una mujer y además los hombres solo distinguimos unos ocho colores básicos, que son los manejados aquí. Pero la detección fallará si hay cambios de matiz, de iluminación, etc. Aunque siempre nos dirá los valores RGB de cada color.
Para comenzar arrancamos la APP programada en APP Inventor en el teléfono y que espera el arranque del Arduino para establecer la comunicación BT automáticamente al reconocer la MAC del HC-06 (útil en caso de dificultad visual del usuario). Cada vez que se pulsa el micro botón se realiza una lectura del color que se envía al monitor serie y al teléfono para su vocalización.
// Guarda las frecuencias de los fotodiodos int frecuenciaRojo = 0; int frecuenciaVerde = 0; int frecuenciaAzul = 0; int R=0; int G=0; int B=0; SoftwareSerial ArduinoSlave(11,10);
// salidaSensor como entrada pinMode(salidaSensor, INPUT); pinMode(7, INPUT_PULLUP); //Botón
// Escala de frecuencia a 20% digitalWrite(S0,HIGH); digitalWrite(S1,LOW);
Serial.begin(9600); delay(100); ArduinoSlave.begin(9600); delay(6000); //Espera para conexion BT con telefono ArduinoSlave.println("Pulse el botón para leer el color"); } void loop() { int sensorVal = digitalRead(7); if (sensorVal == LOW) { //pulsamos el botón R=0; int G=0; B=0; for(int i=0; i<=5;i++){ //Integramos con 5 lecturas // Lectura de los fotodiodos con filtro rojo digitalWrite(S2,LOW); digitalWrite(S3,LOW); // Frecuencia de salida del sensor frecuenciaRojo = pulseIn(salidaSensor, LOW); R=R+frecuenciaRojo; delay(100);
// Lectura de los fotodiodos con filtro verde digitalWrite(S2,HIGH); digitalWrite(S3,HIGH); // Frecuencia de salida del sensor frecuenciaVerde = pulseIn(salidaSensor, LOW); G=G+frecuenciaVerde; delay(100);
// Definiendo la lectura de los fotodiodos con filtro azul digitalWrite(S2,LOW); digitalWrite(S3,HIGH); // Frecuencia de salida del sensor frecuenciaAzul = pulseIn(salidaSensor, LOW); B=B+frecuenciaAzul; delay(100); } Serial.print("R = "); R=R/5; Serial.print(R); Serial.print(" G = "); G=G/5; Serial.print(G); Serial.print(" B = "); B=B/5; Serial.println(B);
//Valores para cada color //Hay que redefinir para cada caso particular if ((R < 100) && G < 100 && B < 100){ ArduinoSlave.println("Blanco"); //Envia a teléfono Serial.println("Blanco");} //Envia a Serial monitor
if ((R > 220) && G > 230 && B > 190){ ArduinoSlave.println("Negro"); Serial.println("Negro"); } if ((R < 128 && R > 105) && G > 200 && B > 140){ ArduinoSlave.println("Rojo"); Serial.println("Rojo"); }
if ((R > 60 && R < 80) && (G > 72 && G < 85) && B > 90){ ArduinoSlave.println("Amarillo"); Serial.println("Amarillo"); }
if ((R > 70 && R < 100) && (G > 180 && G < 210) && B > 160){ ArduinoSlave.println("Naranja"); Serial.println("Naranja"); }
if ((R > 175 && R < 200) && (G > 200 && G < 230) && B > 129){ ArduinoSlave.println("Púrpura"); Serial.println("Purpura"); }
if ((R < 190 && R >150) && (G > 120 && G < 150) && B < 175){ ArduinoSlave.println("Verde"); Serial.println("Verde"); }
if ((R > 190) && G > 140 && B < 110){ ArduinoSlave.println("Azul"); Serial.println("Azul"); } } }