Boa noite galera.

Estou tendo alguns problemas uzando 74hc595  .

Estou utilizando 4 chips 74hc595 em sequencia.

Para fazer os devidos testes, liguei todas as saidas dos 595 em leds e em dois displays 7 segmentos..

Problema 1-

Quando o arduino liga, todos os leds ficam ligados até que eu mande eles apagarem. tem como eles ja iniciarem desligados?
A questão é que eu gostaria de controlar Reles para ligar motores, logo, quando eu ligar o arduino na tomada, todos os motores irão ligar sozinhos, até que eu mande desligar.

Problema 2 - 

Nos ultimos dois 595,  liguei dois displays de 7 segmentos, mando imprimir o numero 11 nos displays, porem os demais leds dos displays ficam piscando bem fraquinho. Nao sei como resolver.

Duvida - 

Para mandar a configação para o ultimo 595 estou fazendo da seguinte maneira.

digitalWrite(LATCH, LOW);
shiftOut(DATA, CLK, MSBFIRST, quarto_595); // SEGUNDO DISPLAY LED
shiftOut(DATA, CLK, MSBFIRST, terceiro_595); // PRIMEIRO DISPLAY LED
shiftOut(DATA, CLK, MSBFIRST, segundo_595); // LEDS AZUIS
shiftOut(DATA, CLK, MSBFIRST, primeiro_595); // LEDS VERMELHOS
digitalWrite(LATCH, HIGH);


Dessa maneira, eu tenho que toda vez reescrever todos os 595, tem como eu apenas mandar informações para 1 deles?  exemplo quero mandar apenas para o "segundo_595".

Estou iniciando no arduino, nao entendo muito, então agradeco a compreenção de voces se eu disse algo muito errado.

Vlw

Exibições: 1728

Responder esta

Respostas a este tópico

Segue abaixo exatamente como montei , os pinos Q0 dos 595 nao estão sendo usados.

Neste simulador, tudo funciona perfeitamente.

olá Adler, boa noite.

      Adler, conheço o HC595 de longa data (há mais de 30 anos). Ele pode ser usado sem problema no seu Sistema.

      Mas para seu caso específico, o HC594 seria a melhor opção. O HC594 tem a mesma pinagem do HC595, porém a função "OE#" (pino 13) foi substituída pela função "PCLR#" ("Parallel Clear"), o que permitiria vc fazer um "PowerUp Clear" facilmente (com apenas um resistor e um capacitor) e sem depender de qualquer ação no seu código do Arduino.

      Mas como vc já está usando o HC595, segue a solução para seu "Problema 1". Note que o tal pino "X" é qualquer pino Digital do Arduino que esteja "sobrando" no seu Projeto (lembre-se que as entradas "A0" a "A5" também podem ser usadas como pinos Digitais). Implemente o que descrevo na figura a seguir:

     Como vc vê, a implementação é muito simples. Mas siga rigorosamente a ordem das ações que listei. Inclusive, pode parecer estranho pra vc programar primeiro "HIGH" para o pino "X" (o que é feito com a função "digitalWite") e apenas depois configurar este pino como "OUTPUT" (o que é feito com a função "pinMode"). Mas essa é uma prática comum, e na verdade é a forma correta de se usar os pinos digitais na inicialização de um Sistema (no caso, na função "setup" do Arduino).

     Caso vc deseje saber como usar o HC594, postarei aqui logo que eu tiver algum tempo extra. Em realidade, para a maioria esmagadora das pessoas que tem usado o HC595 (eu diria que 99,99% das pessoas que usam), o "irmão" dele o HC594 é muito mais adequado, embora ninguém se dê conta disso (parece que o povo viciou no HC595).

     Sobre as suas demais questões, não há como te ajudar, pois vc não disponibilizou o seu código do Arduino.

     Qualquer dúvida, post aqui que te auxiliamos.

     Abrçs,

     Elcids

Elcids você é o cara!!!
Me ajudou muito com essa dica!! 
No meu caso o segundo chip ficou flutuante, coloquei um capacitor de 100nf na entrada dele e liga tudo zerado!! toooop!! eu testei diversos arranjos eletrônicos hora dava certo hora nao, esse pelo menos é simples e funcional, mas pra frente quero ter um arranjo para salvar o ultimo estado, se possível irei criar um outro tópico!!

olá novamente, Thiago.

      Aconselho muito olhar também este tópico:    Sistema Multi I/O para Arduino

      Lá vc encontrará ainda mais recursos sobre este tipo de implementação, e muitos mais "features" no código (além dos arquivos para simulação no Proteus). Na figura a seguir, vc pode ter um vislumbre do Sistema:

