19 de setembro de 2012

Super Sequencial de LEDs

Fala meu povo! São 30 Leds no sequencial!



Usei praticamente o mesmo código fonte do post Sequencial de LEDs, porém nesse esta incluído a milagrosa biblioteca ShiftOutMega, que possibilita ampliar o número de saídas do Arduino usando os registradores de deslocamento 74HC595.

A alteração mais significativa no código foi alterar o controle de acionamento dos Leds, onde foi substituído o digitalWrite() pela função mega.shiftWrite() da biblioteca.

Para informações sobre a biblioteca:
http://www.efeitonerd.com.br/2012/09/ampliar-saidas-do-arduino-library.html

O circuito é composto por um Arduino, onde usamos somente 3 saídas, 4 registradores 74HC595, e mais 30 Leds com seus respectivos resistores de 220 ohms.

Segue uma foto dos registradores, a imagem do esquema elétrico, e o código fonte.

That's all folks!


  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
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
/*---------------------------------------------------------
  Programa : SUPER SEQUENCIAL DE LEDS
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 19/09/2012
  ---------------------------------------------------------*/

//Inclui a bilioteca ShiftOutMega
#include <ShiftOutMega.h>

//Variáveis de uso dos registradores 74HC595
int latchPin = 8;  //Pino 8 conectado ao pino 12 do 74HC595 (Latch).
int dataPin = 11;  //Pino 11 conectado ao pino 14 do 74HC595 (Data).
int clockPin = 12; //Pino 12 conectado ao pino 11 do 74HC595 (Clock).

//Quantidade de registradores (74HC595). Para cada registrador, temos 8 saídas.
int qtdRegistradores = 4;

int totalSaidas = 30; //Até 32 saídas com 4 registradores.
int totalSequencias = 10;
int led[] = {
  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}; //Pinos dos leds.

//Inicia a biblioteca passando os parametros de uso.
ShiftOutMega mega(latchPin, dataPin, clockPin, qtdRegistradores);

void setup(){
}

void loop(){
  for (int i=1; i<=totalSequencias; i++){
    for (int j=0; j<3; j++){
      sequencia(i);
    }
  }
}

//------------------------------
void sequencia(int s){
  switch (s){
  case 1:
    s1();
    break;
  case 2:
    s2();
    break;
  case 3:
    s3();
    break;
  case 4:
    s4();
    break;
  case 5:
    s5();
    break;
  case 6:
    s6();
    break;
  case 7:
    s7();
    break;
  case 8:
    s8();
    break;
  case 9:
    s9();
    break;
  case 10:
    s10();
    break;
  }
}

//------------------------------
void AcendeTodos(){
  for (int i=0; i<totalSaidas; i++){
    mega.shiftWrite(led[i],HIGH);
  }
}

//------------------------------
void ApagaTodos(){
  for (int i=0; i<totalSaidas; i++){
    mega.shiftWrite(led[i],LOW);
  }
}

//------------------------------
void s1(){
  int t1 = 10;
  ApagaTodos();
  //Acende um por um.
  for (int i=0; i<totalSaidas; i++){
    mega.shiftWrite(led[i],HIGH);
    delay(t1);
  }
  //Apaga um por um.
  for (int i=0; i<totalSaidas; i++){
    mega.shiftWrite(led[i],LOW);
    delay(t1);
  }
}

//------------------------------
void s2(){
  int t1 = 10;
  ApagaTodos();
  //Acende um por um.
  for (int i=0; i<totalSaidas; i++){
    mega.shiftWrite(led[i],HIGH);
    delay(t1);
  }
  //Apaga um por um.
  for (int i=0; i<totalSaidas-1; i++){
    mega.shiftWrite(led[i],LOW);
    delay(t1);
  }
  //Acende um por um. (inverso)
  for (int i=totalSaidas-1; i>=0; i--){
    mega.shiftWrite(led[i],HIGH);
    delay(t1);
  }
  //Apaga um por um. (inverso)
  for (int i=totalSaidas-1; i>0; i--){
    mega.shiftWrite(led[i],LOW);
    delay(t1);
  }
}

