Comandando displays de LEDs com 74HC595 - parte I

A partir de uma solicitação de um frequentador do Lab de Garagem, resolvi criar um exemplo de como usar o 74HC595 para controlar, com apenas 3 portas, "infinitos" displays LED de oito segmentos. Então, hoje pela manhã no Arduino no Parque fiz o circuito e o software que descrevo a seguir.

O display é muito semelhante a esse aí do lado. Ele é é meio grandão, então tive que usar duas protoboards emendadas para conectá-lo. Usei dois displays porque só  tinha 2, mas podem ser usados até 10, ou mais se a biblioteca for alterada. O código dele é MLS-12101AHR1.
Para ligá-lo, achei um esquema na net. que segue abaixo.
Os diferentes segmentos são "numerados" de A a G. o ponto decimal, dot point, é o DP.
Vc deve ficar atento à pinagem do seu display, que varia de modelo a modelo.
Outra coisa que vc deve observar é se o seu display é anodo (-) comum ou catodo (+) comum. O meu exemplo é para anodo comum. Se for catodo comum, este deve ser ligado no (+) e não no terra como está no exemplo. A biblioteca que vou apresentar funciona com ambos os tipos de displays.



Na hora de ligar o display no CI, adote a seguinte convenção: o segmento A deve ser ligado no pino de dados Q0 do CI, o segmento B no pino Q1 e assim por diante. O ponto decimal deve ser ligado no pino Q8 do chip.
Abaixo o esquema de ligação para 2 chips, 2 displays:


Vocês podem observar que eu não liguei resistores em série com os LEDs. Eu deveria ter feito isso, para proteger os LEDs e até o Arduino, mas eu não tinha tantos resistores assim, então... mas você pode colocar, resistores e caldo de galinha não fazem mal a ninguém...
Para testar o bicho, resolvi montar um termômetro com alarme. Esquema, abaixo:


O capacitor azul tá fazendo o papel de um PT100, que foi calibrado para dar uma leitura de temperatura em graus Celsius nos displays.
Quando a temperatura passa de 30 oC, o sistema toca a campainha.

Abaixo, a foto do circuito montado.


E, por fim, o vídeo da bagaça funcionando. No próximo post, o software.