(clique na figura para "zoom")

      Eu tenho que saber fazer estas coisas até dormindo, pois tenho mais de 35 anos de experiência com a coisa, e já se vão mais de 25 anos desde minha formatura em Engenharia Elétrica. Uma curiosidade:  muita gente aqui deve achar que sou especialista em Software, mas na verdade sou especialista em Hardware (embora nestes mais de 35 anos eu também já tenha escrito alguns milhões de linhas de código).

      Espero ter ajudado.

      Abrçs

      Elcids

Boa noite Elcids Chagas.

Muito Obrigado pela atenção, nao tenho este resistor em maos no momento, mas amanha irei testar conforme você explicou.

Problema 2 -  [ PARECE TER RESOLVIDO ]

Nos ultimos dois 595,  liguei dois displays de 7 segmentos, mando imprimir o numero 11 nos displays, porem os demais leds dos displays ficam piscando bem fraquinho. Nao sei como resolver.

Parecia ser algum pequeno curto, ou falta de energia mesmo, pois refiz todo o protoboard e melhorou muito, tem um pequeno bug ainda, mas acredito que seja algo meio froxo ali.

Referente a duvida sobre gravar nos CIs, ainda nao descobri o que eu queria, porem reorganizei todo meu codigo, e agora nao fico mais gravando informação repetidas nas 595.

Mas eu ainda gostaria de saber se existe a possibilidade.

Vamos la, vou tentar explicar novamente.

Estou mandando informações tipo byte para os CIs.

Digamos que a sequencia atual é esta : note que os dois displays juntos escrevem "04"

byte primeiro_ci =  125;  // (01111101)   ASCENDE SEQUENCIA LEDS VERMELHOS ( irrelevante )
byte segundo_ci = 7;      // (00000111)   ASCENDE SEQUENCIA LEDS AZUIS ( irrelevante )
byte terceiro_ci =   63,    // (00111111)  ESCREVE "0" NO PRIMEIRO DISPLAY
byte quarto_ci = 102;      // (01100110)  ESCREVE "4" NO SEGUNDO DISPLAY

Agora mando gravar as Informações acima desta maneira:

digitalWrite(LATCH, LOW);
shiftOut(DATA, CLK, MSBFIRST, quarto_ci);         //SEGUNDO DISPLAY   "4"
shiftOut(DATA, CLK, MSBFIRST, terceiro_ci);      // PRIMEIRO DISPLAY   "0"
shiftOut(DATA, CLK, MSBFIRST, segundo_ci);    // LEDS AZUIS
shiftOut(DATA, CLK, MSBFIRST, primeiro_ci);    // LEDS VERMELHOS
digitalWrite(LATCH, HIGH);

Agora preciso mudar o primeiro display , qual tinha "0" para "5" então: ( os dois displays juntos irao ficar "54")

byte primeiro_ci =  125;  // (01111101)   ASCENDE SEQUENCIA LEDS VERMELHOS ( irrelevante )
byte segundo_ci = 7;      // (00000111)   ASCENDE SEQUENCIA LEDS AZUIS ( irrelevante )
byte terceiro_ci =  109,    // (01101101)  ESCREVE "5" NO PRIMEIRO DISPLAY
byte quarto_ci = 102;      // (01100110)  ESCREVE "4" NO PRIMEIRO DISPLAY

Agora é que vem a dúvida:
sabendo que eu alterei apenas as informações do "terceiro_ci" , gostaria gravar apenas as informações dele, descartando estar  gravando novamente as demais CIs com a mesma informação.

digitalWrite(LATCH, LOW);
shiftOut(DATA, CLK, MSBFIRST, quarto_ci);         //SEGUNDO DISPLAY       (descartar gravação deste )
shiftOut(DATA, CLK, MSBFIRST, terceiro_ci);      // PRIMEIRO DISPLAY  ( Apenas grava este )
shiftOut(DATA, CLK, MSBFIRST, segundo_ci);    // LEDS AZUIS                    (descartar gravação deste )
shiftOut(DATA, CLK, MSBFIRST, primeiro_ci);    // LEDS VERMELHOS         (descartar gravação deste )
digitalWrite(LATCH, HIGH);

Exemplo bem idiota do que eu gostaria de fazer

int NUM_CI = 3; (informo qual a  CI que eu quero gravar )

byte terceiro_ci =  109,    // (01101101)  ESCREVE "5" NO PRIMEIRO DISPLAY

digitalWrite(LATCH, LOW);

shiftOut(DATA, CLK, MSBFIRST, terceiro_ci, NUM_CI );      // PRIMEIRO DISPLAY  ( Apenas grava este )

digitalWrite(LATCH, HIGH);

Att

