Trabalhando com CI74HC595 e a Biblioteca ShiftOutMega

Trabalho em teste para um projeto de painéis luminosos, e estou utilizando a biblioteca ShiftOutMega fazendo funcionar 40 LED RG (Verde e Vermelho), quer dizer, foi utilizado 80 portas, com apenas 3 saídas do arduino.

Mas imaginando em caso real percebi um problema. Cada conjunto de 10 LED representa um painel que deve ficar distante um dos outros, onde para cada conjunto deste eu deveria levar do Arduino para o painel, um cabo com 20 fios.

A ideia que surgiu foi a de criar 4 grupo do CI74HC595 junto com cada painéis e levar apenas os 3 fios necessário para comanda-los + 2 de alimentação. 

Ai surgiu um novo problema, NÃO ESTOU CONSEGUINDO fazer a biblioteca ShiftOutMega realizar o processamento de vários grupos de CI74HC595.

Longe de chegar perto de um experto na programação de biblioteca, mas cheguei alterar seus códigos, que copilou sem erro, mas também não deu resultado positivo.

Posto aqui um código como se fosse apenas dois painéis, mas que já mostra o problema que está ocorrendo.

No código abaixo estou usando apenas uma biblioteca, mas segue a outra modifiquei, em anexo, mas que também não funcionou usando as duas.

Segue em anexo o esquema de ligação para utilização do CI74HC595 e o também o código.

Link do vídeo: https://youtu.be/YXd9wnnRCY8

Segue abaixo o código com comentários

/*---------------------------------------------
S H I F T O U T M E G A
Ampliar o número de saídas do Arduino com
Registrador de Deslocamento 74HC595
Fellipe Couto - 17/09/2012
--------------------------------------------*/
/*¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
- Pino 2 do Arduino ligado ao pino 12 do CI.
- Pino 3 do Arduino ligado ao pino 14 do CI.
- Pino 4 do Arduino ligado ao pino 11 do CI.
- Pinos 10 e 16 do CI ligados ao Vcc.
- Pinos 8 e 13 do CI ligados ao GND.
- Pino 9 do CI ligado ao pino 14 do próximo CI.
¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨*/
#include <ShiftOutMega.h> //Inclui a bilioteca ShiftOutMega.h

//Variáveis do CI 74HC595 PAINEL-1
int latchPin = 2;
int dataPin = 3;
int clockPin = 4;
int qtdRegistradores = 3; //Quantidade de registradores(74HC595) utilizado no pro jeto.
ShiftOutMega mega1(latchPin, dataPin, clockPin, qtdRegistradores); //Inicia a biblioteca passando os parametros de uso.

//Variáveis do CI 74HC595 PAINEL-2
int latchPin2 = 5;
int dataPin2 = 6;
int clockPin2 = 7;
int qtdRegistradores2 = 3; //Quantidade de registradores(74HC595) utilizado no pro jeto.
ShiftOutMega mega2(latchPin2, dataPin2, clockPin2, qtdRegistradores2); //Inicia a biblioteca passando os parametros de uso.



void painelVD1 ()
{
//1º Painel VERDE
mega1.shiftWrite(1, HIGH); //Ligando painel verde 1
mega1.shiftWrite(2, HIGH);
mega1.shiftWrite(3, HIGH);
mega1.shiftWrite(4, HIGH);
mega1.shiftWrite(5, HIGH);
mega1.shiftWrite(6, HIGH);
mega1.shiftWrite(7, HIGH);
mega1.shiftWrite(8, HIGH);
mega1.shiftWrite(9, HIGH);
mega1.shiftWrite(10, HIGH);
delay(1000);

mega1.shiftWrite(1, LOW); //Desligando painel verde 1
delay(1000);
mega1.shiftWrite(2, LOW);
delay(1000);
mega1.shiftWrite(3, LOW);
delay(1000);
mega1.shiftWrite(4, LOW);
delay(1000);
mega1.shiftWrite(5, LOW);
delay(1000);
mega1.shiftWrite(6, LOW);
delay(1000);
mega1.shiftWrite(7, LOW);
delay(1000);
mega1.shiftWrite(8, LOW);
delay(1000);
mega1.shiftWrite(9, LOW);
delay(1000);
mega1.shiftWrite(10, LOW);
delay(1000);
}