Comentários

  1. Ola, bom dia.

    Estou ha alguns dias procurando compreender melhor o 74hc595 porem encontro dificuldades em saber usa-lo de forma especifica, ou seja quero que a porta Q1 de On no Led por X tempo e um aoutra porta Q7 de On por um tempo diferente, como executar isso? Pois soh achei Loop onde ele le "X" e ai soma ++ nao sendo a minha necessidade.

    Sou criador do Casemod Iron Man, e pretendo usar o 74Hc595 em um novo projeto que vou usar muitas portas.

    Muito obrigado.

    ResponderExcluir
    Respostas
    1. Vc tem que mandar o byte todo junto, então no seu caso, vc teria que enviar (supondo que os LEDs Q0, Q2 a Q7) estejam desligados:

      01000001
      01000000

      Ou seja, nesse caso vc continuaria com o LED Q1 ligado, mas desligaria o Q7.

      Como isso acontece muito rápido, o efeito é o que vc quer.

      Espero que tenha sido útil,

      Mauro

      Excluir
    2. PS: Esse CI é uma excelente alternativa para multiplexação. É rápido, fácil de encontrar e barato.

      Excluir
  2. Eu comprei 20 deles, antes mesmo de fazer o teste. tenho por habito comprar em quantidade, pois nunca sei quando vou usar novamente.

    Compreendi o que vc disse. Eu vi algo assim no Youtube em minhas pesquisas mas nao tinha compreendido.

    Então preciso gravar o estado atual, e depois enviar a nova informação.

    Estava procurando algo sobre acionamento binario e achei esse, mas ele nao aciona, apenas explica.
    http://www.instructables.com/id/Multiplexing-with-Arduino-and-the-74HC595/step12/Firmware/

    Por favor vc poderia me dar um exemplo, nao consegui achar nada assim em geral parece que todo mundo usa ele sempre em loop ( I recebe info e +1) nao consegui achar nada no sentido Porta a porta.

    Muito obrigado pelas responstas, venho procurando aprender mais sobre o 74hc mas me deparei com um ambinete onde as pessoas nao fogem muito do comum.

    Esse é um video que mostro como fiz meu projeto anterior e como foi a exposição dele na Campus PArty Brasil.
    http://www.youtube.com/watch?v=mFsQvqp97NA

    Novamente Obrigado.

    ResponderExcluir
  3. Ps. os movimentos e acionamentos dos leds do Iron Man, foram todos controlados por Arduino.

    ResponderExcluir
  4. Cara, muito legal o seu Iron Man! Confesso que eue nunca foi meu herói favorito (essa coisa de homem-de-lata, meio Mágico de Oz...), mas nessas versões últimas para o cinema mudei de opinião. E agora depois do seu show, achei mais legal ainda...
    Não entendi a sua dúvida. Na realidade, vc tem que mandar o estado todo sempre, quer dizer, vc tem que enviar o estado que vc quer ter nos LEDs sempre. Ou seja, vc manda todos os estados que vc quer dos LEDs em cada momento.
    Vou pensar num exemplo aqui.

    [],

    Mauro

    ResponderExcluir
  5. Nossa tinha escrito uma carta, e nao deu tempo de publicar :D

    Mauro, muito obrigado! Se vc mora em SP, estou em Mogi das Cruzes, fica o convite para uma visita e ver o Iron Man de perto!

    Muito obrigado por me explicar melhor o uso do 74hc595. Pretendo usar pelo mesno 1 no meu novo projeto para controlar painel de leds. E se pegar bem a manha dele irei usar em algumas coisitas a +.

    Muito obrigado pelas instruções/paciência!

    Aguardarei o exemplo coma bancada montada :) para testar!

    [ ]`s
    Sandman

    ResponderExcluir
  6. Mauro, boa tarde.

    Em conversa com um amigo aqui no serviço (Alvsan) ele me ajudou e orientou sobre isso e chegamso a montar um exemplo:



    int clockPin = 12; //IC Pin 11, Yellow Jumper
    int dataPin = 11; //IC Pin 14, Blue Jumper
    int latchPin = 8; //IC Pin 12, Green Jumper

    byte patterns[30] = {
    B00000001, 100,
    B00000010, 100,
    B00000100, 100,
    B00001000, 100,
    B00010000, 100,
    B00100000, 100,
    B01000000, 100,
    B10000000, 100,
    B01000000, 100,
    B00100000, 100,
    B00010000, 100,
    B00001000, 100,
    B00000100, 100,
    B00000010, 100
    };


    int port1 = B00000001;
    int port2 = B00000010;
    int port5 = B00010000;
    int port6 = B00100000;
    int port8 = B10000000;
    int pall = B11111111;

    int p5e6;


    int index = 0;
    int count = sizeof(patterns) / 2;

    void setup() {
    pinMode(latchPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, OUTPUT);
    }

    void loop() {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, port1);
    digitalWrite(latchPin, HIGH);
    delay(2000);

    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, patterns[4]);
    digitalWrite(latchPin, HIGH);
    delay(2000);

    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, port8);
    digitalWrite(latchPin, HIGH);
    delay(2000);

    //p5e6 = B00110000;
    p5e6 = port5 | port6;
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, p5e6);
    digitalWrite(latchPin, HIGH);
    delay(2000);

    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, pall);
    digitalWrite(latchPin, HIGH);
    delay(2000);

    }



    --
    Creio que com base nesse exemplo vou conseguir fazer o que preciso. Mas por favor sinta-se a vontade em comentar, como disse afinal vou controlar diversos MicroServos e sem duvida qualquer observação é bem vinda!

    Muito obrigado Mauro!

    ResponderExcluir
  7. Vc vai controlar servos ou LEDs com o 595? Pergunto porque no caso dos LEDs é mais tranquilo, já que é só ligar/desligar. No caso de controle de servos é um pouco mais complicado, porque o servi depende do PWM. Mas dá tb.

    ResponderExcluir
  8. Então por hora, no primeiro momento leds, mas estou pensando neles para controle de Servos tb, tipo 14 servos = 1 controle (2x 74hc)

    Os encontros no parque são onde? E reintero o convite para ver o Iron Man aqui! :D

    --

    Estou com a programação seguindo essa linha:

    TEMPO -->
    LEds---------Servos grupo A --(A1, A2 e A3) -------Servos grupo B
    (um) (dois) (três)
    Onde Ele inicia com Leds, depois Servos grupo A, tem acoes em A1, A2 e A3, e a opção Servos Grupo B.

    Chamo de servos, mas em alguns serão motores dc, Motor de passo (Stepper Driver / Ponte H).

    E uma variavel que via Bluetooth posso dizer se vai para A1, A2, A3 ou Três.

    Simples assim! (simples nada vo perde mais cabelo para fazer isso tudo!).

    Essa é a idéia geral.

    ResponderExcluir
  9. 1) Acho que dá para controlar todo tipo de motor usando-se o 595 para multiplexar.

    2) Automação no Parque
    https://maps.google.com.br/maps?q=Parque+Santos+Dumont+-+r.prudente+Meireles+de+Moraes,+100+-+S%C3%A3o+Jos%C3%A9+dos+Campos&hl=pt-BR&ie=UTF8&ll=-23.200251,-45.890724&spn=0.002771,0.005284&sll=-23.061419,-45.917322&sspn=0.710105,1.352692&oq=Parque+Sa&hq=Parque+Santos+Dumont+-&hnear=R.+Eng.+Prudente+Meireles+de+Moraes,+100+-+Jardim+Nova+Europa,+S%C3%A3o+Jos%C3%A9+dos+Campos+-+S%C3%A3o+Paulo,+12243-750&t=h&z=18

    ResponderExcluir
  10. Na verdade tenho todos os dispositivos aqui jah, faltava compreender melhor como controlar X portas pelo 74Hc, agora em laboratorio vou definir se usarei o 74Hc alem dops Leds. Compreendendo fica muito mais facil! :)

    Legal não esta tão longe, o dia que vier para esses lados, por favor me avise!
    Ps. Se eu for para essas bandas, sem duvida vou procura-los!

    Minha compreensão do 74Hc realmente melhorou muito nos ultimo 3 dias, e sem duvida ele pode nos surpreender, com a variedade de soluções que nos oferece.


    []`s

    ResponderExcluir
  11. Amigo, estou querendo fazer um sistema que vai ligar 12 LEDs de alto brilho por porta, ou seja, no total 84 Leds em 1 registrador, tem como fazer essa façanha? ligando o catodo comum e enviando o anodo pelo 74hc595 ? ou teria que acionar tipo um rele algo assim?

    ResponderExcluir
  12. Não entendi bem o que vc está querendo fazer. O LED de alto brilho é um LED comum? Qual a relação entre 12 LEDs e 84 portas?

    A preocupação que vc deve ter é com a alimentação, pode ser que o Arduino e a porta USB não aguentem a corrente demandada pelos LEDs. Nesse caso, vc deve ligar uma alimentação separada para os LEDs. Para isso, conecte uma outra fonte ao pino 16 dos 595.

    Não creio que vc precisará de nenhum relé.

    ResponderExcluir
  13. Boa Tarde...
    Eu gostaria de fazer ou comprar um Display de LEDS de um tamanho Grande. Para montar um Placar !
    Sabe me indicar se compensa montar ou comprar já pronto ? E Onde ?
    Grato !
    Augusto
    gutosoft@hotmail.com

    ResponderExcluir
  14. Gostaria de saber o valor da capacitância.

    ResponderExcluir
  15. Boa tarde,
    gostaria de saber se esquema montado funciona apenas para esse display ou pode ser para qualquer tipo de display tipo o HS-5101AG?

    ResponderExcluir
    Respostas
    1. Júlia, boa noite,
      Vai funcionar sim, só que esse display me parece catodo comum, então vc vai ter que prestar atenção aos comentários que fiz sobre esse aspecto.

      Qualquer dúvida, entre em contato.

      Excluir
  16. bom dia vc teria alguma coisa sobre alvos digitais para tiro ao alvo com chumbinho to querendo montar um mas to meio se tempo pra pesquisar vc poderia me ajudar

    ResponderExcluir
  17. Ola boa tarde.
    Parabesn pelo estudo.
    Nao posto o codigo para analise e estudo sobre ele.
    Grato.

    ResponderExcluir
  18. Este comentário foi removido pelo autor.

    ResponderExcluir
  19. Este comentário foi removido pelo autor.

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte III

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte I

Dividindo um programa (sketch) do Arduino em mais de um arquivo