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
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
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.