18 de setembro de 2012

Ampliar saídas do Arduino (Library)

Alô cientistas e computeiros! Seus problemas acabaram!
Está pronta a biblioteca que vai permitir seu Arduino ter mais de 100 saídas!


No projeto utilizei 3 registradores 74HC595 e apenas 3 saídas do Arduino. Para cada registrador, temos 8 novas saídas.

Fiz a biblioteca para controle individual de cada saída, exatamente da mesma forma que usamos o digitalWrite() do Arduino.

Como são 3 registradores, temos 24 saídas. Para acender o led da saída número 20, por exemplo, usamos:
mega.shiftWrite(20, HIGH);
E para apaga-lo:
mega.shiftWrite(20, LOW);
Biblioteca disponível em:
https://github.com/fellipecouto/ShiftOutMega

A instalação pode ser realizada através do gerenciador de bibliotecas da IDE Arduino:

Para entender melhor o projeto, vejam um post antigo que havia feito sobre esse assunto:

http://www.efeitonerd.com.br/2012/02/ampliar-saidas-do-arduino.html

Segue o código do exemplo do vídeo. O esquema elétrico é o mesmo do post antigo.

 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
/*---------------------------------------------------------------
  Programa : SHIFOUTMEGA
  Descr    : Ampliar o número de saídas do Arduino com CI 74HC595
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 17/09/2012
  ---------------------------------------------------------------*/

