Por exemplo, se você tivesse um Arduino com 4 pinos de E / S digital, como você poderia acender independentemente> 4 LEDs ou ler o estado de> 4 botões?
Por exemplo, se você tivesse um Arduino com 4 pinos de E / S digital, como você poderia acender independentemente> 4 LEDs ou ler o estado de> 4 botões?
Respostas:
Um registro de deslocamento como o 74595 permitirá que você tenha muitas saídas com apenas 2 conexões: um pino de dados e um pino de relógio. Você define o pino de dados para o próximo valor que deseja mover para o registrador e depois pressiona o pino do relógio.
Bruno deu uma boa resposta, mas eu gostaria de fazer algumas anotações.
Os infames 70 mA
O 74HC595 é freqüentemente usado como E / S estendido e também para controlar uma série de LEDs. O que geralmente é esquecido é que você pode operá-lo fora das especificações dessa maneira. A folha de dados diz que a corrente total de suprimento não deve ser superior a 70 mA, AMR (Absolute Maximum Ratings), portanto é melhor ficar longe disso por alguma margem. Portanto, 8 LEDs a 10 mA são demais e a 20 mA você excederá a AMR em nada menos que 130%! O limite provavelmente se deve à capacidade atual dos fios de ligação, e a corrente muito alta pode não apenas deteriorar o desempenho da peça, mas colocá-la permanentemente fora de ordem se esse fio quebrar.
Mas ontem à noite acordei porque tinha uma idéia . O limite de 70 mA vale tanto para Icc quanto para a corrente de terra; então, por que não dividir nosso total ou 80 mA e deixar a Icc ter metade dele e a corrente de terra na outra metade? Tudo o que você precisa fazer é referenciar 4 dos LEDs ao terra (ativo alto) e os outros 4 a Vcc (ativo baixo). Então a corrente do primeiro vem de Icc, a corrente dos outros cai no chão. Você poderá usar LEDs de 15 mA dessa maneira. (É tão simples que me sinto um idiota por não ter pensado nisso antes.)
Os relógios combinados que
eu pensei que Bruno salvaram um pino de E / S extra combinando o relógio do registrador de turnos com o da trava. Parece que eu interpretei mal sua resposta. Eu ainda quero expandir essa opção.
O que acontece depois? A tabela na página 5 da folha de dados diz:
o conteúdo do registro de turno mudou; o conteúdo anterior do registro de deslocamento é transferido para o registro de armazenamento e os estágios de saída paralela
(destacando por mim)
Portanto, não são os novos dados, mas os anteriores que estão sendo travados. Não é um problema real, certifique-se de mudar um bit extra para trancar os últimos dados, ou tudo estará errado.
Combinar os relógios também significa que as saídas alternarão o tempo todo enquanto você estiver transferindo novos dados. A função da trava era realmente evitar isso. Em muitos casos, isso não será um problema, se você puder fazê-lo rapidamente, mas, na pior das hipóteses, poderá obter efeitos indesejados. O pior caso seria usar o 74HC595 para multiplexar um monitor com uma frequência de varredura muito alta + ter uma cadeia muito longa de registros de turno + ter todos os 1s, exceto um 0, um LED apagado + uma sala escura. Como esse LED vê todos os 1s passando de vez em quando em uma sala escura, pode acender muito levemente.
Ou se você combinar essa multiplexação de alta frequência com uma saída de controle de relé. Todos os zeros e depois 1 para o relé podem significar que a saída do relé não é longa o suficiente para ser puxada.
É verdade que são casos extremos, mas eu manteria o relógio serial e de trava separados sempre que possível, se você quiser multiplexar ou se tiver altas taxas de atualização.
Concordo com Ignacio em relação ao uso de um registrador de turno 74XX595, serial em paralelo para expansão de saída, mas na verdade você precisará de 3 conexões, uma para dados , uma para relógio e uma trava ativada que transfira os dados do registro de mudança interno nas travas de saída.
Para a expansão das entradas, você pode usar um 74XX165, paralelo no registro de deslocamento de saída serial, isso permitirá ter até 8 botões por 74XX165.
A coisa boa dessa abordagem é que você pode encadear vários registros de troca em série, permitindo um número maior de entradas ou saídas, e melhor, você pode misturar 74XX595 e 74XX165, permitindo que você tenha qualquer número de entradas ou saídas.
Além disso, você pode compartilhar os sinais de relógio e trava, reduzindo o número de conexões necessárias e simplificando bastante o software. Dessa forma, você precisará apenas de 4 conexões para qualquer número de qualquer um desses registros de deslocamento:
Como eu estava procurando por um diagrama que encontrei neste site uma maneira muito inteligente de reduzir para 3 o número de conexões necessárias. Consiste em usar o mesmo pino para entrada e saída de dados.
O software fará algo assim para cada pulso do relógio:
Nick menciona expansores de E / S e eles definitivamente valem a pena investigar. O Digikey lista mais de mil deles. Vou escolher um com uma interface I2C como exemplo, porque isso requer o mínimo de pinos de E / S; mínimo dois.
O NXP PCA9505 possui 40 pinos de E / S configuráveis, o equivalente a cinco 74HC595s. É uma solução um pouco mais cara, mas você obtém muito mais funcionalidade para isso:
Leitura adicional dos
expansores GPIO , folheto NXP
PCA9505 datasheet
Para uma solução sem ICs extras, você pode usar técnicas como Multiplexing e Charliplexing :
Multiplexagem (nenhum resistor limitador de corrente mostrado):
A maneira como a multiplexação funciona é bastante simples - no exemplo acima, se queremos acender o LED1, configuramos o pino C1 para saída alta e o PIN R1 para saída baixa, todos os outros pinos podem ser altos ou Hi-Z (definido para entrada, alto impedância que os faz parecer "desconectados")
Se quisermos acender o LED5, configuramos o pino C2 para saída alta e R2 para saída baixa.
O número de pinos necessários para acionar x LEDs pode ser calculado por 2n pinos para n² LEDs, portanto, por exemplo, para 16 LEDs precisamos (√16) * 2 = 8 pinos.
Charlieplexing:
Layout esquemático alternativo (sugerido por Supercat):
Isso é um pouco mais complexo, mas usa menos pinos para gerar um número maior de LEDs. Por exemplo, podemos usar apenas 5 pinos para acionar 20 LEDs, como no exemplo acima (em comparação com pelo menos 10 pinos com multiplexação de matriz "normal" (não confunda com o uso de um IC; nesse caso, o número de pinos necessários é log2) (nLED).
Para uma solução externa, você pode usar itens como Shift Registers ou Multiplexers , como 74HC595 e 74HC151.
Um registrador de turno utiliza um fluxo de entrada serial com clock de dados e sai paralelo (Serial In Parallel Out SIPO) ou o inverso (PISO)
Eles geralmente têm 8 saídas (ou entradas), mas você pode encadear quantas quiser para estender coisas. O lado negativo é a velocidade que você pode atualizar é dividida pelo número de saídas por entrada (por exemplo, para um registro de 8 saídas, se você tiver um relógio de 8MHz, poderá atualizar a 1MHz, para 16 saídas a 500kHz, etc.)
Essas técnicas também podem funcionar inversamente para entradas.