olá Adler.

     Sobre o Resistor, não precisa ser de 47k. Você pode usar de 10k, 4k7, 15k, 20k, 22k, 27k, 33k, 39k. Qualquer valor entre 4k7 e 47k estará de bom tamanho. Valores menores como 1k, 2k2, 2k7, 3k3, também podem ser usados, mas puxarão um pouco mais de corrente do tal "pino X", e essa corrente a mais embora seja ainda pequena, costumamos evitar. Mas pode usar qualquer valor destes que acabei de passar. Mas evite valores menores que 1k.

     Sobre seu problema com a atualização dos dados, entendi o que vc deseja. Vou preparar aqui, um trecho de código bastante funcional e didático para você "inserir" aí no seu, e assim vc conseguir o desejado. Assim aguarde um pouco que estarei deixando esse trecho de código neste post. Mas já adianto que isto que vc deseja é uma prática básica em programação, e essencialmente consiste em alguma organização e programação modular.

    Abrçs,

    Elcids

bom dia Adler.

      Conforme prometi, estou postando um código "base" que permite você usar seu Hardware do HC595, da forma como vc deseja. Isto permite vc alterar individualmente cada Registro do seu Sistema: LEDs azuis (7 LEDs), LEDs vermelhos (7 LEDs), e os Displays "1" e "2". Essencialmente, isto é possível com um código organizado e estruturado, tanto na execução quanto na estrutura de dados de controle do Hardware.

      Para tal, criei funções que permitem:

      1) ligar ou desligar qualquer LED individualmente, sejam LEDs azuis ou vermelhos.

                 exemplos:   altera_LED_AZUL ( 5, LED_ON );    // liga o LED azul 5.

                                     altera_LED_VERMELHO ( 2, LED_OFF );    // desliga o LED vermelho 2.

      2) ligar ou desligar padrões de LEDs, em qualquer combinação.

                exemplos:   liga_AZUIs ( Az_1 + Az_5 + Az_6 );   // liga LEDs azuis 1, 5, e 6.

                                   desliga_VERMELHOs ( Vm_1 + Vm_2 );    // desliga LEDs vermelhos 1, e 2.

      3) escrever um dígito decimal (de 0 a 9) em qualquer dos Displays, de forma independente um do outro.

                exemplo altera_Display_1 ( 3 );   // escreve o valor "3" no "Display 1".

      4) ligar ou desligar os Displays e LEDs, mas sem alterar o conteúdo atual nos HC595.

                exemplo:    desliga_DISPLAY ();   // Displays e LEDs sao desligados.

      Obviamente que baseado nestas funções, você poderá implementar uma grande enormidade de outras funções, conforme sua necessidade.

      O sistema foi também implementado no Proteus, e o circuito segue as pinagens e padrões dos LEDs e Displays que vc usou, e que estão definidos no código para o Arduino. Veja no "print" mostrado a seguir (para "zoom" clique na figura ou abra em uma nova guia do seu navegador):

       A simulação deste Sistema no Proteus, funcionou exatamente como esperado.

      Tanto o código para o Arduino, como os Arquivos de Projeto do Proteus (incluindo a Lib para o Arduino), estão anexados no final deste post.

      Veja que no código para o Arduino, na função "loop", eu implementei um código que demonstra o uso das diversas funções. Ao simulá-lo no Proteus, vc poderá verificar esse funcionamento e fazer suas "experiências" e testes, conforme desejar. E quando vc for usar seu código, basta remover todas as linhas dentro da função "loop" e colocar as suas.

      Observe também que o Sistema é totalmente expansível, permitindo aumentar a quantidade de LEDs e/ou Displays, conforme necessário. Para isto, basta cascatear mais HC595, e expandir a definição do Registro "virtual" no código, seguindo o mesmo princípio já usado para acrescentar mais elementos.

      Também note que todas as definições de pinos estão em "#defines", facilitando totalmente a alteração do Hardware, conforme necessário.

      Observação final:  veja que implementei o controle do "OE#" (pino 13 do HC595), no circuito e no código do Arduino. Com isto não ocorrem aqueles estados aleatórios quando vc liga a alimentação do Sistema. Inclusive esse controle é que permite ligar/desligar o Display e LEDs como um todo. Para o tal "pino X", usei o pino digital "11" do Arduino, mas vc pode usar qualquer um que esteja "sobrando" no seu Sistema (no código, basta alterar o número do pino, que está no "#define" para o "pino_ON_OFF").

       Procure usar o código, não somente para sua aplicação propriamente dita, mas também para o seu próprio aprendizado.

      Qualquer dúvida sobre o funcionamento do Sistema, post aqui que te auxiliarei.

      Abrçs,

      Elcids

Anexos

Oloko meu. tu eh um monstro!!

Consegui ver agora apenas. mas muito obrigado por ter gasto esse tempo comigo.

Vou fazer os testes hoje ao longo do dia. logo posto a situação.

Vlww

Bom dia , 

Não sei qual é a sua demanda, mas esse Multi Function shield talvez possa ser util:

Ele usa dois 74HC595.

http://www.cohesivecomputing.co.uk/hackatronics/arduino-multi-funct...

http://arduinolearning.com/code/multi-function-shield-examples.php

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço