14 de outubro de 2012

Disco RGB - Sequencial 18 canais

Um sequencial de 18 canais com 12 Leds RGB! Agora a discoteca ficou pronta!



Fiz o circuito baseado na plataforma Arduino. Com os 18 canais consigo controlar 6 Leds RGB individualmente, e dessa forma liguei os outros 6 Leds em paralelo.

A montagem final fiz em duas placas, sendo uma para os Leds e outra para o circuito do microcontrolador.


Não programei muitas sequencias, mas o efeito já ficou bem bacana!

Segue o esquema elétrico e o código fonte.

Abraços!

/*---------------------------------------------------------
  Programa : DISCO RGB
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 06/10/2012
  ---------------------------------------------------------*/

int total = 6;
int r[6] = {
  0,3,6,9,12,15};
int g[6] = {
  1,4,7,10,13,16};
int b[6] = {
  2,5,8,11,14,17};

/*----- SETUP -----*/
void setup(){
  for (int i=0; i<total; i++){
    pinMode(r[i], OUTPUT);
    pinMode(g[i], OUTPUT);
    pinMode(b[i], OUTPUT); 
  }
  randomSeed(analogRead(5));  //Para o random ficar aleatorio, sem repetir a sequencia.
  startRGB();
}

/*----- LOOP PRINCIPAL -----*/
void loop(){
  int disco = random(9);

  switch (disco){
  case 0:
    blinkRGB(40);
    flashRGB(6);
    blinkRGB(7);
    flashRGBdouble(2);
    break;

  case 1:
    discoSwapColor(6, 80);
    discoSwapColor(7, 50);
    discoSwapColor(10, 30);
    break;

  case 2:
    discoRGB(7, 100);
    discoRGB(6, 200);
    discoRGB(11, 70);
    break;

  case 3:
    discoSwapColor(4, 100);
    discoSwapColor(3, 50);
    break;

  case 4:
    flashRGBall(6);
    break;

  case 5:
    flashRGBdouble(5);
    break;

  case 6:
    police();
    break;

  case 7:
    runDiscoRGBrandom(7);
    break;

  case 8:
    running(12);
    break;
  }
}

/*----- APAGA TODOS OS LEDS -----*/
void turnOff(){
  for (int i=0; i<total; i++){
    digitalWrite(r[i], LOW);
    digitalWrite(g[i], LOW);
    digitalWrite(b[i], LOW);
  }
}

/*----- TODOS ACESSOS -----*/
void turnOn(){
  for (int i=0; i<total; i++){
    digitalWrite(r[i], HIGH);
    digitalWrite(g[i], HIGH);
    digitalWrite(b[i], HIGH);
  }
}

/*----- VERMELHO -----*/
void red(){
  turnOff();
  for (int i=0; i<total; i++){
    digitalWrite(r[i], HIGH);
  }
}

/*----- VERDE -----*/
void green(){
  turnOff();
  for (int i=0; i<total; i++){
    digitalWrite(g[i], HIGH);
  }
}

/*----- AZUL -----*/
void blue(){
  turnOff();
  for (int i=0; i<total; i++){
    digitalWrite(b[i], HIGH);
  }
}

/*----- START -----*/
void startRGB(){
  turnOff();
  delay(1000);
  turnOn();
  delay(3000);
  for (int k=0; k<50; k++){
    turnOff();
    delay(20);
    turnOn();
    delay(20);
  }
  turnOff();
  delay(1000);
}

/*----- CORRIDA VERMELHO -----*/
void runRed(int qtd, int s, boolean clockwise){
  //qtd = Quantidade de voltas.
  //s = Velocidade.
  //clockwise = Sentido da volta.
  for (int x=0; x<qtd; x++){
    turnOff();
    if (clockwise == true){
      for (int i=0; i<total; i++){
        digitalWrite(r[i], HIGH);
        delay(s);
        digitalWrite(r[i], LOW);
      }
    }
    else{
      for (int i=total-1; i>=0; i--){
        digitalWrite(r[i], HIGH);
        delay(s);
        digitalWrite(r[i], LOW);
      }
    }
  }
}

/*----- CORRIDA VERDE -----*/
void runGreen(int qtd, int s, boolean clockwise){
  //qtd = Quantidade de voltas.
  //s = Velocidade.
  //clockwise = Sentido da volta.
  for (int x=0; x<qtd; x++){
    turnOff();
    if (clockwise == true){
      for (int i=0; i<total; i++){
        digitalWrite(g[i], HIGH);
        delay(s);
        digitalWrite(g[i], LOW);
      }
    }
    else{
      for (int i=total-1; i>=0; i--){
        digitalWrite(g[i], HIGH);
        delay(s);
        digitalWrite(g[i], LOW);
      }
    }
  }
}

/*----- CORRIDA AZUL -----*/
void runBlue(int qtd, int s, boolean clockwise){
  //qtd = Quantidade de voltas.
  //s = Velocidade.
  //clockwise = Sentido da volta.
  for (int x=0; x<qtd; x++){
    turnOff();
    if (clockwise == true){
      for (int i=0; i<total; i++){
        digitalWrite(b[i], HIGH);
        delay(s);
        digitalWrite(b[i], LOW);
      }
    }
    else{
      for (int i=total-1; i>=0; i--){
        digitalWrite(b[i], HIGH);
        delay(s);
        digitalWrite(b[i], LOW);
      }
    }
  }
}

/*----- SEQUENCIAL CORRIDA RANDOM -----*/
void runDiscoRGBrandom(int qtd){
  for (int z=0; z<qtd; z++){
    int qtdRun = random(1,6);
    int s = random(30, 70);
    int rgb = random(3);
    boolean clockwise = random(2);
    switch (rgb){
    case 0:
      runRed(qtdRun, s, clockwise);
      break;
    case 1:
      runGreen(qtdRun, s, clockwise);
      break;
    case 2:
      runBlue(qtdRun, s, clockwise);
      break;
    }
  }
}

/*----- CORRIDA COM COR DE FUNDO -----*/
void run(int qtd, int s, boolean clockwise, int color, int bgcolor){
  //qtd = Quantidade de voltas.
  //s = Velocidade.
  //clockwise = Sentido da volta.
  //color = Cor da volta. (0 = RED / 1 = GREEN / 2 = BLUE);
  //bgcolor = Cor de fundo.

  if (clockwise == true){
    for (int j=0; j<qtd; j++){
      for (int i=0; i<6; i++){
        //BACKGROUND COLOR
        if (bgcolor == 0){
          red();
          digitalWrite(r[i], LOW);
        }
        else if (bgcolor == 1){
          green();
          digitalWrite(g[i], LOW);
        }
        else if (bgcolor == 2){
          blue();
          digitalWrite(b[i], LOW);
        }
        //COLOR
        if (color == 0){
          digitalWrite(r[i], HIGH);
        }
        else if (color == 1){
          digitalWrite(g[i], HIGH);
        }
        else if (color == 2){
          digitalWrite(b[i], HIGH);
        }
        delay(s);
      }
    }
  }
  else{
    for (int j=0; j<qtd; j++){
      for (int i=5; i>=0; i--){
        //BACKGROUND COLOR
        if (bgcolor == 0){
          red();
          digitalWrite(r[i], LOW);
        }
        else if (bgcolor == 1){
          green();
          digitalWrite(g[i], LOW);
        }
        else if (bgcolor == 2){
          blue();
          digitalWrite(b[i], LOW);
        }
        //COLOR
        if (color == 0){
          digitalWrite(r[i], HIGH);
        }
        else if (color == 1){
          digitalWrite(g[i], HIGH);
        }
        else if (color == 2){
          digitalWrite(b[i], HIGH);
        }
        delay(s);
      }
    } 
  }
}

/*----- CORRIDA COM CORES RANDOMICAS -----*/
void running(int qtd){
  for (int i=0; i<qtd; i++){
    int qtdRun = random(1,8);
    int s = random(30, 80);
    int rgbColor = random(3);
    int rgbBgColor = random(3);
    boolean clockwise = random(2);
    while (rgbColor == rgbBgColor){
      rgbBgColor = random(3);
    }
    run(qtdRun, s, clockwise, rgbColor, rgbBgColor);
  }
}

/*----- PISCA CORES -----*/
void blinkRGB(int qtd){
  for (int i=0; i<qtd; i++){
    int rgb = random(4);
    int s = random(30, 150);
    switch (rgb){
    case 0:
      red();
      break;
    case 1:
      green();
      break;
    case 2:
      blue();
      break;
    case 3:
      turnOn();
      break;
    }
    delay(s);
  }
}

