Eletronica digital – Sensor de cores


Recentemente adquiri um sensor de cores aqui no Brasil mesmo, para fazer parte da instrumentação da decoração do quarto de minha filha; um sensor da Parallax, o ColorPal. O problema seria que enquanto nos EUA o custo é de 20 obamas, aqui no Brasil o custo gira em torno de 120 dilmas, mas o problema não parou por ai.

O sensor é 1-wire, mas não consegui fazer a comunicação com ele utilizando o bus pirate para testar a comunicação utilizando o respectivo protocolo. Então, testei com UART a 4800kbps e consegui enviar comandos, mas não recuperá-los. Passei 2 dias a fazê-lo, ansiava por concluir essa etapa do projeto, mas aconteceu que desisti e resolvi fazer meu próprio sensor de cores.


O conceito mais simples de detecção de cores sem filtros é com a utilização de um LED RGB e um fotosensor; além de fazer o sensor, decidi torná-lo open-hardware e open-source (mas se preferir, encomende comigo).

Como funciona
Para recolher amostras de cores o sensor testa cor a cor da base RGB. Acende o vermelho do LED e o fotosensor de encarrega de ler o retorno. A quantidade de luz absorvida pela superfície diante do sensor é a quantidade oposta de vermelho contida na superfície, o restante é refletido. O mesmo processo é feito para o verde e para o azul.

Nas cores pigmentos a base é amarelo, magenta e ciano, repare que as cores luz são diferentes. Outra coisa a levar em consideração – o sensor funciona apenas para detecção de cores de superfícies refletivas. Ele não é capaz de detectar por exemplo, a cor azul na tela de seu computador.

Precisão
Para que haja uma boa precisão, é necessário que se faça a calibração do sensor. Nesse ponto, será necessário ler o datasheet do LED RGB utilizado, assim como o datasheet do fotosensor escolhido para obter as informações de curvas, influências externas, variação de temperatura, etc.

Não fiz o perfeito, apenas o satisfatorio. Para tal, coloquei uma folha branca diante do sensor (o mais próximo possível), então liguei cor a cor do LED e anotei o quanto refletia. Dessa forma soube que 100% da cor vermelha estabiliza em 642 no sinal analógico de 10bits na composição do meu sensor. Logo, perceba que há uma perda muito grande que provavelmente pode ser retificada com ajuste da posição do led e/ou fotosensor. Em 10 bits,a resolução chega a 1024 valores.

Depois basta fazer uma regra de 3 quando estiver recolhendo uma amostra de cada cor. Para converter o resultado em valor para acender o LED, novamente uma regra de 3, sabendo dessa vez que 100% corresponde a 255 em todas as cores. Pegando a porcentagem, converte-se em valor de sinal e passa-se para o analogWrite() o valor PWM a escrever na saída digital. Funcionou bem, mesmo com a perda, porém para um bom resultado necessito deixar o objeto o mais próximo possível.

As provas de conceito em Arduino podem ser vistos nesse video:

E nesse outro:

Mas a tarefa não acaba aqui.

Componentes escolhidos e suas respectivas informações
Para esse projeto serão necessários 2 componentes principais:
– Fotosensor

-LED RGB

Utilizei um LED RGB de alto-brilho, ainda assim não consegui preencher os 10 bits de resolução.

Além disso, claro que é possível aplicar tunnings do lado da controladora que recebe a informação, assim como é possível fazê-lo na própria MCU utilizada no sensor. Essa calibração pode ser aferida recolhendo as amostras RGB e acendendo um LED RGB com os valores detectados para comparação. Não se preocupe com a complexidade, pois mais adiante você terá a descrição de um código.

O sensor está gerando cores satisfatoriamente, mas terei que melhorá-lo (ou você o fará, se quiser participar).

Inicialmente fiz o código de prova no Arduino, para depois migrá-lo para o PIC designado para este projeto. Detalhes sobre LED RGB podem ser vistos nesse post. No Arduino fiz unicamente para testar a amostragem e não implementei o sensor de proximidade infra-vermelho. Se quiser fazê-lo, o procedimento pode ser visto nesse post.

O sensor foi montado em uma porta de espelho, onde os furos fiz com uma Dremel. A ponta preta onde acoplei o fotosensor é a ponta de uma caneta de quadro branco, mais precisamente este:

Basicamente, o código para testes em Arduino é este:

MCU

Para esse projeto, escolhi como controlador o PIC16F1827, comprado na MicroManiacs. Ele tem muitos recursos e apenas 18 pinos, mas para utilizá-lo com o PICKit2, siga as orientações desse post.

Informações sobre o PIC16F1827
Algumas informações dessa MCU:

Ainda faltam algumas partes para finalizar, mas a prova de conceito em PIC foi executada com esse código:

Para esse código (que ainda está sendo debugado e certamente sofrerá alterações), deixei a protoboard nesse estado:

Foi necessário recalibrar o sensor por diversos motivos; fiz um segundo sensor utilizando LED RGB difuso, o que sensibilizou a calibração. Além disso, acoplei o sensor LDR de uma maneira diferente, então tudo influenciou no resultado. Nesse modelo tive que colocar o objeto a ser capturado em ângulo. Não pude certificar o porque ainda, mas suspeito que seja porque o fundo está aberto diretamente com a protoboard e isso influencia o resultado também.

Claramente é mais complicado em relação ao código do Arduino, mas no Arduino fiz apenas a prova de conceito. No PIC as diferenças são consideráveis; o LED RGB do sensor é ligado a pinos digitais sem PWM, pois cada cor é ligada em modo full. Além disso, depois que a cor RGB for aplicada aos LEDs de decoração, o LED do sensor é apagado. No PIC, quando a cor é capturada, após 3 segundos a cor é gravada na EEPROM e é automaticamente carregada no caso de reset do PIC. Isso é, exceto o objeto ainda esteja diante do sensor. Nesse caso, o processo de captura é reiniciado e assim indefinidamente ae que o sensor de proximidade não perceba mais um objeto diante de si.

Como ainda não está 100% concluído, não vou colocar o desenho em Fritzing, mas farei um post com o resultado, mostrando uma bela decoração de quarto utilizando esse sensor, apesar de já ter também outros propósitos para ele.

Repare que a prova de conceito utiliza apenas 3 pinos pwm, um analógico, GND e +5v:

Como sobraram pinos no PIC, pode-se incrementar um pouco mais o projeto. Por exemplo, colocando um buzzer para fazer o ‘bip’ dos 3 segundos antes de gravar a EEPROM. Mas enfim, estou há tantos dias trabalhando nesse projeto que a ansiedade não me deixa fazer mais por agora.

Para quem está acostumado com Arduino, é bastante complicado depurar PIC, afinal não se tem à mão uma saida serial. Por esse motivo montei o display no circuito, onde deveria ter feito uma comunicação UART, porém algumas implicações me obrigaram a tomar outro rumo e acabei fazendo os debugs em outra MCU do mesmo modelo, repassando o código posteriormente para o PIC principal.


Artesanato à parte…

Terminada essa parte técnica, ainda falta a parte artística. Olhei algumas silhuetas de madeira na C&C, Telha Norte e Leroy Merlin. O preço da silhueta (nem era tão grande) era de quase NoVeNtA ReAiS ! Vou fazer o recorte em madeira eu mesmo, porque a madeira para isso custa em torno de 4 reais. Diferente o preço, não?

Para o teste, recortei uma silhueta de gato em papel Paraná. Para quem não conhece, é um papel de gramatura extremamente alta, parecendo bastante com aquelas madeiras finas de colocar atrás do guarda-roupa. A silhueta não ficou bem acabada, mas servirá para o exemplo.

Uma recomendação é que a silhueta seja da mesma cor da parede, de forma que só terá destaque quando ligado o LED. O efeito valoriza muito o tema, veja a silhueta de teste:

O acabamento é feito com contact branco, para refletir e ‘esparramar’ a cor projetada na parte traseira do desenho.

O hardware poderia ficar completamente na traseira do desenho, saindo apenas 2 fios para a fonte, mas nesse caso pensei em colocar papel de parede por sobre os fios (que são do tipo mais fino e portanto não salientarão sob o papel de parede).

Para prender o desenho a parede, duas formas muito simples; fita dupla-face ou a fita da 3M para quadros. Feito isso, temos o seguinte resultado:

Assim que estiver 100% concluído, libero um video em outro post, pois como pode ser visto, esse é um projeto de baixo custo, porém trabalhoso. Se você considerar que o importante é o resultado, então terá diversão garantida!

Se gostou, não deixe de compartilhar; dê seu like no video e inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Prefere seguir-nos pelo facebook? Basta curtir aqui.

Prefere twitter? @DobitAoByte.

Próximo post a caminho!

Comments

comments

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

Deixe uma resposta