void painelVM1 () {
//1º Painel VERMELHO
mega1.shiftWrite(11, HIGH); //Ligando painel vermelho 1
mega1.shiftWrite(12, HIGH);
mega1.shiftWrite(13, HIGH);
mega1.shiftWrite(14, HIGH);
mega1.shiftWrite(15, HIGH);
mega1.shiftWrite(16, HIGH);
mega1.shiftWrite(17, HIGH);
mega1.shiftWrite(18, HIGH);
mega1.shiftWrite(19, HIGH);
mega1.shiftWrite(20, HIGH);

delay(1000);

mega1.shiftWrite(11, LOW); //Desligando painel vermelho 1
delay(1000);
mega1.shiftWrite(12, LOW);
delay(1000);
mega1.shiftWrite(13, LOW);
delay(1000);
mega1.shiftWrite(14, LOW);
delay(1000);
mega1.shiftWrite(15, LOW);
delay(1000);
mega1.shiftWrite(16, LOW);
delay(1000);
mega1.shiftWrite(17, LOW);
delay(1000);
mega1.shiftWrite(18, LOW);
delay(1000);
mega1.shiftWrite(19, LOW);
delay(1000);
mega1.shiftWrite(20, LOW);
delay(1000);
}

void painelVD2 ()
{
//2º Painel VERDE
mega2.shiftWrite(1, HIGH); //Ligando painel verde 2
mega2.shiftWrite(2, HIGH);
mega2.shiftWrite(3, HIGH);
mega2.shiftWrite(4, HIGH);
mega2.shiftWrite(5, HIGH);
mega2.shiftWrite(6, HIGH);
mega2.shiftWrite(7, HIGH);
mega2.shiftWrite(8, HIGH);
mega2.shiftWrite(9, HIGH);
mega2.shiftWrite(10, HIGH);
delay(1000);

mega2.shiftWrite(1, LOW); //Desligando painel verde 2
delay(1000);
mega2.shiftWrite(2, LOW);
delay(1000);
mega2.shiftWrite(3, LOW);
delay(1000);
mega2.shiftWrite(4, LOW);
delay(1000);
mega2.shiftWrite(5, LOW);
delay(1000);
mega2.shiftWrite(6, LOW);
delay(1000);
mega2.shiftWrite(7, LOW);
delay(1000);
mega2.shiftWrite(8, LOW);
delay(1000);
mega2.shiftWrite(9, LOW);
delay(1000);
mega2.shiftWrite(10, LOW);
delay(1000);
}

