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.

4 comentários:

  1. Da pra controlar rele nessas portas?
    Obrigado

    ResponderExcluir
    Respostas
    1. Fala Diego, isso é totalmente possível, a unica restrição é a tensão que o relê suporta como entrada, é só escolher um relê que seja compatível.

      Excluir
  2. teria algum exemplo de como utilizar reles nessa configuração? como efetuaria a leitura do Rele? para saber se uma lampada no caso esta ligada ou desligada?

    ResponderExcluir
  3. blz irmão, se caso eu te passar um codigo teria como vc incluir esse ai? é para uma bateria eletronica com 24 portas? valeu!!!

    ResponderExcluir