Controlando Led RGB com Arduino e Processing
Vamos a um exemplo de uso da Arduino onde controlo um Led RGB de quatro terminais através da porta serial.
Para enviar as cores através da serial usaremos processing.
Para combinar as cores de um Led RGB é necessário variar a voltagem em cada terminal, e para isso a Arduino conta com 6 pinos PWM (Pulse Width Modulation, Modulação por largura de pulso), somente 3 são necessários, pois o quarto terminal deve ser conectado a GND (terra).
No exemplo conectamos os pinos da seguinte forma:
- Terminal Vermelho no pino 9 (utilizando resistência de 150 Ohm)
- Terminal Azul no pino 10 (utilizando resistência de 90 Ohm)
- Terminal Verde no pino 11 (utilizando resistência de 90 Ohm)
- Terminal terra no pino GND
Obs.: Como não tinha em mãos os resistores liguei os terminais diretamente aos pinos da arduino, mas é importante ressaltar que isso pode danificar o seu led e com certeza reduzir o seu tempo de vida útil.
Espesificação do Led usado:
- Diâmetro: 5mm.
- Bulbo: transparente.
- Intensidade Luminosa: 8000 mcd.
- Voltagem: vermelho = 1.9 ~ 2.4v; verde e azul = 3.2 ~ 3.6v.
- Corrente: 20mA.
- Ângulo: 20 ~ 25º.

