Descripción
El TCS230 es un sensor capaz de detectar el color de un objeto mediante la conversión de la luz incidente en una señal eléctrica de frecuencia variable. El dispositivo integra en un solo circuito integrado CMOS un arreglo de fotodiodos y un convertidor de corriente a frecuencia, lo que simplifica su interfaz con microcontroladores.
La salida del sensor es una onda cuadrada con ciclo de trabajo del 50 %, cuya frecuencia es proporcional a la intensidad de la luz recibida. En su encapsulado SOIC transparente, el TCS230 incorpora un arreglo de 8×8 (64) fotodiodos, distribuidos de la siguiente manera:
- 16 fotodiodos con filtro rojo
- 16 fotodiodos con filtro verde
- 16 fotodiodos con filtro azul
- 16 fotodiodos sin filtro (luz clara)
Mediante la selección del grupo de fotodiodos activo, es posible medir la intensidad luminosa de cada componente de color y así determinar la composición cromática de la luz reflejada por un objeto.
El sensor cuenta además con una línea de habilitación de salida (OE), que permite alternar el pin de salida entre un estado activo y un estado de alta impedancia. Esta característica facilita el uso de múltiples sensores compartiendo un mismo pin del microcontrolador.
Características de TCS230 sensor de reconocimiento de color
- Conversión de alta resolución de intensidad de luz a frecuencia
- El sensor TCS3200 opera desde una sola fuente de alimentación de 2.7 a 5.5V
- Interfaz de salida digital compatible con lógica TTL
- La salida digital del sensor puede ingresarse directamente a un microcontrolador
- Modo de bajo consumo de energía
- Leds incluidos en el PCB para iluminar el objeto a reconocer
- Se puede comunicar con el micro controlador con solamente un pin
Selección de los filtros
Mediante los pines de control S2 y S3 es posible seleccionar cuales fotodiodos se utilizarán como entrada para el convertidor de corriente a frecuencia. La siguiente tabla nos muestra las combinaciones de valores lógicos en estos pines y su relación con los fotodiodos.
| Tipo de fotodiodo | S2 | S3 |
|---|---|---|
| Rojo | LOW | LOW |
| Azul | LOW | HIGH |
| Sin filtro | HIGH | LOW |
| Verde | HIGH | HIGH |
Selección del escalado de frecuencia
Los pines S0 y S1 permiten seleccionar el escalado de frecuencia. Esto nos permite adaptar la salida del sensor a microcontroladores con diferentes características y periféricos.
| Escalado de frecuencia | S0 | S1 |
|---|---|---|
| Modo de bajo consumo | LOW | LOW |
| 2% | LOW | HIGH |
| 20% | HIGH | LOW |
| 100% | HIGH | HIGH |
Código para TCS230 con Arduino
El siguiente programa nos permite probar el sensor TCS230 con Arduino. Se muestran los valores de los componentes RGB del objeto que coloquemos delante del sensor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | /** Geek Factory - "Dale vuelo a tus proyectos" www.geekfactory.mx PROGRAMA DE PRUEBA PARA SENSOR DE RECONOCIMIENTO DE COLOR TCS230 o TCS3200 CONSULTA EL ARCHIVO LICENCIA.TXT PARA CONOCER MÁS SOBRE LOS DERECHOS DE DISTRIBUCIÓN DE ESTE MATERIAL O LA SIGUIENTE URL: HTTPS://WWW.GEEKFACTORY.MX/LICENCIA-CONTENIDO. PUBLICADO BAJO LICENCIA ATTRIBUTION-NONCOMMERCIAL-SHAREALIKE 4.0 INTERNATIONAL (CC BY-NC-SA 4.0). GEEK FACTORY INVIERTE TIEMPO Y RECURSOS EN DESARROLLAR ESTOS EJEMPLOS Y TUTORIALES. SI ENCUENTRAS ÚTIL ESTE CÓDIGO, CONSIDERA REALIZAR UNA COMPRA CON NOSOTROS. Resumen: Este programa demuestra el funcionamiento del sensor TCS230 para reconocer colores. Muestra las componentes RGB del objeto colocado frente al sensor en el monitor serial de Arduino. */ /** Configurar los pines donde está conectado el sensor TCS230 o TCS3200 */ #define PIN_ENTRADA_TCS230 2 #define PIN_S0_TCS230 3 #define PIN_S1_TCS230 4 #define PIN_S2_TCS230 5 #define PIN_S3_TCS230 6 // variable para el conteo de pulsos mediante interrupción, se declara con la palabra volatile para // indicar que esta variable será modificada desde una rutina de servicio de interrupción. volatile uint32_t contador = 0; /** @brief Manejador de interrupción externa, incrementa la variable contador en cada flanco ascendente. Incrementa en la variable contador en cada interrupción de flanco ascendente para calcular la frecuencia. */ void interrupcion_externa() { contador++; } /** @brief Mide la frecuencia utilizando la interrupción externa. Mide la frecuencia de la señal proveniente del TCS230 utilizando la interrupción externa para aumentar un contador y luego dividiendo entre el tiempo en el que se tomo la medida. */ float medir_frecuencia(uint32_t tmedida = 100) { // iniciar variables contador = 0; uint32_t tcomienzo = millis(); // contar el numero de interrupciones externas attachInterrupt(digitalPinToInterrupt(PIN_ENTRADA_TCS230), interrupcion_externa, RISING); while (millis() - tcomienzo < tmedida) {}; detachInterrupt(digitalPinToInterrupt(PIN_ENTRADA_TCS230)); // convertir a frecuencia return (contador * 1000.0f) / tmedida; } /** @brief Selecciona el color a detectar. Mediante los pines S2 y S2 del sensor, seleccionamos el color a detectar, usamos las letras R, G y B para indicar a la función cual es el color que deseamos medir. */ void seleccionar_color(char color) { switch (color) { case 'R': digitalWrite(PIN_S2_TCS230, LOW); digitalWrite(PIN_S3_TCS230, LOW); break; case 'G': digitalWrite(PIN_S2_TCS230, HIGH); digitalWrite(PIN_S3_TCS230, HIGH); break; case 'B': digitalWrite(PIN_S2_TCS230, LOW); digitalWrite(PIN_S3_TCS230, HIGH); break; default: digitalWrite(PIN_S2_TCS230, HIGH); digitalWrite(PIN_S3_TCS230, LOW); break; } } /** @brief Convierte los valores de frecuencia a RGB. Esta función recibe como parámetros los valores de frecuencia medidos desde el sensor y los convierte a valores RGB de 8 bits. */ void frecuencia_a_rgb(float frojo, float fverde, float fazul, float ftodos, uint8_t &r, uint8_t &g, uint8_t &b) { if (ftodos <= 0) { r = g = b = 0; return; } float rnormalizado = frojo / ftodos; float vnormalizado = fverde / ftodos; float anormalizado = fazul / ftodos; rnormalizado = constrain(rnormalizado, 0.0f, 1.0f); vnormalizado = constrain(vnormalizado, 0.0f, 1.0f); anormalizado = constrain(anormalizado, 0.0f, 1.0f); r = (uint8_t)(rnormalizado * 255); g = (uint8_t)(vnormalizado * 255); b = (uint8_t)(anormalizado * 255); } /** Función setup: se ejecuta una vez cuando encendemos el arduino */ void setup() { Serial.begin(9600); // iniciar el pin donde ingresa la señal de frecuencia variable como entrada pinMode(PIN_ENTRADA_TCS230, INPUT); // seleccionar escalado de frecuencia 20% de acuerdo a nuestra tabla pinMode(PIN_S0_TCS230, OUTPUT); digitalWrite(PIN_S0_TCS230, HIGH); pinMode(PIN_S1_TCS230, OUTPUT); digitalWrite(PIN_S1_TCS230, LOW); // iniciar los pines de selección de color a un estado conocido pinMode(PIN_S2_TCS230, OUTPUT); digitalWrite(PIN_S2_TCS230, LOW); pinMode(PIN_S3_TCS230, OUTPUT); digitalWrite(PIN_S3_TCS230, LOW); } /** Función loop: se ejecuta continuamente mientras el arduino permanece encendido */ void loop() { float frojo, fverde, fazul, ftodos; // medir la frecuencia para cada color seleccionar_color('R'); delay(10); frojo = medir_frecuencia(); seleccionar_color('G'); delay(10); fverde = medir_frecuencia(); seleccionar_color('B'); delay(10); fazul = medir_frecuencia(); seleccionar_color('C'); delay(10); ftodos = medir_frecuencia(); // imprimir las frecuencias medidas Serial.print(F("Frecuencias R: ")); Serial.print(frojo); Serial.print(F(" G: ")); Serial.print(fverde); Serial.print(F(" B: ")); Serial.print(fazul); // convertir a RGB de 8 bits uint8_t r, g, b; frecuencia_a_rgb(frojo, fverde, fazul, ftodos, r, g, b); Serial.print(F("Color R: ")); Serial.print(r); Serial.print(F(" G: ")); Serial.print(g); Serial.print(F(" B: ")); Serial.print(b); delay(1000); } |








Valoraciones
No hay valoraciones aún.