/*----- FLASHS RANDOMICOS -----*/
void flashRGB(int qtd){
  int t1 = 15;
  int t2 = 100;
  int rgb = random(3);
  int led = random(total);
  turnOff();

  for (int i=0; i<qtd*10; i++){
    int rgb = random(3);
    int led = random(total);
    switch (rgb){
    case 0:
      digitalWrite(r[led],HIGH);
      delay(t1);
      digitalWrite(r[led],LOW);
      delay(t2);
      break;
    case 1:
      digitalWrite(g[led],HIGH);
      delay(t1);
      digitalWrite(g[led],LOW);
      delay(t2);
      break;
    case 2:
      digitalWrite(b[led],HIGH);
      delay(t1);
      digitalWrite(b[led],LOW);
      delay(t2);
      break;
    }
  }
}

/*----- FLASHS RANDOMICOS DUPLO -----*/
void flashRGBdouble(int qtd){
  int t1 = 15;
  int t2 = 100;
  int rgb = random(3);
  int led = random(total);
  turnOff();

  for (int i=0; i<qtd*10; i++){
    int rgb = random(3);
    int led = random(total);
    switch (rgb){
    case 0:
      digitalWrite(r[led],HIGH);
      digitalWrite(r[led+1],HIGH);
      delay(t1);
      digitalWrite(r[led],LOW);
      digitalWrite(r[led+1],LOW);
      delay(t2);
      break;
    case 1:
      digitalWrite(g[led],HIGH);
      digitalWrite(g[led+1],HIGH);
      delay(t1);
      digitalWrite(g[led],LOW);
      digitalWrite(g[led+1],LOW);
      delay(t2);
      break;
    case 2:
      digitalWrite(b[led],HIGH);
      digitalWrite(b[led+1],HIGH);
      delay(t1);
      digitalWrite(b[led],LOW);
      digitalWrite(b[led+1],LOW);
      delay(t2);
      break;
    }
  }
}

/*----- FLASHS TODOS LEDS-----*/
void flashRGBall(int qtd){
  int t1 = 40;
  int t2 = 100;
  for (int w=0; w<qtd; w++){
    int rgb = random(3);
    for (int i=0; i<7; i++){
      if (rgb == 0){
        red();
      }
      else if (rgb == 1){
        green();
      }
      else{
        blue();
      }
      delay(t1);
      turnOff();
      delay(t1);
    }
    delay(t2);
  }
}

/*----- TROCA DE CORES -----*/
void discoSwapColor(int qtd, int s){
  int t = s*3;
  for (int z=0; z<qtd; z++){
    int clockwise = random(2);
    int rgb = random(3);

    switch (rgb){
    case 0:
      //Acende Vermelho
      if (clockwise == 0){
        for (int i=0; i<total; i++){
          digitalWrite(r[i], HIGH);
          digitalWrite(g[i], LOW);
          digitalWrite(b[i], LOW);
          delay(s);
        }
      }
      else{
        for (int i=total-1; i>=0; i--){
          digitalWrite(r[i], HIGH);
          digitalWrite(g[i], LOW);
          digitalWrite(b[i], LOW);
          delay(s);
        }
      }
      delay(t);
      break;

    case 1:
      //Acende Verde
      if (clockwise == 0){
        for (int i=0; i<total; i++){
          digitalWrite(r[i], LOW);
          digitalWrite(g[i], HIGH);
          digitalWrite(b[i], LOW);
          delay(s);
        }
      }
      else{
        for (int i=total-1; i>=0; i--){
          digitalWrite(r[i], LOW);
          digitalWrite(g[i], HIGH);
          digitalWrite(b[i], LOW);
          delay(s);
        }
      }
      delay(t);
      break;

    case 2:
      //Acende Azul
      if (clockwise == 0){
        for (int i=0; i<total; i++){
          digitalWrite(r[i], LOW);
          digitalWrite(g[i], LOW);
          digitalWrite(b[i], HIGH);
          delay(s);
        }
      }
      else{
        for (int i=total-1; i>=0; i--){
          digitalWrite(r[i], LOW);
          digitalWrite(g[i], LOW);
          digitalWrite(b[i], HIGH);
          delay(s);
        }
      }
      delay(t);
      break;
    }
  }
}

