Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
org
Do LED ao Arduino: aprendendo eletrônica no século 21
Arduino® é uma plataforma eletrônica flexível, fácil de usar, econômica e open source,
destinada a profissionais, entusiastas e curiosos em geral.
Várias aplicações da vida real exigem mais pinos do Arduino do que gostaríamos de disponibilizar,
a ponto de esgotá-los. Aplicações que usam displays LCD, displays de 7 segmentos, matrizes de
leds, teclados, etc. às vezes chegam a esgotar o número de pinos disponíveis.
Uma das alternativas para esse tipo de situação é o uso de CIs do tipo shift register, que usam apenas
3 pinos do Arduino e controlam de maneira rápida e precisa o estado de até dezenas de pinos de
outros componentes.
Usei o CI 74HC595 para solucionar uma situação similar com o meu projeto de pionola com
solenóides acionando teclas de um instrumento musical: precisarei controlar 30 solenóides
independentemente, e o Arduino tem menos pinos do que isso.
Minha solução será usar 4 chips 74HC595 encadeados: eles usarão só 3 pinos do Arduino no total,
e cada um deles tem 8 pinos de saída, perfazendo 32.
Neste artigo não tratarei dos chips encadeados, mas apenas do que aprendi quanto ao uso de um
chip 74HC595 isoladamente: usa os mesmos 3 pinos do Arduino que um conjunto encadeado
usaria, e tem 8 pinos de saída à disposição.
Temo que seja um artigo um pouco mais técnico que o usual: entender a formação dos números
binários e as operações que tratam números bit a bit será necessário para o seu melhor
aproveitamento prático.
Em resumo, a operação de mover serialmente 1 bit para o 74HC595 pode ser descrita assim: coloca
LOW no pino 11, coloca um bit (1 é HIGH, 0 é LOW) no pino 14, coloca HIGH no pino 11.
Assim, quando repetirmos a operação acima 8 vezes, teremos comunicado ao 74HC595 o estado
desejado para todos os seus pinos de saída, e será o momento de dizer para ele transferir os bits do
seu registro interno para o estado dos pinos em si. E isso é feito de uma maneira bem simples:
mudando o estado do pino 12 (latch) de LOW para HIGH.
Parece um procedimento longo, mas pode ser realizado várias centenas de vezes por segundo e,
como os pinos físicos só mudam de estado na hora do latch, dificilmente será possível perceber
que os dados chegam de 1 em 1, e não 8 de cada vez.
E os pinos de saída são, nesta ordem: 15, 1, 2, 3, 4, 5, 6, 7. É a eles que você deve conectar os
pinos dos outros componentes (displays, leds, um driver para os meus solenóides, etc.), como
conectaria a pinos digitais do Arduino. Mas comandá-los é um pouco mais complexo do que usar o
tradicional comando digitalWrite...
Digamos que os pinos 14, 11 e 12 do 74HC595 estejam conectados, respectivamente, aos pinos 4,
5 e 6 do Arduino. A inicialização típica deles envolve simplesmente configurá-los em modo
OUTPUT, como no exemplo:
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
Para transferir dados do Arduino para o 74HC595, podemos contar com a conveniente função
shiftOut() .
Por exemplo, se queremos que os 2 últimos pinos do 74HC595 fiquem em HIGH e os outros 6
fiquem em LOW, o número binário que representa este estado é 00000011 (cada zero é um pino
LOW, cada 1 é um pino HIGH), e o comando correspondente (considerando que os pinos do
74HC595 estão conectados ao Arduino conforme exemplificado acima) poderia ser:
O número 6 indica o pino do Arduino que está conectado ao pino 14 (dados) do 74HC595, o
número 5 indica o pino do Arduino que está conectado ao pino 11 (clock) do 74HC595,
LSBFIRST indica a ordem em que os bits serão enviados (LSBFIRST é a ordem normal, a
alternativa seria MSBFIRST, para enviar bits em ordem decrescente de magnitude), e 0b00000011 é
o valor que queremos enviar, sendo que 0b é o prefixo que indica números binários.
digitalWrite(4, LOW);
shiftOut(6, 5, LSBFIRST, 0b00000011);
digitalWrite(4, HIGH);
Transferir dados tratando-os como constantes binárias (números com o prefixo 0b) é conveniente
para explicar como a função funciona, mas não é tão prático para boa parte dos seus usos reais.
Você pode perfeitamente passar números em decimal (por exemplo, shiftOut(6, 5, LSBFIRST,
3); ), e construi-los a partir de matrizes ou outros dados à sua escolha, com ajuda dos operadores
[2]
e funções binárias do Arduino .
Em um futuro artigo vou tratar da conexão de mais de um 74HC595 aos mesmos 3 pinos do
Arduino. Até lá!
1. Ou enviado para um segundo chip 74HC595 que esteja conectado, mas não veremos isso neste
artigo. ↩
2. Na referência do Arduino, consulte as seções com os seguintes títulos: Bitwise operators e Bits
and Bytes ↩
7/01/2015