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º.
  • 5mm rgb led color especification

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:


Posts relacionados:

  1. Controlando a Arduino com PHP via porta serial
  2. PianoDuino (Arduino + Processing + SoundCipher)
  3. Ping Pong com Matriz de Leds 8×8
  4. Twitter Hardware
  5. Classe C++ para controlar Display de 7 seguimentos

  1. Nem sabia que você tava tocando essa parada aqui. Muito massa. Curto muito experimentos com Arduino. LEDs então, nem se fala.

  2. Bruno Soares disse:

    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

  3. Pedro Garza disse:

    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.

  4. Bruno Soares disse:

    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

  5. Pedro Garza disse:

    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);

  6. solipsistnation disse:

    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.

  7. Bruno Soares disse:

    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

  8. Pedro Garza disse:

    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

  9. Pedro Garza disse:

    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”

  10. Pedro Garza disse:

    Mira me genero un error, ¿que será?

    http://img219.imageshack.us/img219/4768/errorw.jpg

  11. Pedro Garza disse:

    ¿necesito poner un ” 0 ” ?

  12. Pedro Garza disse:

    já a trabalhar, eu preciso colocar Nadaman resistência, a cor vermelha é muito fraca

  13. Bruno Soares disse:

    Sim, só trocar o 1 para 0.
    port = new Serial(this, Serial.list()[0], 9600);

  14. Bruno Soares disse:

    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.

  15. Pedro Garza disse:

    Obrigado por ajudar a fazer meu primeiro projeto com Arduino, vou ler o manual na web para aprender Arduino, enserio muito obrigado.

  16. Pedro Garza disse:

    Olha esses são os leds que você comprar

    http://img12.imageshack.us/img12/7116/ledsa.jpg

  17. Bruno Soares disse:

    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

  18. Renan Pasotti disse:

    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!!!

  19. Bruno Soares disse:

    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.

  20. Guilherme Land disse:

    Usei teus códigos hoje pra montar isso. Muito bom!

    grats

  21. Bruno Soares disse:

    Guilherme, é isso ae! :-)

  22. antonny allan disse:

    opa. vc tem um projeto de um cubo 3x3x3

  23. antonny allan disse:

    vc esta usando um gravador de z80…

  24. Emerson JR disse:

    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

  25. Bruno Soares disse:

    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.

  26. Bruno Soares disse:

    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

    ;-)

  27. FIULES disse:

    Hola Bruno Soares, el led que usas es ánodo comun o cátodo comun?

  28. Bruno Soares disse:

    Olá Fiules, estou usando ânodo comum, você pode verificar pelo fio branco ligado a GND.

  29. FIULES disse:

    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

  30. Bruno Soares disse:

    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

  31. vitor disse:

    Parabens otimo post .Como faço para determinar um numero de pixel por led numa tela de rgb?

    • Bruno Soares disse:

      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 :-)

  32. ViliNeto disse:

    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!

  33. Mario disse:

    Olá Bruno

    Estou querendo desenvolver um sistema com leds RGB cotrolados pela RS485.
    Você poderia me ajudar?
    Aguardo a sua resposta.
    Até mais.

  34. Daniel disse:

    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!

    • Bruno Soares disse:

      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

  35. João C disse:

    Opa Bruno, iniciante aqui :)

    Existe uma tabela com as cores, já em PWM para cada pino ?

    Se não, como posso fazer !

  36. Lucas Feijó disse:

    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.

  37. Luca disse:

    bruno esse seu codigo esta em que linguagem?

  38. Bruno Soares disse:

    Processing (Java), Arduino (C++).

  39. Evandro disse:

    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)

  40. Marcelo disse:

    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.

  41. Orlando disse:

    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!

  42. deives disse:

    OLá como eu fasso para o pc criar as ores? qual programa usar?

  43. Luciano disse:

    Qual é o nome desse material usado pra cobrir o led rgb?

  44. Dan disse:

    NEW Processing v2.0.1

    This doesn’t work anymore?? Is there a fix?

    processColor void () {
    color c = get (mouseX, mouseY);
    noStroke ();
    fill (c);
    rect (0, 100, 100, 50);

  45. José Neres disse:

    Oi, Bruno.

    Estou com dúvida de como adaptar o código para rodar um motor de passo. A parte do PHP consegui normal (inclusive teste com LED RGB e se comunicou perfeito), mas gostaria de saber como adaptar os códigos para o caso do acionamento de um motor de passo de 4 fios.

  1. [...] de escrever o código randômico proposto, sugiro a leitura do artigo do Bruno Soares, que escreveu um código bem elaborado para se selecionar cores e é bastante [...]

  2. Related.. Trackback…

    [...]the time to read or visit the content or sites we have linked to below the[...]…

  3. letreros luminosos…

    [...]Controlando Led RGB com Arduino e Processing | Bruno Soares[...]…

  4. Prestashop Theme…

    [...]Controlando Led RGB com Arduino e Processing | Bruno Soares[...]…

  5. [...] de escrever o código randômico proposto, sugiro a leitura do artigo do Bruno Soares, que escreveu um código bem elaborado para se selecionar cores e é bastante [...]

  6. Porta de entrada na Bolsa, ETFs atraem investidor sem tempo livre…

    Aqui Controlando Led RGB com Arduino e Processing | Bruno Soares vi muitas coisas. Agora: Wednesday! Ressurgi aqui: Controlando Led RGB com Arduino e Processing | Bruno Soares….

Leave a Reply