/*¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
 - Pino 8 do Arduino ligado ao pino 12 do CI.
 - Pino 11 do Arduino ligado ao pino 14 do CI.
 - Pino 12 do Arduino ligado ao pino 11 do CI.
 - Led 1 = Pino 15 do CI.
 - Led 2 = Pino 1 do CI.
 - Led 3 = Pino 2 do CI.
 - Led 4 = Pino 3 do CI.
 - Led 5 = Pino 4 do CI.
 - Led 6 = Pino 5 do CI.
 - Led 7 = Pino 6 do CI.
 - Led 8 = Pino 7 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> //https://github.com/fellipecouto/ShiftOutMega

//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 = 3;

int totalSaidas = qtdRegistradores * 8;

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

void setup(){
}

void loop(){
  s1();
  s2();
  s3();
}

void s1(){
  int t = 5;
  for (int x=0; x<5; x++){
    for (int i=1; i<=totalSaidas; i++){
      mega.shiftWrite(i, HIGH);
      delay(t);
      mega.shiftWrite(i, LOW);
      delay(t);
    }
    for (int i=totalSaidas; i>=1; i--){
      mega.shiftWrite(i, HIGH);
      delay(t);
      mega.shiftWrite(i, LOW);
      delay(t);
    }
    t--;
  }
}

void s2(){
  int t = 10;
  for (int x=0; x<5; x++){
    for (int i=1; i<=totalSaidas; i++){
      mega.shiftWrite(i, HIGH);
      delay(t);
    }
    for (int i=1; i<=totalSaidas; i++){
      mega.shiftWrite(i, LOW);
      delay(t);
    }
  }
}

void s3(){
  int t = 20;
  for (int x=0; x<5; x++){
    for (int i=1; i<=totalSaidas/2; i++){
      mega.shiftWrite(i, HIGH);
      mega.shiftWrite(totalSaidas+1-i, HIGH);
      delay(t);
    }

    for (int i=totalSaidas/2; i>=1; i--){
      mega.shiftWrite(i, LOW);
      mega.shiftWrite(totalSaidas+1-i, LOW);
      delay(t);
    }
  }
}

63 comentários:

  1. amigo se eu quiser ligar uma variavel a uma das portas do ci, como eu faço ?

    exemplo no arduino

    vetor[3] = {13,12,11}//o vetor utliza as portas 13,12,11 do arduino...

    como faria para o mesmo vetor reconhecer portas separas do ci ?

    fy.teixeira@gmail.com

    ResponderExcluir
    Respostas
    1. Boa tarde!
      Acho que não entendi muito bem. Mas os registradores 74HC595 são ligados apenas para ampliar o número de saídas, assim, tem-se o controle de HIGH/LOW em cada saída de cada CI.
      Abraços!

      Excluir
  2. Bom dia! td bem?
    Na sua biblioteca acima! eu poderia colocar ate quantos CI's?? e liar cada pino separado, ter o controle sobre eles?/
    Valeu!

    ResponderExcluir
    Respostas
    1. Boa tarde!!
      Na teoria, pode-se ligar muitos. Eu testei até com 10 registradores 74HC595 e funcionou legal. Tem-se o controle de cada saída individualmente sim.
      Abraços!

      Excluir
    2. Hum/! tendeu!
      ou Parabens! cara leal de +++++! deu certim funcionou blz! valeu! abraços!!!!!!!!!!!!!!

      Excluir
  3. Meu caro.

    De todos os projetos que encontrei usando o 74HC595 o seu ficou sendo o melhor.
    Você montou sua própria biblioteca, organizando o código, e no projeto trabalhou com os resistores protegendo os LEDs. muito legam mesmo.

    Uma pergunta:
    Neste projeto seria obrigatório utilizar as portas 8, 11 e 12?
    Se eu quiser utilizar outras portas do Arduino daria muito trabalho, ou não tem como?

    ResponderExcluir
    Respostas
    1. Boa tarde, Danilo!
      Obrigado pelo elogio!
      Você pode usar as portas de sua escolha, é só alterar as variáveis 'latchPin', 'clockPin' e 'dataPin', colocando as portas de sua escolha.
      Abraços!!

      Excluir
  4. Ola amigo , bom dia ,minha duvida é a seguinte , estou com o arduino sendo controlado por php , é possivel pelo php eu controlar individualmente cada saida do registrador? , sendo que os valores seriam variaveis.
    Obrigado

    ResponderExcluir
    Respostas
    1. Bom dia, Diego!
      É possível sim. Você vai trabalhar da mesma forma que trabalharia para utilizar a função digitalWrite() do arduino para ligar/desligar os pinos. Mas para controlar os pinos dos registradores, usa-se a função mega.shiftWrite(). É só passar os parâmetros via PHP normalmente.
      Abraços!!!!

      Excluir
  5. Parabéns pelo projeto!
    Cara eu tenho uma duvida tem como eu usar este mesmo esquema só que com botões?
    ele consegue receber sinal em vez de enviar?
    valeu e parabéns de novo!

    ResponderExcluir
    Respostas
    1. Esse projeto seria somente para saída (output) mesmo.
      Obrigado pelo elogio!!!!
      Abraços!!

      Excluir
    2. sera então que se eu usar um 74hc597 ele pode funcionar como input?
      claro que com seus devidos ajustes.

      Excluir
    3. Não, ele é somente para output mesmo. Teria que ser um novo projeto de hardware também.
      Abraços!!!

      Excluir
  6. Cara matou a pau essa lib! Era oq eu procurava. O melhor projeto de expansão de portas que já vi! Parabéns pelo projeto!

    ResponderExcluir
  7. Man obrigado pelo projeto, muito bom!
    Sou bastante iniciante e se puder tirar as seguintes duvidas agradeço:
    Da pra acender diversos LEDs juntos? (tipo uns 70, depois outros 50 e talz)
    O que é preciso para gravar o código no arduino?
    É caro um projeto com 150 LEDs? (considerando que preciso comprar o gravador)

    Obrigado

    ResponderExcluir
    Respostas
    1. Obrigado o elogio!
      Em relação a acender leds juntos, dá sim. Dependendo da quantidade de leds, vai precisar de um circuito com transistor, para poder fornecer a corrente suficiente.
      Para gravar o código no microcontrolador, vc pode usar o próprio arduino. Dá uma olhada nessa post: http://www.efeitonerd.com.br/2011/12/upload-para-atmega328.html
      O preço depende do led. Um led branco alto-brilho, por exemplo, em torno de 50 centavos cada um. Agora os leds difusos (aqueles normais de baixo brilho), custam até uns 10 centavos cada um.
      Abraços!!!

      Excluir
  8. Amigão, o esquema eletrônico seguiria o mesmo do seu tutorial anterior??
    Como vou saber qual é o porta de 1 até n ?
    testaria uma por uma ou segue uma sequência pelos registradores??

    ResponderExcluir
    Respostas
    1. Boa noite!! O esquema é o mesmo. A pinagem é conforme está no esquema elétrico também. Pino 15 do primeiro registrador é o Led1, pino 1 do primeiro registrador é o Led2, pino 2 do primeiro registrador é o Led3,... Pino 15 do segundo registrador é o Led 9,...
      Abraços!

      Excluir
    2. Valeu, amigão!!!
      Ainda não fiz o teste, estou esperando o meu arduíno chegar.

      A aplicação é para uma matriz de 8 x 12.
      Será que vou ter problemas com a alimentação?

      A idéia é ter um display de leds.

      Abração!

      Excluir
    3. Dependendo da quantidade de Leds, ou das cargas conectadas... O arduino só pode fornecer até 40mA por porta. Então dependendo vc teria que alimentar os CIs separadamente.
      Qualquer dúvida, diz ai. Podendo ajudar... estamos aí!
      Abraços!!

      Excluir
    4. Boa Noite Fellipe,

      Parabéns pela iniciativa !!

      Eu sou iniciante nos estudos do arduino e tenho algumas duvidas referente a tensão e corrente do arduino... por exemplo, com relação as portas do arduino que só podem oferecer até 40mA por porta, então logo eu só poderia conectar até dois leds de 20mA em cada porta e ainda não excedendo os 200mA totais do microcontrolador... então como você conseguiu ligar até 8 leds por saída ? E como eu poderia então ligar, por exemplo, 40 leds com o Arduino Uno em pinos digitais PWR ?

      Obrigado e Abração !!

      Excluir
  9. Apareceu um para mim assim

    ShiftOutMega does not name a type arduino

    Coloquei a lib mas na hora de chamar esse ShiftOutMega acontece o erro!

    ResponderExcluir
    Respostas
    1. Boa noite! Em qual linha está exibindo o erro? No include?!
      Abraços!

      Excluir
  10. Bom dia!
    Estou com dificuldade de inicializar a sua biblioteca juntamente com a ethernet shield, parece que quando inicializo a sua lib, ele trava, mas se inicializo somente a sua lib funciona, ou se inicializo somente a ethernet shield também, mas os dois juntos não, saberia me dizer o que ocorre?
    Junior

    ResponderExcluir
  11. Ola! Obrigada por compartilhar o projeto! Tenho uma duvida e gostaria sde saber se vc poderia me ajudar. Estou trabalhando em um projeto, e gostaria de controlar 9 leds e um display com numeros (1 a 9), mas cada numero controlado por uma entrada individual (botoes touch). Consegui fazer com 5 numeros e 5 leds, mas ja nao tenho mais opcoes para usar nos proximos 4. Esse seu projeto poderia ser utilizado no meu caso de alguma forma? Desculpa se ficou confuso, comecei a usar arduino a pouco tempo. Obrigada, Juliana.

    ResponderExcluir
    Respostas
    1. Boa noite, Juli!
      Se for o que entendi, você pode utilizar 2 registradores 74HC595, e dessa forma obtemos 16 saídas. Assim já consegue controlar os 9 Leds, e mais um display de 7 segmentos. Adiciona a biblioteca e fica fácil pra vc controlar.
      Assim, só foi utilizadas 3 saídas do arduino, e com as saídas que sobraram, faz a ligação de entrada dos botões.
      Espero que tenha ajudado...
      Qualquer coisa, só entrar em contato!

      Excluir
  12. Amigo, depois de passar 1 dia inteiro pesquisando como fazer isso "no braço", me deparei com sua biblioteca ontem às 3 da manhã, como tava muito cansado deixei para baixar hoje.

    Antes de qualquer coisa só tenho a agradecer sua iniciativa de construir a biblioteca e compartilhar conosco.

    ResponderExcluir
    Respostas
    1. Bom dia, Luis Quadros!
      Agradeço o elogio! Obrigado!
      Espero que a biblioteca tenha sido útil!
      Abraços!

      Excluir
    2. Topei em uma incompatibilidade.

      quando ativo a linha abaixo, sua biblioteca deixa de funcionar aqui.
      #include // Para a EEPROM 24LC256

      já passou por algo do tipo?

      Excluir
  13. não foi a linha toda, include wire.h
    vou precisar guardar algumas coisas na eeprom com os 24lc256.

    mas basta somente adicionar o include wire.h que a parte de acender os leds deixa de funcionar, todo o resto do programa funciona 100%, exceto os 74hc595.
    vlw

    ResponderExcluir
    Respostas
    1. Estranho. Vou tentar fazer uns testes desse tipo por aqui para tentar identificar isso.

      Excluir
  14. Ola Boa tarde, é possivel inserir um keypad 4x4 no 74hc595 para efetuar leitura das teclas... Como faria isso? Poderiam me ajudar, desde ja grato.

    ResponderExcluir
    Respostas
    1. Boa noite, Fabio!
      Esse CI é somente para saídas mesmo. Para entradas seria um outro circuito.
      Abraços!

      Excluir
  15. Boa tarde, Felipe. Parabéns pelos projetos. Sou iniciante com o Arduíno e queria um esclarecimento.... em vez dos leds, consigo utilizar o 74hc595 para acionar bonina de mínis reles?? Obrigado - Ricardo

    ResponderExcluir
    Respostas
    1. Boa tarde, Ricardo!
      Sim, poderia. Na verdade os registradores funcionam como se tivesse trabalhando com as portas do Arduino, o que poderia ligar diretamente numa porta do Arduino, poderia ligar na saída dos registradores. Deve-se ficar atento a corrente necessária. Dependendo do que for ligar, seria preciso utilizar transistores.
      Abraços!

      Excluir
  16. Boa tarde amigo, gostei muito do seu trabalho, parabéns. É possível utilizar PWM através dessa biblioteca? Estou tentando utilizá-la em uma matriz de LED's RGB 8x8 para formar figuras de cores distintas, alternando entre as figuras ( cada uma com sua respectiva cor, tipo quadrado amarelo, circulo roxo) para formar tais cores tentei utilizar PWM, mas não consegui. Os LED's estão conectados dessa forma: http://www.franksworkshop.com.au/Electronics/RGB/RGB.htm.

    ResponderExcluir
    Respostas
    1. Boa tarde!! Obrigado!
      Essa biblioteca não foi feita para pwm.
      Abraços!

      Excluir
  17. Felipe, boa tarde.
    E possivel coletar as informacoes de dispositivos analogicos conectados aos expansores? Um exemplo e um sensor de temperatura LM35?

    ResponderExcluir
    Respostas
    1. Bom dia! Esse CI é somente output. Somente expansão de saídas.

      Excluir
  18. Olá Fellipe, gostei muito do projeto, muito bom, parabéns, será que você poderia me ajudar com a Biblioteca ShiftOutMega, pois parece que foi deletada no 4shared, meu e-mail é joao45id@gmail.com te agradeço muito.....João

    ResponderExcluir
    Respostas
    1. Boa tarde, João!

      Os links estão funcionando:
      http://www.4shared.com/rar/QSUfwzo4/ShifOutMega.html
      E pode ser baixado também através:
      https://mega.co.nz/#!jMN1zJBB!zyo3lVibrMU6VTssYvimg-v1hVLtabX0DzncQm2rAlw

      Abraços!

      Excluir
  19. Olá Felipe. De todos os tutorias que vi na net, o seu é o que pode me ajudar. Tenho que acionar as portas do ci a partir do status de sensores. Para isso, escrevi os status dos sensores e as saídas para os leds. Por exemplo, caso o sensor 1 acione, como posso escrever para a saida Q2 do CI? mega.shiftoutwrite(2,HIGH)? É isto? Como devo direcionar a saída para o CI?

    ResponderExcluir
    Respostas
    1. É isso mesmo. Para trabalhar com as saídas do registrador, é seguindo a base das saídas do Arduino mesmo.
      mega.shiftoutwrite(2,HIGH) //Ativa a saída (porta) 2 do registrador.

      Excluir
    2. Olá, estou fazendo algo parecido, envolvendo sensores + 74hc595. Teve avanço em seu projeto? Gostaria de ver seu código, caso haja interesse envie-me uma resposta por email: rodrigohusken@live.com

      Excluir
  20. Ola Felipe, boa tarde!
    Estou tentando montar um protoboard igual ao que você fez, porém, não sei o que está acontecendo que eu só consigo fazer funcionar 16 leds, ou seja, 2 CI's, as demais 8 leds com o terceiro CI não funciona de jeito nenhum.

    Já troquei o CI para ver se era isso, mas não adiantou, ou seja, não esta queimado.

    Você já passou por isso?

    Outra coisa... você já conseguiu usar um potenciômetro, para controlar o tempo, neste mesmo esquema que você montou? Se sim, poderia me enviar o código para eu ver?

    Obrigado,
    Eliab
    eliab@techbs.com.br

    ResponderExcluir
    Respostas
    1. Boa tarde, Eliab!
      Estranho o problema que está tendo. Pode ser problema na protoboard, como algum mal contato. O terceiro CI não funcionada nada, ou apresenta comportamento incorreto?
      É possível sim incluir potenciômetro. Não adicionei, mas é possível.
      Abraços!

      Excluir
  21. Olá Felipe, Boa Tarde

    Eu sou iniciante nos estudos do arduino e tenho algumas duvidas referente a tensão e corrente do arduino... por exemplo, com relação as portas do arduino que só podem oferecer até 40mA por porta, então logo eu só poderia conectar até dois leds de 20mA em cada porta e ainda não excedendo os 200mA totais do microcontrolador... então como você conseguiu ligar até 8 leds por saída ? E como eu poderia então ligar, por exemplo, 40 leds com o Arduino Uno em pinos digitais PWM ?

    Obrigado e Abração !!

    ResponderExcluir
    Respostas
    1. Boa tarde!
      A limitação de 20mA é para cada saída do Arduino. Os leds estão ligados nas saídas dos registradores, que é alimentado separadamente. Cada porta de saída do Arduino, nesse caso, está alimentando somente as entradas dos registradores.
      Se tiver dúvidas, escreva.
      Abraços!!!

      Excluir
  22. Olá Fellipe. Primeiramente parabéns pela biblioteca.
    Comecei a pouco tempo com Arduino e estou sentindo falta de um funçao nessa biblioteca, seria "digitalRead", teria que armazenar em um vetor o valor que foi enviado ao pino para ter esse controle? O que acha que posso fazer para obter o estado desses pinos "virtuais" de uma forma melhor? Obrigado.

    ResponderExcluir
  23. posso usar o mesmo esquema para incluir reles e interruptor paralelo??? e fazer os mesmo serem accionados poe uma conexao bluetooth???

    ResponderExcluir
    Respostas
    1. Bom dia!
      É possível utilizar as saídas dos registradores da mesma forma que se utiliza as saídas normais do Arduino.

      Excluir
  24. Olá Felipe parabéns pela biblioteca
    Comecei a pouco tempo com Arduino,gostaria de saber,posso controlar o estado dos pinos dos ci,com o mesmo carácter estado HIGH,LOW,estou ligando pelo serial(l=HIGH)(D=LOW)???

    ResponderExcluir
    Respostas
    1. Bom dia!
      Não entendi muito bem sua pergunta. Mas, o controle é feito da mesma forma que faz o HIGH/LOW das saídas do Arduino. Utilizando a biblioteca, tem-se o mesmo controle das portas do registrador, como saída.

      Excluir
  25. Bom dia Felipe!
    Estou inciando com arduino os seus projetos estam me ajudando a entende melhor parabens.
    Eu gostaria de usar o drive ic TM1826 controlado pelo arduino como posso faze-lo?
    Grato.

    ResponderExcluir
  26. Olá Felipe, primeiramente meus parabéns....
    Eu estou com uma dúvida qto à quantidade de registradores que posso utilizar.
    muito obrigado

    ResponderExcluir
    Respostas
    1. Bom dia! Obrigado!
      Na teoria, pode-se ligar muitos. Fiz o teste com 10 e funcionou legal.
      Abraços!

      Excluir
  27. os pinos da 74HC595 pode ser usado pinMode (input)?

    ResponderExcluir
    Respostas
    1. Boa tarde, Alexandre! O registrador 74HC595 é somente OUTPUT.
      Abraços!

      Excluir
  28. Utilizo sua lib nos meus projetos. Me ajuda muito! Parabéns!
    Sergio

    ResponderExcluir
    Respostas
    1. Obrigado, Sergio!
      Fico feliz em saber que a biblioteca está sendo útil!
      Abraços!!

      Excluir