Vamos ao código utilizado na arduino:
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 | /** * Controller LED RGB * * @author Bruno Soares * @website www.bsoares.com.br */ #define START_COLOR_CHAR '^' #define END_COLOR_CHAR '$' #define COLOR_SIZE 8 #define PIN_RED 9 #define PIN_GREEN 11 #define PIN_BLUE 10 char serialMessage[COLOR_SIZE]; unsigned int readChar; unsigned int count; unsigned long color; unsigned int r; unsigned int g; unsigned int b; boolean readingSerial; void setup() { Serial.begin(9600); readingSerial = false; } void loop() { if (Serial.available() > 0 && !readingSerial) { if (Serial.read() == START_COLOR_CHAR) { serialReadColor(); } } } void serialReadColor() { readingSerial = true; count = 0; iniReading: if (Serial.available() > 0) { readChar = Serial.read(); if (readChar == END_COLOR_CHAR || count == COLOR_SIZE) { goto endReading; } else { serialMessage[count++] = readChar; goto iniReading; } } goto iniReading; endReading: readingSerial = false; serialMessage[count] = '\0'; setColor(serialMessage); } void setColor(char* value) { // Convert Char* to Long color = atol(value); // Extract RGB r = color >> 16 & 0xFF; g = color >> 8 & 0xFF; b = color >> 0 & 0xFF; // Send values to analog pins analogWrite(PIN_RED, r); analogWrite(PIN_GREEN, g); analogWrite(PIN_BLUE, b); } |
Linha 25) Iniciamos a conexão com a porta serial na velocidade 9600.
Linha 30) Verifica se existe mensagem na porta serial.
Linha 32) Chama o método serialReadColor para iniciar a leitura da serial.
Linha 57) Envia o texto lido entre os caracteres ^ e $ para o método setColor.
Linha 63) Converte o valor obtido para Long.
Linha 66 à 68) Extrai a quantidade de Red, Green e Blue da cor.
Linha 71 à 73) Envia a voltagem para os pinos correspondêntes a cada cor.
Conclusão: A Arduino está programada para receber a cor em formato numérico entre dois caracteres que identificam o inicio e o fim da cor (^ para o inicio e $ para o fim). Sendo assim se enviarmos ^16711680$ o LED ficaria vermelho, pois o número 16711680 é o correspondente á 0xFF0000 (hexadecimal).
Agora o código do Processing:
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 | /** * Controller LED RGB * * @author Bruno Soares * @website www.bsoares.com.br */ import processing.serial.*; Serial port; void setup() { size(100, 150); noStroke(); // Background colorMode(HSB, 100); for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) { stroke(i, j, 100); point(i, j); } } // Select port println(Serial.list()); port = new Serial(this, Serial.list()[1], 9600); } void draw() { // Only to enable the method mouseDragged } void mouseClicked() { processColor(); } void mouseDragged() { processColor(); } void processColor() { color c = get(mouseX, mouseY); noStroke(); fill(c); rect(0, 100, 100, 50); sendColorToSerial(c); } void sendColorToSerial(color colour) { // Get HEX String hexColor = hex(colour, 6); // Convert HEC to Number long numColor = unhex(hexColor); // Send color number to serial port port.write("^" + numColor + "$"); } |
A responsabilidade do Processing é se comunicar com a Arduino via porta serial e enviar as cores, pois com o processing podemos criar um aplicativo onde fica facíl selecionar a cor desejada.
Na linha 50 (método sendColorToSerial), o processing processa o objeto Color, obtendo o seu Hexa, transformando em um número do tipo long, concatenando esse número com os caracteres ^ e $, e finalmente enviando este dado formatado para a porta serial para a Arduino fazer o que está a sua responsabilidade.
É isso ai, fica ai mais uma dica ;-)
Faça o download do código fonte aqui.
Conteúdo relacionado:
- Mais fotos: http://www.flickr.com/photos/bsoares/sets/72157617326290410/
- Led RGB na Wikipedia: http://en.wikipedia.org/wiki/LED#RGB_systems
- Arduino: http://www.arduino.cc
- Processing: http://www.processing.org
- PWM: http://www.arduino.cc/en/Tutorial/PWM
Posts relacionados:
Nem sabia que você tava tocando essa parada aqui. Muito massa. Curto muito experimentos com Arduino. LEDs então, nem se fala.
Pois é Mafra, ainda tenho pouca coisa aqui, mas ta indo, tenho uma folha com muitas idéias de posts, só faltar ir fazendo. O próximo já vai ser uma variação deste mais funcional com vídeo e processing…
Vlw
Hola, estoy muy interesado en la placa de Arduino y en Processing, tengo 4 dias leyendo codigos en processing, me intereso mucho tu trabajo, te felicito por tu proyecto, tengo una duda o mejor dicho una variante, como podria ser para que cargara una imagen en JPG y que mostrara los valores RGB de cada pixel en el LED, muchas gracias por tu ayuda, ya pedi una Arduino para practicar.
Olá Pedro Garza, para obter a cor de cada pixel, uso a função get (desta forma “color c = get(mouseX, mouseY);”), envio essa cor para a função sendColorToSerial, onde processo ela de forma a conseguir o valor da cor em decimal. Concateno com ^ e $ para indicar inicio e fim da mensagem e envio para a porta serial. Na porta serial está a arduino que lê o dado e processa assim:
void setColor(char* value)
{
// Convert Char* to Long
color = atol(value);
// Extract RGB
r = color >> 16 & 0xFF;
g = color >> 8 & 0xFF;
b = color >> 0 & 0xFF;
// Send values to analog pins
analogWrite(PIN_RED, r);
analogWrite(PIN_GREEN, g);
analogWrite(PIN_BLUE, b);
}
analogWrite envia um valor entre 0 e 255 para os pinos correspondentes e assim o LED acende na cor do pixel.
[]‘s
Acho que não explicar, eu aplicar o código, mas para cada pixel em uma imagem JPG e utilizá-lo no LED, você pode me ajudar? Obrigado
PImage img = loadImage(“foto.jpg”);
background(img);
noStroke();
color c = img.get(mouseX, mouseY);
I think those are the same LEDs I’m using for my matrix, if you saw that on flickr: http://www.flickr.com/photos/solipsistnation/3481541451/in/set-72157617203248072/
That’s a neat program you have there. It’s a good demonstration of the range of colors you can get from these LEDs.
Para utilizar a cor do pixel de uma imagem no LED, você precisa trocar o background por uma imagem, somente isso.
Exemplo:
// Background
PImage img = loadImage(“foto.jpg”);
image(img, 0, 0);
Agora se você precisa projetar uma imagem em uma matriz de LEDs, já é outra coisa.
[]‘s
alterar esta:
// Background
colorMode(HSB, 100);
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
stroke(i, j, 100);
point(i, j);
}
}
Para este:
// Background
PImage img = loadImage(”foto.jpg”);
image(img, 0, 0);
Vou tentar amanhã para ter a Arduino e Leds
¡Así es!
:-)
Arduino vai a minha manhã, obrigado pela vossa ajuda, eu tento.
Espero que possamos fazer mais projetos para a prática.
PD. eh o que está escrito em Português traduzido com “Google Translate”
Mira me genero un error, ¿que será?
http://img219.imageshack.us/img219/4768/errorw.jpg
¿necesito poner un ” 0 ” ?
já a trabalhar, eu preciso colocar Nadaman resistência, a cor vermelha é muito fraca
Sim, só trocar o 1 para 0.
port = new Serial(this, Serial.list()[0], 9600);
O datasheet diz que você deve utilizar resistência de 150 Ohm para o terminal vermelho (quando em 5V). Mas utilizei o Datasheet do Led de 5mm. Pode ser que o seu Led seja diferênte.
Você pode mudar a resistência do vermelho.
Obrigado por ajudar a fazer meu primeiro projeto com Arduino, vou ler o manual na web para aprender Arduino, enserio muito obrigado.
Olha esses são os leds que você comprar
http://img12.imageshack.us/img12/7116/ledsa.jpg
Estou aqui para ajudar mesmo :-)
A especificação do seu led é bem diferênte do usado no tutorial. Tente encontrar o datasheet do seu led para usar as resistências corretas.
Abraços
Olá Bruno, eu andei pesquisando CUBOS DE LED, mais nuam achei como construir. e tbm estive pensando futuramente construir uma tela de leds RGB pra passar imagens(tipo filme).minha dúvida é…como construir um cubo de led???? Posta aí pra gente!!!
Olá Renan, da uma olhada neste tutorial aqui:
3x3x3 RGB LED Cube V04
http://embeddedmicro.com/index.php/led-cubes/3x3x3-rgb-led-cube-kit-v04.html
Parece bem completo.
Usei teus códigos hoje pra montar isso. Muito bom!
grats
Aee Guilherme!
vídeo provando hehe
http://www.youtube.com/watch?v=Yt_7sGgkd4M
Guilherme, é isso ae! :-)
opa. vc tem um projeto de um cubo 3x3x3
vc esta usando um gravador de z80…
Olá Bruno, primeiramente parabéns pelos artigos, são bem interessantes! Cheguei até aqui procurando uma integração com Flash e DotNET, mas me interessei muito nos artigos de eletronica, não conheço nada, mas sempre tive interesse em aprender para “fazer” pequenas automações e integração com Sistemas….e nunca achei nada muito explicativo como aqui. Muitobom mesmo, onde posso comprar uma placa dessas para realizar testes? Pode informar +ou- o valor de mercado?
abs
Antonny, não tenho um projeto mas você pode encontrar aqui:
http://www.instructables.com/id/3x3x3-LED-Cube/
http://coilgunpower.com/picproj/333cube.php
http://www.youtube.com/watch?v=_SO1J1kP3YQ
E não estou utilizando gravador, pela porta USB da Arduino já da pra gravar no microcontrolador.
Olá Emerson, muito boa a sua curiosidade, eletrônica é um robby bem legal!
Eu comprei a minha no mercado livre (http://lista.mercadolivre.com.br/arduino)
Quanto a integração da Arduino com .NET nunca parecei para pensar como seria, mas com certeza vai utilizar a porta COM, pois é a interface de comunicação com o computador.
Tem um arquivo aqui falando sobre a integração com PHP, é ridículo de fácil, da uma olhada.
Da uma olhada em:
System.IO.Ports;
SerialPort port = new SerialPort(…
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx
;-)
Hola Bruno Soares, el led que usas es ánodo comun o cátodo comun?
Olá Fiules, estou usando ânodo comum, você pode verificar pelo fio branco ligado a GND.
hola de nuevo bruno, creo que tu estas usando un led rgb de catodo comun, ya que el catodo es el que se conecta a tierra. Yo intente usar tu codigo con un led rgb de anodo comun y no funcionó, pero al colocarlos al reves funciona, con el problema de que puedo conectar solo un color. No hay alguna forma de cambiar el codigo para que funcione con un led de anodo comun?
Gracias Bruno
Nossa!! me desculpe Fiules, é cátodo comum mesmo, pensei em cátodo e escrevi ânodo =S
hehe
Quanto a utilizar um led ânodo comum, para te falar a verdade não faço ideia de como ligar, precisaria testar e ver como funciona.
Mas tenho uma dica de como poderia funcionar (não deve ser a melhor forma).
Você pode alternar a cor muitas vezes por segundo e variar a tensão no terminal comum (positivo).
Sem experimentar ou fazer testes está é a melhor ideia que posso ter.
Abraços
Parabens otimo post .Como faço para determinar um numero de pixel por led numa tela de rgb?
Oi Vitor, então você quer pegar cada pixel do processing e enviar para um pixel da tela led?
Se for isto, vai depender da tela que você tem, da resolução que você quer chegar, a velocidade de atualização da imagem, velocidade de comunicação entre processing e arduino. Mas é possível sim.
Boa sorte :-)
FIULES, tenho uma solução prática para você que usa LED´s do tipo ANODO.
Ligue o anodo ao VCC, e coloque essa alteração no código.
r = color >> 16 & 0xFF;
g = color >> 8 & 0xFF;
b = color >> 0 & 0xFF;
//ALTERAÇÕES PARA LED TIPO ANODO.
r = 255 – r;
g = 255 – g;
b = 255 – b;
Desculpe reviver o post, é que o vi hoje.
Parabéns pela iniciativa!
Vlw ViliNeto!
Olá Bruno
Estou querendo desenvolver um sistema com leds RGB cotrolados pela RS485.
Você poderia me ajudar?
Aguardo a sua resposta.
Até mais.
cara…parabens pelo post.
mas me tira uma duvida, tentei compilar os codigo aqui…no processing beleza, ele abre a caixinha de cores..ai qdo eu manda executar o arduino ele diz q a porta, no meu caso COM6, já esta sendo utilizada… e o led não acende. manja como posso resolver ?? abraço!
Daniel, se você estiver usando a IDE da Arduino, pode ser que a janela Serial Monitor esteja aberta, ai ela usa a porta serial e não deixa o processing usar. Tente fechar a IDE da Arduino para testar.
att
Opa Bruno, iniciante aqui :)
Existe uma tabela com as cores, já em PWM para cada pino ?
Se não, como posso fazer !
Olá, o método “void setColor(char* value)” faz a conversão do RGB em Hexa para os PWMs de cada canal.
Att
Os meus leds rgb funcionam com um 5V fixo e o gnd nos três pinos restantes, isso é normal? Tentei usar o código do post e não acende, só da forma que eu falei, e eu não consigo pensar numa maneira de fazer um código pros meus leds.
É normal, o seu LED é cátodo comun.
bruno esse seu codigo esta em que linguagem?
Processing (Java), Arduino (C++).
Boa Noite Bruno, cara subi o arquivo paro o Arduino, mais ao executar o codigo do Processing me retorna o erro abaixo, sabe o que pode ser, colei o codigo ^16711680$ no Serial Monitor e o Vermelhoo acendeu normalmente.
WARNING: RXTX Version mismatch
Jar version = RXTX-2.2pre1
native lib Version = RXTX-2.2pre2
[0] \COM1\
Exception in thread \Animation Thread\ java.lang.ArrayIndexOutOfBoundsException: 1
at WriteTest.setup(WriteTest.java:48)
at processing.core.PApplet.handleDraw(Unknown Source)
at processing.core.PApplet.run(Unknown Source)
at java.lang.Thread.run(Thread.java:662)
Olá Bruno.
Sou super iniciante em Arduíno…
A única coisa que não ficou explicado (pelo menos para mim) é como é feito o controle das cores que irão aparecer no led… Falo depois do projeto pronto e funcionando, como um programa fará a transmissão do código da cor a ser recebida pelo Arduíno?
No mais, parabéns pela simplicidade e objetividade!
Abraço.
Bruno,
Estou começando com Arduino, não sou profissional da eletrônica ou da programação, mas tenho observado e gostado de seus projetos, e vejo que são bem práticos.
Achei interessante a forma de separação das informações transmitidas para o Arduino, e estou implementando ela em uma comunicação EIA-485, provavelmente ficará mais profissional do que a forma que venho até então.
Parabéns pelos trabalhos, e continue com este blog que está interessante!
Abraço!
OLá como eu fasso para o pc criar as ores? qual programa usar?
Qual é o nome desse material usado pra cobrir o led rgb?