void painelVM2 ()
{
//2º Painel VERMELHO
mega2.shiftWrite(11, HIGH); //Ligando painel vermelho 2
mega2.shiftWrite(12, HIGH);
mega2.shiftWrite(13, HIGH);
mega2.shiftWrite(14, HIGH);
mega2.shiftWrite(15, HIGH);
mega2.shiftWrite(16, HIGH);
mega2.shiftWrite(17, HIGH);
mega2.shiftWrite(18, HIGH);
mega2.shiftWrite(19, HIGH);
mega2.shiftWrite(20, HIGH);
delay(1000);

mega2.shiftWrite(11, LOW); //Desligando painel vermelho 2
delay(1000);
mega2.shiftWrite(12, LOW);
delay(1000);
mega2.shiftWrite(13, LOW);
delay(1000);
mega2.shiftWrite(14, LOW);
delay(1000);
mega2.shiftWrite(15, LOW);
delay(1000);
mega2.shiftWrite(16, LOW);
delay(1000);
mega2.shiftWrite(17, LOW);
delay(1000);
mega2.shiftWrite(18, LOW);
delay(1000);
mega2.shiftWrite(19, LOW);
delay(1000);
mega2.shiftWrite(20, LOW);
delay(1000);
}
void painelVD1eVM2 ()
{
//1º Painel VERDE
mega1.shiftWrite(1, HIGH); // LIGANDO Painel verde 1
mega1.shiftWrite(2, HIGH);
mega1.shiftWrite(3, HIGH);
mega1.shiftWrite(4, HIGH);
mega1.shiftWrite(5, HIGH);
mega1.shiftWrite(6, HIGH);
mega1.shiftWrite(7, HIGH);
mega1.shiftWrite(8, HIGH);
mega1.shiftWrite(9, HIGH);
mega1.shiftWrite(10, HIGH);

mega2.shiftWrite(11, HIGH); //LIGANDO Painel vermelho 2
mega2.shiftWrite(12, HIGH);
mega2.shiftWrite(13, HIGH);
mega2.shiftWrite(14, HIGH);
mega2.shiftWrite(15, HIGH);
mega2.shiftWrite(16, HIGH);
mega2.shiftWrite(17, HIGH);
mega2.shiftWrite(18, HIGH);
mega2.shiftWrite(19, HIGH);
mega2.shiftWrite(20, HIGH);
delay(1000);
//ATÉ AQUI FUNCIONA NORMAL

//ERRO NA PARTE ABAIXO!!! a parte que inicia DESLIGAR da os dois grupos de LED, um a um, //faz é LIGAR o VERDE e VERMELHO em todos LED, para depois ir DESLIGANDO

mega1.shiftWrite(1, LOW); //DESLIGANDO Painel verde
mega2.shiftWrite(11, LOW); //DESLIGANDO Painel vermelho 2
delay(1000);
mega1.shiftWrite(2, LOW);
mega1.shiftWrite(12, LOW);
delay(1000);
mega1.shiftWrite(3, LOW);
mega1.shiftWrite(13, LOW);
delay(1000);
mega1.shiftWrite(4, LOW);
mega1.shiftWrite(14, LOW);
delay(1000);
mega1.shiftWrite(5, LOW);
mega1.shiftWrite(15, LOW);
delay(1000);
mega1.shiftWrite(6, LOW);
mega1.shiftWrite(16, LOW);
delay(1000);
mega1.shiftWrite(7, LOW);
mega1.shiftWrite(17, LOW);
delay(1000);
mega1.shiftWrite(8, LOW);
mega1.shiftWrite(18, LOW);
delay(1000);
mega1.shiftWrite(9, LOW);
mega1.shiftWrite(19, LOW);
delay(1000);
mega1.shiftWrite(10, LOW);
mega1.shiftWrite(20, LOW);
delay(1000);
}

//FUNCIONA NORMAL A PARTE ABAIXO PARA LIGAR OS DOIS GRUPOS DE LED

void painelVD2eVM1 ()
{
//2º Painel VERDE
mega2.shiftWrite(1, HIGH); //DESLIGAR painel verde 2
mega2.shiftWrite(2, HIGH);
mega2.shiftWrite(3, HIGH);
mega2.shiftWrite(4, HIGH);
mega2.shiftWrite(5, HIGH);
mega2.shiftWrite(6, HIGH);
mega2.shiftWrite(7, HIGH);
mega2.shiftWrite(8, HIGH);
mega2.shiftWrite(9, HIGH);
mega2.shiftWrite(10, HIGH);

mega1.shiftWrite(11, HIGH); //LIGANDO painel vermelho 1
mega1.shiftWrite(12, HIGH);
mega1.shiftWrite(13, HIGH);
mega1.shiftWrite(14, HIGH);
mega1.shiftWrite(15, HIGH);
mega1.shiftWrite(16, HIGH);
mega1.shiftWrite(17, HIGH);
mega1.shiftWrite(18, HIGH);
mega1.shiftWrite(19, HIGH);
mega1.shiftWrite(20, HIGH);
delay(1000);

//ERRO NA PARTE ABAIXO, a parte que inicia DESLIGAR da os dois grupos de LED, um a um, faz é LIGAR o VERDE e VERMELHO em todos LED, para depois ir DESLIGANDO

mega2.shiftWrite(1, LOW); //DESLIGAR painel verde 2
mega1.shiftWrite(11, LOW); //DESLIGAR painel vermelho 1
delay(1000);
mega2.shiftWrite(2, LOW);
mega1.shiftWrite(12, LOW);
delay(1000);
mega2.shiftWrite(3, LOW);
mega1.shiftWrite(13, LOW);
delay(1000);
mega2.shiftWrite(4, LOW);
mega1.shiftWrite(14, LOW);
delay(1000);
mega2.shiftWrite(5, LOW);
mega1.shiftWrite(15, LOW);
delay(1000);
mega2.shiftWrite(6, LOW);
mega1.shiftWrite(16, LOW);
delay(1000);
mega2.shiftWrite(7, LOW);
mega1.shiftWrite(17, LOW);
delay(1000);
mega2.shiftWrite(8, LOW);
mega1.shiftWrite(18, LOW);
delay(1000);
mega2.shiftWrite(9, LOW);
mega1.shiftWrite(19, LOW);
delay(1000);
mega2.shiftWrite(10, LOW);
mega1.shiftWrite(20, LOW);
delay(1000);
}
void setup()
{
}
void loop()
{
painelVD1 ();
painelVM1 ();
painelVD2 ();
painelVM2 ();
painelVD1eVM2 ();
painelVD2eVM1 ();
}

Exibições: 1382

Anexos

Responder esta

Respostas a este tópico

Olhando teu código por cima, já que to no trabalho: teu raciocínio na parte eletronica parece corretissimo, mas seria mais simples vc resolver o código  usando matrizes.

Também seria bom ver esse projeto:

http://forum.arduino.cc/index.php?topic=139435.0

e este:

http://www.instructables.com/id/Led-Cube-8x8x8/

Parabéns, é um senhor dum projeto!

Obrigado pelos links.

Sou fraco em programação, mas sempre esforço para entender novos procedimentos.

Justamente é minha intenção, de após funcionar normalmente com códigos simples, tentarei fazer de maneira mais profissional.

Estou postando um vídeo que dará para entender no visual o erro que esta acontecendo. Para mim é a Biblioteca que não conseguiu gerenciar a maneira que foi programado. Mas também não entendo nada de programação de Biblioteca!

Oi RCB, boa noite,

onde esta'o link do vídeo?

Rui

Olá Rui

Segue Link do vídeo: https://youtu.be/YXd9wnnRCY8

Oi RCB, boa tarde,

Porque você não usa somente um conjunto de 5 CIs, ao invés de 2 de 3 CIs,

já que usa 40 saídas.

E numera as saídas de 1 até 40.

Qual é a dificuldade se fizer desta forma?

O code fica mais simples.

Rui

O projeto final, seria que cada conjunto de LED (Painel) ficaria separados (distante um do outro) Nesta case eu teria que levar um cabo de 20 vias para cada conjunto deste + alimentação.

Por isso estou tentando arrumar uma solução com conjunto de CI separados.

Acho q não. Vc só teria q levar 5 fios pra todos: GND, Vcc, latch, data e clock. Pq 20?

Olha oq o 595 faz:

Abre o latch

clock 1

envia 1 bit pra data

clock 0

envia 1 bit pra data

clock 1

envia 1 bit pra data

.

.

.

clock 1

envia 1 bit pra data

Fecha latch

Ele envia toda a sequencia de bits quando latch é fechado. Por exemplo: 0111110011101010111111110110000000001110110101010101010101111111110001

Então, independente de quantos leds vai acender ou a distancia entre eles, precisa de apenas uma linha de CIs, levando os fios L, D, C, Vcc e Gnd. E nem precisa de 6 fios lógicos pra 2 conjuntos, só 3 fios pra 1 conjunto. E no teu caso, se vai usar 3 CIs, são 3x8=24 leds, q correspondem a 3 Bytes enviados de cada vez, em sequencia.

Por isso falei de usar matrizes.

vc poderia declarar uma matriz de 24 elementos por linha, sendo cada elemento um bit, zero ou 1, ou ainda uma variavel sincronizada a um sensor.

Fiz isso aqui: joguei cada led sincronizado com um LDR, um multiplexador de leitura analogica e 2 escrevendo nos 595s ligados a relays, e estes acionando lampadas de corrente alternadas.

Na verdade eu preciso de vários grupos de LED  (vários grupos de CI), e por isso estava com a ideia de precisaria de usar 3 saídas do Arduino para controlar cada grupo de CI.

Mais ai funcionou a finalidade do CHAT, e o Sr. Rui me deu uma dica: do primeiro grupo de CI para o segundo eu levaria os fios GND, Vcc, latch, data e clock, e iniciaria usar a referencia do primeiro pino daquele conjunto. FUNCIONOU!

Obrigado Sr. Rui e Alexandre pelas dicas.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço