Prototipo Sensor de Color Arduino – Identificar y Mostrar Nombres de Colores
Componentes y suministros
| Componente | Cantidad | Notas |
|---|---|---|
| Arduino UNO | 1 | |
| LED RGB difuso ánodo común | 1 | Ánodo común o cátodo; usa lo que tengas (ajusta lógica en código) |
| Fotorresistencia (LDR / CdS Cell) | 1 | |
| Pantalla LCD 16x2 (compatible LiquidCrystal) | 1 | Ej. Adafruit Standard blanco/azul |
| Resistencia 10k ohm | 2 | Para pulsador y CdS |
| Resistencia 100 ohm | 3 | 150Ω para rojo, 2×100Ω para verde/azul del RGB |
| Pulsador 12mm (SparkFun) | 1 | |
| Cables jumper | 1 | |
| Protoboard | 1 |
Aplicaciones y servicios online
- MLP Topology Workbench — herramienta para reentrenar redes neuronales para usar con librería Neurona en Arduino.
Sobre el proyecto
Versión simplificada del artículo completo para facilitar la reproducción. Consulta el blog del autor para detalles de implementación. Mira el video del proyecto para verlo en acción.
Visión general
Al igual que la visión cromática humana, basada en luz, el modelo RGB abarca más de 16 millones de colores, dispuestos en un espacio 3D donde valores enteros de R, G, B (0-255) son coordenadas. La detección y reconocimiento de color se realizó con componentes electrónicos ópticos y aprendizaje automático: combinación de un LED RGB y una fotorresistencia (CdS/LDR), aislados de luz ambiente. El LED emite y el sensor detecta la intensidad de cada componente (rojo, verde, azul) reflejada por un objeto de color determinado.
Perceptrón Multicapa (MLP)
El MLP es una arquitectura feedforward de Redes Neuronales Artificiales: capa de entrada (no neuronal), capas ocultas y capa de salida. Se entrena con backpropagation (aprendizaje supervisado).
Para este sensor, la red recibe 3 entradas (valores RGB), tiene una capa oculta con 6 neuronas y capa de salida con 10 neuronas (una por color a reconocer). La red ya viene entrenada en el código. Detalles de entrenamiento y dataset en el blog completo.
Reconocimiento de color
El MLP entrenado clasifica patrones espacialmente separables. Durante el entrenamiento, la red mapeó regiones en el espacio RGB 3D; cada región delimitada por hiperplanos representa un color. Todo nuevo patrón RGB (punto 3D) cae en una región y se clasifica según su color.
Para buena generalización, el conjunto de entrenamiento debe cubrir el dominio de uso. Atención a valores mínimos y máximos de cada componente RGB. No alimentes la red con patrones fuera de ese dominio.
El dataset (75 instancias) tiene valores 0-1 (originalmente 0-255, reescalados dividiendo por 255). En la salida, solo una neurona debe dar 1 (one-hot). Como la red entrenada da floats, se hace post-procesado: la neurona con mayor salida → 1, las demás → 0.
Circuito electrónico
La detección ocurre en el circuito, con cómputo en ATmega328 (Arduino). Ver esquemático.
Importante: El código usa LED RGB ánodo común. Si el tuyo es cátodo común, invierte la lógica en el código.
Uso una sola resistencia en el ánodo común (promedio de las que irían en cátodos) por simplicidad; lo ideal es resistencias individuales por cátodo para fidelidad cromática. Mi forma no distorsiona patrones, pero los valores RGB no coinciden exactamente con pantalla/ojo humano.
El LED RGB y la fotorresistencia deben estar adyacentes y aislados de luz ambiente (un tubo de película negro viejo es ideal). Ver video del proyecto.
Teoría del color
La percepción se basa en teoría del color. Sin lentes, solo objetos opacos y mates (evita reflexión especular). La reflexión difusa es clave.
Cuando luz de un color incide en un objeto, se refleja según la composición de ese color. Ej.: luz roja en objeto amarillo → mucha reflexión (amarillo = rojo + verde). Luz azul en amarillo → poca reflexión (poco azul en su composición).
En sistema aditivo (blanco = todos los colores, negro = ninguno), se miden máximos y mínimos de reflexión de cada color del LED RGB sobre objetos coloreados. Esto permite calibrar el circuito para obtener rango real y reescalar a [0,255] (informativo) y [0,1] (entrada red neuronal).
Consejo de oro: tras calibrar, no muevas ni toques los componentes (especialmente en protoboard) ni el aislante de luz ambiente.
Programación
El sensor ejecuta 3 iteraciones al exponer un objeto: rojo → espera estabilización LDR → lectura analógica → guarda reflexión rojo; repite para verde y azul.
Calibración: proceso iterativo 2 veces: para negro y para blanco. Detecta máximos y mínimos (inicialmente ~0 a ~1024 según resolución ADC) de reflexión R, G, B, obteniendo rango real para reescalar.
El tiempo de espera para estabilizar LDR varía según componente; usa delay generoso (yo usé 500 ms) y redúcelo hasta el límite de estabilidad.
En detección, los valores RGB (0-1) alimentan al MLP. Uso Neurona — librería propia para ANNs en Arduino (instalable desde Library Manager). La red ya viene entrenada y lista; pesos ajustados embebidos en el código.
Pruebas
Colores extraídos del dataset para test de reconocimiento (impresos en papel sulfite con inyección de tinta → material opaco, apto). La figura muestra aciertos y errores (números internos = color clasificado erróneamente).
Código
Código en carpeta colorSensor del repo GitHub. Verifica que tu circuito coincida con el esquemático y que la librería Neurona esté instalada (Library Manager).
github.com/moretticb/ColorSensor/
Esquemático
Usa el pulsador según instrucciones en pantalla LCD. Ver imagen del esquemático original.
Proceso de manufactura
- Alerta de Sed Inteligente para Plantas: Sensor DIY para Riego Óptimo
- Reloj de Palabras en Italiano con Arduino Nano, NeoPixel, LCD y RTC
- Sensor de obstáculos IR casero con Arduino – Tutorial fácil con LED IR y fotodiodo
- Medidor kWh Sigfox Fiable con Arduino MKR Fox 1200
- Monitor de temperatura con Bluetooth usando Arduino Nano
- Cerradura por Gestos Sin Contacto: Acceso Seguro con APDS-9960 y Arduino
- Kit Compañero Arduino Nano: Componentes y Herramientas Esenciales para Electrónica DIY
- Kit Adaptador USB MIDI para Arduino Micro / Leonardo: Lista Completa de Componentes
- Circuito de entrada analógica aislada para Arduino
- Test de Precisión de Tiempo de Reacción con Arduino UNO
- Códigos de Color de Resistencias – Guía Completa para Decodificar Valor, Tolerancia y Estándares E-Series