[아두이노] 74HC595 시프트 레지스터 연동
74HC595 Shift register : Serial to Parallel
간혹 아두이노의 핀이 모자라는 경우가 있습니다. 이런 경우 시프트 레지스터가 해결책이 될 수 있습니다. 시프트 레지스터는 시리얼 데이터를 입력받아 여러 핀을 통해 병렬 출력해 주는 기능을 수행합니다. 흔히 사용되는 74HC595 시프트 레지스터와 아두이노를 연동해 보겠습니다.
74HC595는 8비트 데이터 입력, 시리얼입력으로 병렬출력, 그리고 3개의 상태를 가집니다. 다시말하자면 3개의 입력으로 8개의 출력을 제어할 수 있습니다.
74HC595와 반대 역할의 시프트 레지스터도 있습니다. 74HC165은 병렬데이터를 입력으로 받아 시리얼 데이터로 출력합니다. 이는 여러개의 입력 데이터를 적은 수의 핀으로 수집할 때 용이합니다.
74HC595는 두개의 내장 8비트 레지스터를 포함합니다. 첫번째는 시프트 레지스터(Shift Register)입니다. 74HC595에 클럭 펄스가 발생되면 두가지 일이 발생합니다.
- 시프트 레지스터의 비트 0~6은 비트 1~7로 이동됩니다.
- 클럭 펄스의 상승 에지 시점의 데이터 핀 상태가 비트 0에 저장됩니다.
74HC595의 두번째 레지스터는 저장/레치 레지스터(Storage/Latch Register)입니다. Latch 핀에 신호를 주면 시프트 레지스터의 내용이 저장/레치 레지스터로 복사됩니다. 저장/레치 레지스터는 74HC595칩의 QA-QH 핀에 연결되어 있습니다.
아래는 74HC595의 Pinout입니다. 신호선 명칭 위에 바(bar)가 있는 것은 네거티브 로직(negative logic)으로 해당 핀의 신호를 끄면 해당 기능이 동작한다는 의미입니다.
- GND : 아두이노의 그라운드(ground) 핀과 연결합니다.
- VCC : 아두이노의 5V 핀에 연결합니다.
- SER (Serial Input) : 시프트 레지스터로 데이터를 입력하는 핀
- SRCLK (Shift Register Clock) : 클럭 핀(Clock Pin)의 상승 에지(Rising Edge) 신호에 동기되어 데이터 핀의 데이터가 시프트 레지스터로 들어갑니다.
- RCLK (Register Clock/Latch) : 이 핀에 신호가 들어가면 시프트 레지스터의 내용이 저장/래치 레지스터로 복사됩니다.
- SRCLR (Shift Register Clear) : 시프트 레지스터의 모든 비트를 0으로 초기화 합니다. 네거티브 로직이므로 핀의 상태를 LOW 만들어 이 기능을 활성화 합니다.
- QE (Output Enable) : 네거티브 로직이므로, 이 핀 상태가 LOW가 되어야 출력핀이 활성화되어 LED를 점등시킬 수 있습니다.
- QA-QH (OutputEnable) : LED와 같은 액츄에이터를 실제로 연결하는 핀입니다.
- QH' : 또 다른 74HC595 칩의 SER 핀에 연결하여 daisy-chain을 구성할 때 사용합니다. daisy-chain으로 두개의 74HC595 칩을 연결하면 하나의 16 출력 칩처럼 동작합니다.
실습을 위해 아두이노와 아래와 같은 형태로 결선합니다.
- Pin 11 (SRCLK) => 아두이노 6번 핀
- Pin 12 (RCLK) => 아두이노 5번 핀
- Pin 14 (SER) => 아두이노 4번 핀
LED들은 220옴 저항을 각각 연결해 줍니다.
테스트에 사용된 코드는 아래와 같습니다.
int latchPin = 5;
byte leds = 0; // LED 출력 패턴을 저장
void setup()
{
// 74HC595 제어용 핀 3개 세팅
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop()
{
leds = 0; // LED 모두 OFF
updateShiftRegister(); // LED OFF 출력
delay(500);
for (int i = 0; i < 8; i++)
{
bitSet(leds, i);
delay(500);
}
}
// 래치핀을 OFF 한 후에 데이터핀을 통해 데이터를 쓰고 다시 래치핀을 ON
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
아두이노 shiftOut() 내장함수는 아래와 같은 형태로 구현되어 있습니다.
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
uint8_t i;
for (i = 0; i < 8; i++) {
digitalWrite(dataPin, !!(val & (1 << i)));
else
digitalWrite(dataPin, !!(val & (1 << (7 - i))));
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}
위 코드를 응용하여, 74HC595 칩의 13번 OE핀을 이용해 보겠습니다. OE핀이 LOW인 경우 출력핀들이 활성화됩니다. 아래 그림과 같이 OE을 아두이노의 PWM 3번 핀에 연결하여 밝기를 조정해 보겠습니다. 위 코드에서 아래 부분을 추가합니다.
코드는 아래와 같습니다.
int latchPin = 5;int clockPin = 6;
byte leds = 0; // LED 출력 패턴을 저장
void setup()
{
// 74HC595 제어용 핀 3개 세팅
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop()
{
leds = 0; // LED 모두 OFF
updateShiftRegister(); // LED OFF 출력
delay(500);
for (int i = 0; i < 8; i++)
{
bitSet(leds, i);
delay(500);
}
}
// 래치핀을 OFF 한 후에 데이터핀을 통해 데이터를 쓰고 다시 래치핀을 ON
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
실행결과는 아래와 같습니다.
댓글
댓글 쓰기