/*----- RODA COM UM LED EM CADA COR -----*/
void discoRGB(int qtd, int s){
  int clockwise = random(2);
  turnOff();
  for (int x=0; x<qtd; x++){
    if (clockwise == 0){
      for (int i=0; i<4; i++){
        digitalWrite(r[i], HIGH);
        digitalWrite(g[i+1], HIGH);
        digitalWrite(b[i+2], HIGH);
        delay(s);
        digitalWrite(r[i], LOW);
        digitalWrite(g[i+1], LOW);
        digitalWrite(b[i+2], LOW);
      }
    }
    else{
      for (int i=3; i>=0; i--){
        digitalWrite(r[i], HIGH);
        digitalWrite(g[i+1], HIGH);
        digitalWrite(b[i+2], HIGH);
        delay(s);
        digitalWrite(r[i], LOW);
        digitalWrite(g[i+1], LOW);
        digitalWrite(b[i+2], LOW);
      }
    }
  }
}

/*----- EFEITO POLICIA -----*/
void police(){
  int t = 30;
  //Metade vermelho e metade azul.
  for (int i=0; i<3; i++){
    for (int k=0; k<15; k++){
      digitalWrite(r[0], HIGH);
      digitalWrite(r[1], HIGH);
      digitalWrite(r[2], HIGH);
      delay(t);
      turnOff();
      delay(t); 
    }
    for (int k=0; k<15; k++){
      digitalWrite(b[3], HIGH);
      digitalWrite(b[4], HIGH);
      digitalWrite(b[5], HIGH);
      delay(t);
      turnOff();
      delay(t); 
    }
  }
  delay(100);
  //Todos juntos.
  for (int i=0; i<3; i++){
    for (int k=0; k<15; k++){
      red();
      delay(t);
      turnOff();
      delay(t); 
    }
    for (int k=0; k<15; k++){
      blue();
      delay(t);
      turnOff();
      delay(t); 
    }
  }
}

