직렬 연결한 쉬프트레지스터(74HC595) 제어(아두이노)
직렬 연결한 쉬프트레지스터(74HC595) 제어(아두이노)
- 온라인 가상시뮬레이터 : AUTODESK CIRCUITS
- 참고 출처 : https://www.arduino.cc/en/Tutorial/ShftOut13
이번에는 2개의 74HC595칩을 직렬로 연결하여 3개의 핀을 이용해서 2개 7 Segment LED를 제어하는 실험을 하였습니다. 이번에도 제 블로그에 포스팅 했던 내용인데 코딩은 최대한 원리를 설명하기 위한 로직이라서 기존 블러그에 있던 로직을 수정없이 그대로 소개하도록 하겠습니다. 여기다 살을 더 붙여서 60초 카운터 하는 로직을 설계할 수 있지만 그러면 군더더기 붙은 코딩으로 60초 변수를 만들고 if 조건문을 써서 십의자리와 일의자리를 쪼갤지 아니면 따로 카운터 변수로 정해서 조건문으로 표현할지 정하다 보면 본래 설명하고자하는 직렬 연결 설명이 복잡해 보일 수 있어 이번 포스팅은 간단히 어떻게 출력이 되는지만 실험하는 거라서 60초 카운터 출력은 독자의 몫으로 남겨 두겠습니다.
1. 직렬 쉬프트레지스터(75HC595) 연결
이전 시간에 75HC595 칩 하나를 아두이노에 연결하는 회도로를 이해했다는 전재하에서 기본 STCP, SHCP, DP 핀으로 해서 75HC595 칩을 제어를 하게 됩니다. 이 3핀을 제어하는데 직렬로 연결하면 위 그림처럼 연결을 하게 됩니다. STCP(결쇠)와 SHCP(클럭)핀은 공유합니다. DP핀은 오른쪽 75HC595 칩에 입력되고 그 입력된값이 Q7S 핀을 통해서 왼쪽 75HC595 칩의 DS 핀의 입력으로 들어 갑니다.
처음 아두이노에서 입력된 값이 16개의 값이 입력되면 앞에 8개 값이 왼쪽 75HC595 칩에 쌓이고 나머지 8개가 오른쪽 칩에 쌓여서 출력됩니다.
여기서 선색으로 대충 의미를 이해하시면 되겠습니다.
2. 회로도 구성
- 준비물 : 75HC595칩 2개, 7 Segment LED 2개, 저항 330옴 2개, 아두이노우노, 뻥판
- 내용 : 두개의 7 Segment LED에 숫자를 출력하게 하자.
74HC595 칩을 하나 사용할때도 복잡했는데 그림으로 2개를 사용하니깐 더 복잡해 보일꺼에요. 이전 시간에 한개로 했을때 선 연결과 동일하고 그걸 참고해서 두개를 동일하게 선 연결을 하시면 됩니다. 그리고 추가된것은 위의 직렬 쉬프트레지스터 연결을 보시면서 선이 왜 이렇게 연결되었는지 이해하시면 됩니다.
복잡해 보일뿐 단순합니다. 핀에 마우스를 대면 핀 이름이 나오고 해당된 부품과 연결하시면 됩니다.
3. 코딩
- 사용함수 : pinMode(출력핀, 모드), digitalWrite(결쇠핀, 열림/잠금), shiftOut(데이터입력핀, 클럭핀, 순서, 데이터전송값)
- 내용 : 아두이노에서 제공되는 shiftOut( )함수로 74HC595칩을 제어를 통해 2개 7 Segment LED에 숫자를 0과1, 1과2 ... 순차적으로 출력해보자.
- 74HC595칩 제어 :
- latchPin, clockPin, dataPin을 pinMode(출력핀, 모드)로 선언
- digitalWrite(결쇠핀, 열림/잠금)으로 74HC595 칩에 입력할때 열림/잠금을 제어
- shiftOut(데이터입력핀, 클럭핀, MSBFIRST, 전송값)으로 이걸 통해서 역순으로 데이터가 배치
설계
오른쪽 0부터 왼쪽 1부터 순차적으로 숫자를 출력
이전시간에
열림
쉬프트레지스트에 데이터 전송
닫침
코딩으로
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, data[i]);
digitalWrite(latchPin, HIGH);
숫자 1개는 8개 값이 필요합니다. 그러면 쉽게 생각해보세요. 숫자가 2개면 16개의 값이 필요합니다. 그러면 쉬프트레지스트로 shiftOut()을 통해 두번 데이터를 전송하면 되겠다는것이 떠올라야 겠죠.
0과 1, 1과2 이렇게 순차적으로 출력하도록 설계할꺼니깐 아래과 같이 표현하면 되겠죠.
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, data[i]);
shiftOut(dataPin, clockPin, MSBFIRST, data[i+1]);
digitalWrite(latchPin, HIGH);
코딩을 하면
byte data[]={
0B10000001,
0B11110010,
0B01001001,
0B01100000,
0B00110011,
0B00100100,
0B00000101,
0B11110000,
0B00000001,
0B00100000
};
int latchPin = 11; //ST_CP Pin
int clockPin = 12; //SH_CP Pin
int dataPin = 9; //DS Pin
void setup(){
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop(){
for(int i=0;i<9;i++){
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, data[i]);
shiftOut(dataPin, clockPin, MSBFIRST, data[i+1]);
digitalWrite(latchPin, HIGH);
delay(1000);
}
}
4. 결과
마무리
3핀을 이용하여 2개의 74HC595 칩을 제어하여 2개의 7 Segment LED에 출력하였습니다.
회로도 보면 지져분하고 선연결이 복잡해 보일 수 있어요. 지난 시간에 배운 쉬프트레지스트 회로도를 디자인을 어느정도 이해하시면 2개든 3개든 보기에만 복잡해 보일뿐 참 쉬운 회로도입니다. 코딩도 지난시간에 했던 것에서 딱 한줄 늘어났을뿐 변화가 없습니다.
이 세줄만 이해하시면 몇개의 74HC595 칩을 사용해도 쉽게 해결됩니다.
열림
쉬프트레지스트에 데이터 전송
닫힘
오늘은 직렬 두개였으니깐
열림
쉬프트레지스트에 데이터 전송1
쉬프트레지스트에 데이터 전송2
닫힘
참쉽죠.
60초 카운터를 만들려 했는데 그러면 약간 직렬 제어 코딩에 혼동을 줄 수 있기 때문에 간단하게 두개를 어떻게 제어하는지만 배우는 것이 목적임으로 생략이 되었네요.
한번 여러분들이 60초 카운터 로직을 설계 해 보세요.
그리고 74HC595 칩의 원리로 어떤걸 표현하면 좋을지 상상의 나래를 펼쳐보세요.
스스로 홍보하는 프로젝트에서 나왔습니다.
오늘도 좋은글 잘 읽었습니다.
오늘도 여러분들의 꾸준한 포스팅을 응원합니다.
오늘도 방문해 주셔서 감사합니다.
지금 당장은 장비가 없어 보면서 상상만 하지만 실험관련을 좋아하다 보니ㅡ재미있게 보고 있습니다 ^^
웹 실시간 가상시뮬레이터로 하시면 실험 가능함!
저도 처음에 가상시뮬레이터로 연습 무자게 하고 나서 실제로 구매했어요
동영상 전부다 웹상에서 실시간으로 실험 했네요
새해 복많이 받으세요!!
새해 복 많이 받으세요!