terça-feira, 26 de abril de 2011

Aumentar quantidade de portas Digital Output do Arduino


Artigo Retirado do blog http://blog.ricardocastelhano.net/

O Arduino dispõe de 13 Pins Digitais de Input e Output, isto se for uma board standard como a actual Uno ou anteriores como aDuemilenove. Muitas vezes este é uma das razões que algumas pessoas, com quem falo sobre Arduino, usam para a não utilização desta board num projecto. A razão é  existirem 13 portas digitais de I/O.
Bom, a solução passa por dois caminhos, utilizar a board MEGA com 54 pins digitais I/O ou utilizar circuitos integrados (IC) conhecidos como “Multiplexers“. Muitas vezes a primeira solução pode necessitar da segunda, caso 54 pins não sejam suficientes.
Para resolver esta questão utilizo o IC 74HC595 ( existem outros que fazem o mesmo efeito). Este IC é um conhecido “8 bit serial in – parallel out shift register”, ou seja:
“Um serial-in/parallel-out shift register guarda data em elementos internos de memória e envia data para os pins serial-out, data-out. Todas as fases internas são disponíveis como output. Assim, um serial-in/parallel-out shift register converte data de formato serial para formato parallel. Por exemplo, se entrarem quatro bits por quatro pulsos do relógio através de um único arame num data-in, esse data ficará disponível simultaneamente em quatro outputs: QA ao QD depois do quarto impulso do relógio. (fonte: All About Circuits)”
Os Pins 1-7 e 15 são saídas (outputs).
Pin 8 deverá de estar ligado a Terra (GND).
Pin 10 deverá de estar ligado a corrente. Este pin é o “Master Reclear” e caso esteja LOW está activo.
Pin 11 é o “Clock” do IC.
Pin 12 é o armazenamento (“Latch”) do IC e caso esteja LOW desactiva-se os outputs do IC.
Pin 13 é o “Enable”, e caso o liguem a Terra (GND) não o conseguem “disable”. Caso procedam assim, o controlo é feito pelo “Latch”.
Pin 14 é o “Serial Input” ou seja, o pin pelo qual a informação vai do Arduino para o IC.
Pin 16 é o Vcc (corrente).
Confuso?
Bem, é bastante simples até. Vejamos a seguinte imagem:
ocupando somente 3 pins digitais da nossa board é possível ter acesso a 8 saídas (8-bit). O interessante é que se podem ligar IC’s em paralelo:
Continuam-se a ocupar somente 3 pins da board e agora tem-se a disposição 16 saídas, e este processo pode continuar por quantas vezes forem necessárias.
A configuração do esquema pode se ver nas imagens acima, mas como funciona o código?
#define LatchPin 8
#define ClockPin 12
#define DataPin 11
void setup()
{
   pinMode(LatchPin, OUTPUT);
   pinMode(ClockPin, OUTPUT);
   pinMode(DataPin, OUTPUT);
}
void loop()
{
   for(int j=0; j<255; j++)
   {
      digitalWrite(LatchPin, LOW);
      shiftOut(DataPin, ClockPin, MSBFIRST, j);
      digitalWrite(LatchPin, HIGH);
      delay(50);
   }
}
Cada vez que se vai enviar um valor para o IC, desliga-se o pin LatchPin para que nenhuma saída “dê sinal”, neste caso seriam os LEDs a piscar.
Enviam-se os bits para o IC, e informa-se qual a ordem de saída dos bits: MSBFIRST (Most Significant Bit First) ou LSBFIRST (Least Significant Bit First).
Agora, e uma vez que estamos a trabalhar com binário, se enviarem o nº1 acende o 1º LED; nº2 acende o 2º LED; nº3 acende o 1º e 2º LED e assim por diante.
Notem que este IC serve para expandir o número de outputs digitais, logo só terão valores HIGH e LOW.
Irei colocar um pequeno video no Vimeo com um pequeno exemplo.
Espero que se divirtam.