Main Content

Circuitos_1

Hoje iremos construir um circuito para ler múltiplos inputs (botões ou outros) usando um IC que converte um input paralelo num output série.

O Circuito usa um IC 74HC165 para fazer a leitura dos inputs. São usadas resistências de pull-up em todos os inputs para que seja garantido um estado fixo quando o botão não está premido.

Este circuito pode ser extendido para mais inputs usando mais integrados destes em cascata. O pino 1 (/PL) e 2 (CP) são ligados em paralelo em todos os 74HC165. O pino 10 (DS) do primeiro IC deve ser ligado ao pino 9 (Q7) do segundo e por ai em diante.
O pino 15 (/CE) foi ligado a GND o que significa que o IC encontra-se sempre enabled.
O pino 10 (/Q7) é o complemento do pino 9 (Q7).

É necessário garantir que todos os pinos P0-P7 têm um estado conhecido. Devem ser ligados ao GND ou aos 5V (através de um pull_up) todos os pinos que não são usados.

Esquemático

Circuitos_3_Schematics

Nota:

Os circuitos apenas apresentam a parte relevante para o IC 74HC165. A ligação com o micro-controlador está definida no sketch.
O circuito para o CSEduino pode ser consultado na página. Pode igualmente ser usado um Arduino UNO.

Componentes (BOM)

Circuito:

  • 1x IC 74HC165 (U1)
  • 8x Resistência de 10K Ohms (R1-R8)
  • 8x Botões de pressão (SW1-8)

Pin-out dos IC/Componentes

Circuitos_4_Pinout

Código

Foram feitos dois sketchs para usar este circuito.

/*

  Pinos usados:
  D9 - Load Pin do 74HC165
  D12 - Q7 Pin do 74HC165
  D13 - CLOCK Pin do 74HC165

  Sketch que usa a comunicação SPI.

*/

#include <SPI.h>

const byte LATCH = 9;

void setup() {
  SPI.begin ();
  Serial.begin(9600);
  pinMode (LATCH, OUTPUT);
  digitalWrite (LATCH, HIGH);
}

void loop() {
  digitalWrite (LATCH, LOW);
  digitalWrite (LATCH, HIGH);
  byte optionSwitch = SPI.transfer(0);

  Serial.print("12345678 : ");
  for (byte i=0; i<8; i++) {
    Serial.print((optionSwitch & (1<<i)) != 0 ? 1 : 0);
  }
  Serial.println();

  delay(100);
}
// Sketch uses 2,892 bytes (8%) of program storage space. Maximum is 32,256 bytes.
// Global variables use 213 bytes (10%) of dynamic memory, leaving 1,835 bytes for local variables. Maximum is 2,048 bytes.

Outro sketch que usa o shiftIn e que pode usar outros pinos:

/*

  Pinos usados:
  D9 - Load Pin do 74HC165
  D12 - Q7 Pin do 74HC165
  D13 - CLOCK Pin do 74HC165

  Sketch que usa o shiftIn.

*/

const byte LATCH = 9;
const byte DATA = 12;
const byte CLOCK = 13;

void setup() {
  Serial.begin(9600);
  pinMode(LATCH, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(DATA, INPUT);

  digitalWrite(CLOCK, HIGH);
  digitalWrite(LATCH, HIGH);
}

void loop() {
  digitalWrite(CLOCK, HIGH);
  digitalWrite(LATCH, LOW);
  delayMicroseconds (5);
  digitalWrite(LATCH, HIGH);
  delayMicroseconds (5);

  byte optionSwitch = shiftIn(DATA, CLOCK, MSBFIRST);

  Serial.print("12345678 : ");
  for (byte i=0; i<8; i++) {
    Serial.print((optionSwitch & (1<<i)) != 0 ? 1 : 0);
  }
  Serial.println();

  delay(100);
}
// Sketch uses 3,048 bytes (9%) of program storage space. Maximum is 32,256 bytes.
// Global variables use 212 bytes (10%) of dynamic memory, leaving 1,836 bytes for local variables. Maximum is 2,048 bytes.