Protótipo Sensor de Cor Arduino – Identifica e Exibe Nomes de Cores de Objetos
Componentes e Materiais
| Componente | Quantidade | Observação |
|---|---|---|
| Arduino UNO | 1 | |
| LED RGB Difuso Ânodo Comum | 1 | Cátodo comum ou ânodo... use o que tiver |
| Fotorresistor (LDR / CdS Cell) | 1 | |
| LCD Padrão Adafruit 16x2 Branco sobre Azul | 1 | Qualquer compatível com biblioteca LiquidCrystal |
| Resistor 10k Ω | 2 | Para chave tátil e célula CdS |
| Resistor 100 Ω | 3 | 150 Ω para pino vermelho e 2x 100 Ω para verde e azul do LED RGB |
| Chave Pushbutton 12mm SparkFun | 1 | |
| Jumpers (genéricos) | 1 | |
| Protoboard (genérica) | 1 |
Aplicativos e Serviços Online
- MLP Topology Workbench — ferramenta para retreinar redes neurais para uso com biblioteca Neurona no Arduino.
Sobre o Projeto
Esta é uma versão simplificada do artigo completo, para facilitar reprodução. Confira também no meu blog para mais detalhes de implementação. Assista ao vídeo do projeto para ver do que se trata.
Visão Geral do Projeto
Similar à visão de cores do olho humano, baseada em luz, o modelo RGB compreende mais de 16 milhões de cores, dispostas em um espaço 3D, onde valores inteiros de R, G, B (0 a 255) formam coordenadas. A detecção e reconhecimento de cores foram realizados com componentes eletrônicos relacionados à luz e mecanismos de machine learning; essencialmente a combinação de um LED RGB e uma célula CdS (sensor de luz/LDR), ambos isolados da luz ambiente. O LED emite e o sensor detecta a intensidade de cada luz (vermelho, verde, azul) refletida por um objeto de cor particular.
Perceptron Multicamadas (MLP)
MLP é uma arquitetura feedforward de Redes Neurais Artificiais, com camada de entrada (não neural), camadas ocultas e camada de saída. Treinado por backpropagation, realiza aprendizado supervisionado (por exemplos).
Para este sensor de cor, a rede recebe 3 entradas (valores RGB), tem 1 camada oculta com 6 neurônios e camada de saída com 10 neurônios — o número de classes (cores). A rede já vem treinada e pronta para reconhecer cores. Detalhes de treinamento e dataset no post completo do blog.
Reconhecimento de Cor
Usa nossa MLP treinada. Permite classificação e reconhecimento de padrões espacialmente separáveis. Durante treinamento, a rede mapeou regiões no espaço RGB (abaixo), onde cada região isolada por hiperplanos representa uma cor. Todo novo padrão RGB (ponto 3D) cai em uma região, sendo classificado como sua cor respectiva.
Para generalização, um conjunto de treino (exemplos de cores com saída desejada do espaço 3D) deve ser apresentado. Dataset disponível no repositório GitHub. Se gosta de redes neurais, continue lendo e confira o Playground que desenvolvi para treinar a rede você mesmo. Caso contrário, pule para Detalhes de Implementação.
A generalização ocorre no domínio do conjunto de treino, então atenção aos valores min e max de cada componente! Não alimente a rede com padrões fora desse domínio.
O dataset (75 instâncias) varia de 0 a 1. Inicialmente 0-255, reescalados dividindo por 255. No dataset, apenas um neurônio de saída deve dar 1, os demais 0. Como a rede treinada sai com floats, pós-processamento:
Onde yi é saída do i-ésimo neurônio e max(y) o maior valor. Praticamente: neurônio com maior saída = 1, demais = 0.
Circuito Eletrônico
Toda detecção ocorre no circuito, com Atmega328 no Arduino. Confira fiação nos esquemáticos.
O código usa LED RGB ânodo comum. Verifique se o seu também é ânodo comum, senão inverta a lógica no código.
Usei apenas um resistor no LED RGB. Como uma cor por vez acende, coloquei resistor no ânodo comum com resistência média dos que deveriam estar nos cátodos — é "preguiçoso", peço desculpas! Na loja não tinham tudo. Mas é importante usar resistores corretos nos cátodos para fidelidade nos valores RGB coletados. Meu jeito não é tão ruim: padrões não distorcem, apenas não correspondem às cores de tela de computador (e olho humano).
Observe a proximidade entre LED RGB e célula CdS no esquemático. Devem ser isolados da luz ambiente (tubo de filme preto velho é perfeito), para calibração e reconhecimento funcionarem. Veja o vídeo do projeto para ver o isolamento.
Teoria das Cores
Percepção de cor pelo circuito baseia-se em teoria das cores. Sem lentes, apenas objetos opacos (e foscos) devem ser considerados, evitando reflexão especular do LED. Reflexão difusa é chave para detecção com luz. Da luz incidente, reflete em superfícies irregulares, sem efeito brilhante que atrapalha a célula CdS.
Quando luz (de certa cor) atinge objeto, reflete segundo propriedades da cor do objeto. Ex: luz vermelha em objeto amarelo reflete segundo quanto vermelho há na composição desse amarelo (luzes!) — espera-se muita reflexão vermelha, faz sentido pela composição RGB do amarelo (vermelho + verde). Luz azul em amarelo: pouca reflexão, pois azul quase ausente.
Em sistema aditivo (branco = presença de todas cores, preto = ausência), mede-se reflexão máxima e mínima de cada luz do LED RGB em objetos coloridos. Isso permite calibração dos componentes eletrônicos. Dica de ouro: após calibrar, tente (muito!) não mover nem tocar componentes (especialmente em protoboard) nem a peça de isolamento da luz ambiente.
US_plugins_acrobat_en_motion_education_colorTheory.pdfProgramação
Para calibração e reconhecimento, o sensor executa 3 iterações ao expor objeto colorido ao LED RGB e célula CdS. 1ª iteração: luz vermelha atinge objeto, programa espera CdS estabilizar, lê entrada analógica, armazena reflexão vermelha. Repete para verde e azul. Figura da Teoria das Cores ilustra bem.
Calibração: processo iterativo feito 2x: para preto e branco. Detecta reflexão máxima e mínima (inicialmente ~0 a ~1024, pela resolução ADC), obtendo faixa real para reescalar a [0, 255] (informativo) e [0, 1] (entrada real da rede neural).
O tempo de espera para estabilizar leitura do sensor de luz pode variar por componente. Dê bom delay para leitura estável. Usei 500 ms, mas comece com valor maior e diminua até limite de instabilidade.
Na detecção, valores RGB coletados (0 a 1) alimentam MLP, fazendo reconhecimento. Para MLP no Arduino, uso Neurona — biblioteca que escrevi para usar ANNs no Arduino, instalável pelo Library Manager da IDE. Veja este post para detalhes.
A rede já vem treinada e pronta no código. Treinei no Playground que desenvolvi, embutindo pesos ajustados no código, para Neurona tornar a rede operacional.
Testes
Para fins informativos, algumas cores do dataset foram testadas:
Números fora da figura identificam; dentro indicam erros de classificação, referenciando quais cores foram classificadas em vez. Cores impressas em papel sulfite com jato de tinta — objetos de material opaco, adequados para detecção.
Código
Protótipo sensor de cor
Código para Arduino está na pasta colorSensor. Certifique-se que circuito está conforme esquemáticos e biblioteca Neurona instalada (Library Manager da IDE Arduino).
https://github.com/moretticb/ColorSensor/
Esquemáticos
Use o pushbutton conforme instruções no display LCD.
Processo de manufatura
- Códigos de Cores de Resistores – Guia Completo para Decodificar Valor, Tolerância e Padrões E-Series
- Alerta Inteligente de Sede para Plantas – Sensor DIY para Hidratação Ideal
- Relógio de Palavras em Italiano com Arduino Nano, NeoPixel, LCD e RTC
- Construa um Sensor de Obstáculos Simples com Arduino – Tutorial Fácil com LED IR e Fotodiodo
- Medidor kWh Confiável com Sigfox e Arduino MKR Fox 1200
- Monitor de Temperatura com Bluetooth usando Arduino Nano
- Fechadura por Gestos Sem Toque: Acesso Seguro com APDS-9960 e Arduino
- Companion IC: Relógio, Ohmímetro, Capacímetro e Testador de Diodos com Arduino Nano
- Circuito de Entrada Analógica Isolada para Arduino
- Teste de Tempo de Reação Preciso com Arduino UNO