//------------------------------
void s3(){
  //ABRE E FECHA.
  int t1 = 10;
  ApagaTodos();
  for (int i=0; i<totalSaidas/2; i++){
    mega.shiftWrite(led[i],HIGH);
    mega.shiftWrite(led[totalSaidas-1-i],HIGH);
    delay(t1);
  }
  for (int i=0; i<(totalSaidas/2)-1; i++){
    mega.shiftWrite(led[i],LOW);
    mega.shiftWrite(led[totalSaidas-1-i],LOW);
    delay(t1);
  }
  for (int i=(totalSaidas/2)-2; i>=0; i--){
    mega.shiftWrite(led[i],HIGH);
    mega.shiftWrite(led[totalSaidas-1-i],HIGH);
    delay(t1);
  }
  for (int i=(totalSaidas/2)-1; i>0; i--){
    mega.shiftWrite(led[i],LOW);
    mega.shiftWrite(led[totalSaidas-1-i],LOW);
    delay(t1);
  }
}

//------------------------------
void s4(){
  //POLÍCIA
  int t1 = 1;
  ApagaTodos();
  //Lado 1 acesso. (piscando)
  for (int j=0; j<totalSaidas/4; j++){
    for (int i=0; i<totalSaidas/2; i++){
      mega.shiftWrite(led[i],HIGH);
    }
    delay(t1);
    for (int i=0; i<totalSaidas/2; i++){
      mega.shiftWrite(led[i],LOW);
    }
    delay(t1);
  }
  //Lado 2 acesso. (piscando)
  for (int j=0; j<totalSaidas/4; j++){
    for (int i=totalSaidas/2; i<totalSaidas; i++){
      mega.shiftWrite(led[i],HIGH);
    }
    delay(t1);
    for (int i=totalSaidas/2; i<totalSaidas; i++){
      mega.shiftWrite(led[i],LOW);
    }
    delay(t1);
  }
}

//------------------------------
void s5(){
  //FLASHS UM POR UM
  int t1 = 5;
  int t2 = 50;
  ApagaTodos();
  for (int i=0; i<totalSaidas; i++){
    mega.shiftWrite(led[i],HIGH);
    delay(t1);
    mega.shiftWrite(led[i],LOW);
    delay(t2);
  }
}

//------------------------------
void s6(){
  //FLASHS RANDOMICOS
  randomSeed(analogRead(0));  //Para o random nao repetir a sequencia.
  int t1 = 10;
  int t2 = 40;
  int p = random(totalSaidas);
  ApagaTodos();
  for (int i=0; i<35; i++){
    mega.shiftWrite(led[p],HIGH);
    delay(t1);
    mega.shiftWrite(led[p],LOW);
    delay(t2);
    p = random(totalSaidas);
  }
}

//------------------------------
void s7(){
  int t1 = 1;
  for (int i=0; i<2; i++){
    AcendeTodos();
    delay(t1);
    ApagaTodos();
    delay(500);
  }
}

//------------------------------
void s8(){
  //CORRE NUM EFEITO MEIO 3D. :)
  int t1 = 10;
  ApagaTodos();
  for (int i=1; i<totalSaidas; i++){
    mega.shiftWrite(led[i-2],LOW);
    mega.shiftWrite(led[i-1],LOW);
    mega.shiftWrite(led[i],HIGH);
    delay(t1);
    mega.shiftWrite(led[i],LOW);
    mega.shiftWrite(led[i-1],HIGH);
    delay(t1);
  }
}

//------------------------------
void s9(){
  int t1 = 100;
  for (int x=0; x<3; x++){
    for (int i=0; i<totalSaidas; i++){
      if (i%2 == 0){
        mega.shiftWrite(led[i],HIGH);
      }
      else{
        mega.shiftWrite(led[i],LOW);
      }
    }
    delay(t1);
    for (int i=0; i<totalSaidas; i++){
      if (i%2 == 0){
        mega.shiftWrite(led[i],LOW);
      }
      else{
        mega.shiftWrite(led[i],HIGH);
      }
    }
    delay(t1);
  }
}

//------------------------------
void s10(){
  int t1 = 3;
  int t2 = 100;
  ApagaTodos();
  delay(t2);
  for (int x=0; x<totalSaidas; x++){
    for (int i=0; i<totalSaidas-x; i++){
      if (i != 0){
        mega.shiftWrite(led[i-1],LOW);
      }
      mega.shiftWrite(led[i],HIGH);
      delay(t1);
    }
  }
  delay(t1);
  mega.shiftWrite(led[0],HIGH);

  delay(t2);
  for (int x=0; x<totalSaidas; x++){
    for (int i=0; i<totalSaidas-x; i++){
      if (i != 0){
        mega.shiftWrite(led[i-1],HIGH);
      }
      mega.shiftWrite(led[i],LOW);
      delay(t1);
    }
  }
  delay(t1);
  mega.shiftWrite(led[0],LOW);
  delay(t1);
} 

39 comentários:

  1. Mandou bem com essa lib. parabéns!

    ResponderExcluir
  2. meu amigo essa vc foi foda..quanto custaria pra vc mandar pronto para min ja montado.pois em meu estado (macapa)tudo e dificil encontrar peças para montar um.meu telefone (96)32232096 - haroldo feio.

    ResponderExcluir
  3. Boa Amigão! vc tem como mandar um Arduino gravado com este código fonte? vê ai o valor e conta para deposito. obrigado.

    ResponderExcluir
    Respostas
    1. Boa tarde, Edson!
      Eu não trabalho com vendas de Arduino. Dois sites que recomendo para compra: http://loja.labdegaragem.com.br e http://www.robocore.net
      Abraços!!!

      Excluir
  4. Felipe boa noite, quanto quer para montar esta sequencial? da para montar uma para mim?

    ResponderExcluir
    Respostas
    1. Edson, boa tarde!
      Eu não trabalho com vendas. O tempo ta curto pra esse tipo de coisa. Mas, o código por completo é esse mesmo que postei, e o circuito elétrico também. Qualquer dúvida na montagem, pode sempre escrever pra mim.
      Abraços!

      Excluir
  5. tem como me enviar uma foto do seu projeto montado?
    para o email mt_x@hotmail.com

    ResponderExcluir
    Respostas
    1. Boa tarde, Marco Túlio!
      Esse projeto fiz a montagem somente no protoboard para postagem no blog.
      Abraços!

      Excluir
  6. Boa Tarde, sabe me dizer se esta biblioteca seria compativel com o Attiny?

    ResponderExcluir
    Respostas
    1. Boa noite, Lucas!
      Não sei informar. Nunca testei, mas acredito que funcione sim.
      Abraços!

      Excluir
  7. Ola felipe, quando executo a compilação do código, esta gerando o seguinte erro:

    'ShiftOutMega' does not name a type

    nesta linha:
    //Inicia a biblioteca passando os parametros de uso.
    ShiftOutMega mega(latchPin, dataPin, clockPin, qtdRegistradores);

    segue o erro completo:

    SHIFT_OU_2:23: error: 'ShiftOutMega' does not name a type
    SHIFT_OU_2.ino: In function 'void AcendeTodos()':
    SHIFT_OU_2:75: error: 'mega' was not declared in this scope
    SHIFT_OU_2.ino: In function 'void ApagaTodos()':
    SHIFT_OU_2:82: error: 'mega' was not declared in this scope
    SHIFT_OU_2.ino: In function 'void s1()':
    SHIFT_OU_2:92: error: 'mega' was not declared in this scope
    SHIFT_OU_2:97: error: 'mega' was not declared in this scope
    SHIFT_OU_2.ino: In function 'void s2()':
    SHIFT_OU_2:108: error: 'mega' was not declared in this scope
    SHIFT_OU_2:113: error: 'mega' was not declared in this scope
    SHIFT_OU_2:118: error: 'mega' was not declared in this scope
    SHIFT_OU_2:123: error: 'mega' was not declared in this scope
    SHIFT_OU_2.ino: In function 'void s3()':
    SHIFT_OU_2:134: error: 'mega' was not declared in this scope
    SHIFT_OU_2:139: error: 'mega' was not declared in this scope
    SHIFT_OU_2:144: error: 'mega' was not declared in this scope
    SHIFT_OU_2:149: error: 'mega' was not declared in this scope
    SHIFT_OU_2.ino: In function 'void s4()':
    SHIFT_OU_2:163: error: 'mega' was not declared in this scope
    SHIFT_OU_2:167: error: 'mega' was not declared in this scope
    SHIFT_OU_2:174: error: 'mega' was not declared in this scope
    SHIFT_OU_2:178: error: 'mega' was not declared in this scope
    SHIFT_OU_2.ino: In function 'void s5()':
    SHIFT_OU_2:191: error: 'mega' was not declared in this scope
    SHIFT_OU_2.ino: In function 'void s6()':
    SHIFT_OU_2:207: error: 'mega' was not declared in this scope
    SHIFT_OU_2.ino: In function 'void s8()':
    SHIFT_OU_2:232: error: 'mega' was not declared in this scope
    SHIFT_OU_2.ino: In function 'void s9()':
    SHIFT_OU_2:248: error: 'mega' was not declared in this scope
    SHIFT_OU_2:251: error: 'mega' was not declared in this scope
    SHIFT_OU_2:257: error: 'mega' was not declared in this scope
    SHIFT_OU_2:260: error: 'mega' was not declared in this scope
    SHIFT_OU_2.ino: In function 'void s10()':
    SHIFT_OU_2:276: error: 'mega' was not declared in this scope
    SHIFT_OU_2:278: error: 'mega' was not declared in this scope
    SHIFT_OU_2:283: error: 'mega' was not declared in this scope

    Alguma sugestão para resolver!

    Obrigado e parabens pelo post!

    Alexandre

    ResponderExcluir
    Respostas
    1. Bom dia, Alexandre!
      Esse erro ta parecendo que não ta localizando a biblioteca. A pasta da biblioteca ShiftOutMega está dentro da pasta libraries do Arduino?!
      Abraços!!

      Excluir
    2. Isso mesmo!! Coisa boba, rs!!
      Só foi trocar a pasta dos arquivos!!
      Valeu!

      Excluir
  8. Fellipe, é possivel eu controlar essa linha de leds, a partir de algum software? ao vivo, sem a necessidade de pré-programar os efeitos?
    Valeu!
    Abs

    ResponderExcluir
    Respostas
    1. Alexandre, é possível sim!
      Te respondi no e-mail.
      Abraços!

      Excluir
    2. Este comentário foi removido pelo autor.

      Excluir
  9. fillipe boa noite;
    caro amigo tenho o arduino uno r3 , pode sincronizar esse codigo nele;
    tem jeito esta dando varios error;;;
    abração ;parabens é um dos melhores;;;

    ResponderExcluir
    Respostas
    1. Rodrigo, esse fonte roda no UNO r3 sim! Só ligar o CI 74HC595 conforme o esquema elétrico que funciona normalmente.
      Qual erro está acontecendo?
      Obrigado pelo elogio ao blog!
      Abraços!!

      Excluir
    2. FELIPE BOA TARDE ; OBRIGADO; PELA RESPOSTA;
      AMIGO ESTA DANDO ISSO;
      `SHIFTOUTMEGA`DOIS NOT NAME A TYPE;
      ESTOU SELECIONANDO DESDO COMENTARIO ; AI CTRL-C E CTRL-V NO PROGRAMA;
      TENTEI DE TUDO MAS NÃO ESTOU TENDO SUCESSO;
      ABRAÇÃO-RODRIGO SOARES;

      Excluir
    3. Dia!!! Esse erro é da biblioteca. Ela está na pasta do arduino certinho?! Vc precisa baixa-la, e colocar dentro da pasta libraries do diretório do Arduino.
      Link para download: http://www.4shared.com/rar/QSUfwzo4/ShifOutMega.html

      Excluir
  10. AMIGO SEM SECESSO;
    MAS ME DÁ UMA DICA AÍ ; O EFEITO 9 DOS LED NOS 38 SEGUNDOS DO VIDEO;
    TEM COMO REPRODUZIR SOMENTE ELE; Q DEVO FAZER;
    OBRIGADO;

    ResponderExcluir
    Respostas
    1. Rodrigo, os efeitos são definidos um a um em cada função.
      void s1()... é a seguencia 1. s2() é a sequencia 2. Dentro do loop principal do arduino, coloquei um For (loop) onde faz a contagem, chamando as seguencias, uma por uma. Ali vc pode modificar para chamar somentes as sequencias que quiser, e até incluir sequencias novas.
      Abraços!!!

      Excluir
  11. FELIPE OBRIGADO PELO APOIO ;
    AS COISAS AQUI ESTÃO FUMEGANDO; SÓ STOU ESPERANDO CHEGAR OS 74HC595;
    NO void sequencia(int s){ APAQUEI AS SEQUNCIAS QUE NÃO QUERIA;
    COMPILEI NÃO DEU NENHUN ERROR; SERÁ QUE ESTOU CERTO;;
    MUITO OBRIGADO MESMO ;
    ABRAÇÃO;
    ATT-RODRIGO SOARES;

    ResponderExcluir
    Respostas
    1. É isso mesmo! Pode utilizar a função sequencia() chamando só as que vc quer usar.
      Abraços!!!!!

      Excluir
  12. FELLIPE; ESTOU BAIXANDO NO LING , MAS O CODIGO SESSA POSTAGEM NÃO SAI....
    PQ;;ABRAÇÃO RODRIGO SOARES

    ResponderExcluir
    Respostas
    1. Boa tarde, Rodrigo! Não entendi muito bem. O link é para download somente da biblioteca. O código desse post é esse que está postado aqui.
      Abraços!!!!

      Excluir
  13. FELIPE ;;
    OBRIGADO PELO SUPORTE É TANTA COISA DE FICAR LOUCO; JÁ ESTA FUMEGANDO;
    ABRAÇÃO ;
    RODRIGO SOARES

    ResponderExcluir
  14. FELIPE BOM DIA ;; CARA D+++ MONTEI JÁ 3 PROJETOS TEUS;
    AMIGO COMO DIMINUIR O TEMPO DOS EFEITOS ;;;
    ABRAÇÃO;
    ATT-RODRIGO SOARES.,;;

    ResponderExcluir
  15. Obrigado por compartilhar, tenho uma pergunta... usando esse mesmo esquema posso acender qual quer led individualmente usando botoes?

    ResponderExcluir
    Respostas
    1. Bom dia, Manuela!
      Usando esse esquema é possível sim controlar cada led individualmente. Usa-se essa biblioteca para ampliar o número de portas [ http://www.efeitonerd.com.br/2012/09/ampliar-saidas-do-arduino-library.html ] em conjunto com os registradores 74HC595.

      Excluir
  16. Este comentário foi removido pelo autor.

    ResponderExcluir
  17. Felipe montei o sequencial com 72 canais no proteus tudo funciona perfeitamente mas estou tento um problema os LEDs ficam piscando intermitentes saberia me dizer o que pode estar acontecendo.

    ResponderExcluir
  18. oiiii teria como colocar uns 100 a 200 leds ????

    ResponderExcluir
    Respostas
    1. Boa tarde!
      Para essa quantidade, talvez seria indicado utilizar um driver de leds. Mas, funciona.
      Abraços!

      Excluir
  19. poderia me mandar mas detalhes do projeto por favor
    email : quezaia15@gmail.com

    ResponderExcluir
    Respostas
    1. Qual seria o maior detalhamento que precisa?
      Abraços!

      Excluir
    2. como estou começando agora a estudar arduino, gostaria muito de entender como foi utilizado aquele c.i ?
      Aonde está o arduino que o senhor utilizou ???( porque na imagem da placa confeccionada não aparece o arduino junto) gostaria de entender melhor se possivel !!!!!!!!!!
      Obrigado pela a atenção :) esta fazendo um otimo trabalho !!

      Excluir
    3. Boa tarde!
      O Arduino está montado de forma stand-alone. Utilizando somente o CI micrcontrolador ATMega328.
      Costumo utilizar o CI com o bootloader UNO.
      https://www.google.com.br/?gws_rd=ssl#safe=off&q=arduino+stand+alone

      Obrigado pelo elogio!
      Abraços!

      Excluir
  20. oi meu nome carlos queria saber si vc tem um proeto de sistema de giroflex para viaturas em led meu imail e joao1234007@gmail.com sou de fortaleza vc tem zap amigo

    ResponderExcluir