30 comentários:

  1. VOCE É UM EXPERT MUITO BOM TRABALHO VOCE NAO TEM UM VIDEO COMO FAZER UM ARDUINO STANDALONE SE TIVER POSTA AI. EU FIZ UM MAS NAO FUNCIONOU.

    ResponderExcluir
    Respostas
    1. Obrigado pelo elogio! Sobre montar um standalone, já vi alguns posts bem feitos sobre isso, mas posso sim fazer um post tbm. Abraços!

      Excluir
  2. Adoro seus projetos e os videos que vc coloca para vermos os resultados so que hj fui entrar nos videos para mostrar para um amigo esta bloqueado.
    Que maldade libera ai

    ResponderExcluir
    Respostas
    1. Opa! Valeu pelo elogio! E obrigado por alertar sobre os videos bloqueados. Youtube bloqueou devido uma restrição na minha conta, mas já reconfigurei e ta liberado novamente. Abraços!

      Excluir
  3. Ola Fellipe,
    Como eu sou novo nessa area,queria saber como eu faço para fazer o meu projeto sem o arduino,so montando um circuito

    ResponderExcluir
    Respostas
    1. Olá Marco Túlio!
      Procure sobre Arduino StandAlone. É bem tranquilo de montar! E bem barato!
      Abraços!!

      Excluir
  4. Amigo qual seria a diferença de colocar um so resistor no negativo ou 3 um em cada fase dos leds? eu contrui um disco e ficou muito bom, parabens mas nao esta acendendo igual ao seu, se puder me ajudar agradeço...

    ResponderExcluir
    Respostas
    1. Bom dia, Dornellas!
      Legal saber que você construiu um disco!
      Sobre os resistores acho que você entenderia melhor através desse link: http://www.py2bbs.qsl.br/led.php
      Qual erro/problema está havendo? Qualquer coisa, pode me passar um e-mail também.
      Abraços!

      Excluir
  5. Olá Fellipe,
    Você tem alguma versão desde projeto que inclua um microfone e faça os movimentos de acordo com as batidas da música?

    Abraços,

    Eduardo

    ResponderExcluir
    Respostas
    1. Olá Eduardo!
      Quando fiz esse projeto, a minha ideia seria montar num próximo passo a versão com microfone. Mas acabei não fazendo.
      Mas não seria complicado pra vc conseguir adaptar pra esse projeto. Se for fazer e precisar de alguma ajuda, só entrar em contato.
      Abraços!!

      Excluir
  6. Ola Felipe ... vejo que no seu projeto vc usa leds RGB catodo comum ...seu projeto cai como uma luva para uns leds que comprei por engano e nao tinha onde usa-los ...graças a vc , eles terão utilidade. obrigado e siga em frente com seu blog...seus fãs agradecem !!! Aproveitando que sou um entusiasta de arduino ....leds e audio , peço que pense na ipótese de criar um projeto de VU de leds , existem muitos no youtube , mas a grande maioria sao sem PCB e Código...so servem mesmo pra ficarmos babando..rsrsrsrsrs um grade abraço... Eduardo.

    ResponderExcluir
    Respostas
    1. Opa!!! Obrigado pelo elogio!! Fico feliz!!!
      Ah sim, um VU de leds já ta na lista das brincadeiras pra fazer! :D
      Abraços!!

      Excluir
  7. Cara !!!! Estou pasmo !!! Fiz um curso básico de eletrônica há uns 16 anos atrás e não consegui estudar mais por causa do trabalho no comércio e pela cidade não oferecer algo no campo da eletrônica. Se for possível gostaria que vc me indicasse alguns cursos sobre arduíno. Sou interessado em montar esses equipamentos para festas e fiquei arrepiado de ver o que tem no seu blog. Mas meu nível em eletrônica é básico e arduíno é chinês pra mim..kkkk. Compro componentes direto da china pois mesmo com o dólar em alta, ainda compensa qdo são em grandes quantidades e este circuito é o que procurava há anos.. Parabéns, vc ganhou mais um fã e divulgador do seu blog. Continue assim.

    ResponderExcluir
    Respostas
    1. Bom dia, Rogerio! Obrigado pelo elogio ao blog!!!
      Um curso gratuito e bem interessante para iniciar com arduino, é do LabdeGaragem: http://www.youtube.com/watch?v=q4FoNuzkPX8
      Abraços!!

      Excluir
  8. Rapaz sensacional!! Que lógica foda!! Parabéns ficou muito bom!!

    ResponderExcluir
  9. Boa noite amigo. Show de bola cara. Será que vc poderia postar o esquema que vc usou e o arquivo HEX já pronto?? Vi que vc já postou todo código da compilação, mas nunca consigo compilar. Se puder me passar o hex para eu fazer a gravação e o esquema de componentes (cristal, capacitores, etc) Forte Abraço.

    ResponderExcluir
    Respostas
    1. Bom dia! O esquema é o que está na imagem postada mesmo. O Arduino foi montado de forma standalone. Microcontrolador ATmega328, um cristal 16Mhz,... Circuito bastante simples. Procure Arduino standalone. Qual erro está tendo ao compilar? O código fonte postado está correto, e não necessita de nenhuma biblioteca. Abraços!

      Excluir
  10. Fallipe Parabens pelo seu trabalho, estou presissando de um sistema assim, se puder entrar em contato para negociarmos. whats 41 91561075 ou pelo face Julio Reis

    ResponderExcluir
  11. Bom dia seu video esta bloqueado pq??

    ResponderExcluir
  12. Brother, ficou maneiro. Vou fazer um desses para mim... só fiquei um pouco preocupado com 2 leds na saída do Arduíno, acho que a corrente deve ficar maior que 40ma. Parabéns

    ResponderExcluir
    Respostas
    1. Boa tarde!
      LEDs normais de 5mm podem ligar dois sem problemas.
      Abraços!

      Excluir
  13. Boa noite
    o video do disco foi retirado gostaria de pode ver os efeitos
    Grato

    ResponderExcluir
    Respostas
    1. Boa tarde!
      Verifiquei agora e o vídeo está normal.

      Excluir
  14. ola bom dia montei este projeto mas não funcionou aprece uma mensagem que diz que o código fonte é muito grande como posso resolver, estou usando uma arduino uno, obrigado (Manoel)

    ResponderExcluir
    Respostas
    1. Bom dia!
      Se possível, me envie a mensagem completa do erro. Várias pessoas utilizaram com modelo UNO e funciona normal. O projeto foi feito utilizando o ATMEGA328 com bootloader do UNO mesmo.
      Abraços!

      Excluir
  15. olá boa noite, aparece esta mensagem. binary sketch size: 6.686 bytes (of a 258.048 byte maximum)

    obrigado: (Manoel)

    ResponderExcluir
    Respostas
    1. Essa mensagem não é um erro, é a mensagem de retorno do compilador. Seu código fonte tem 6686 bytes, e o limite máximo permitido é 258048.
      Abraços!

      Excluir
  16. obrigado por me ajudar, não sei o que tem de errado a compilação é feita mas fica so nisso, acende so o primeiro led e fica aceso o tempo todo. vou comprar outro arduino e ver se funciona. (Manoel)

    ResponderExcluir
  17. olá boa noite comprei outro arduino, não resolveu ficou do mesmo jeito (Manoel)

    ResponderExcluir