[아두이노] 74HC595+8x8 도트매트릭스 제어

IOT/아두이노|2019. 3. 31. 09:00

[아두이노] 74HC595+8x8 도트매트릭스 제어



이전 시간에는 8x8 LED 핀을 일일히 아두이노에 연결을 하다 보니깐 16개의 핀이 필요했습니다. 너무 많은 핀을 사용하다 보니깐 줄여보고 싶은 마음이 생기지 않나요. 우리가 7 Segment LED를 제어할 때 사용한 부품이 떠오르는 분이 있을 지 모르겠군요. 그 부품은 74HC595칩 핀으로 쉬프트레지스트를 이용하면 16개 핀에서 3개의 핀으로 줄어들게 됩니다. 74HC595 칩은 8개의 출력 핀을 제공하는데 이 칩을 직렬로 연결하면 무제한 핀을 사용할 수 있습니다. 물론 Max7219칩 하나로 16개핀을 한번에 제어가 가능합니다. 하지만 가상시뮬레이터에서는 해당 칩이 없고 74HC595 칩뿐이 없으니 그걸로 실험을 할 수 밖에 없겠죠.
그러면 74HC595 칩 2개를 이용해서 8x8 LED를 제어해보록 하겠습니다.

1. 74HC595 직렬 연결



복습의 시간으로 latchPin(12), clockPin(11), dataPin(9)을 통해서 제어합니다. 9번, 11번, 12번 핀을 연결한 선 색을 잘 보시기 바랍니다. 11, 12번핀은 서로 연결되어 있지만 9번 데이터 입력되는 핀은 Orange 선이 수평선으로 이여진게 직렬 데이터가 전송되는 연결인데 오른쪽 74HC595핀의 Q7s핀에서 왼쪽 74HC595의 dataPin에 입력으로 이여집니다.

예) 아래와 같은 입력이 이뤄질 경우74HC595 직렬 연결시 데이터는 어떻게 배치되는지 살펴 봅시다.

0B11111110 00000001


어떤 느낌으로 들어가시는지 아시겠지요.

실제로 코딩할대는 byte 배열 변수를 층과 호실로 나눠서 2개를 만들었는데요. 가능하다면 int형으로 하나로 16bit로 표현하셔도 됩니다. 이해를 돕기위해서 실험은 2개의 byte(8bit)로 실험 했습니다.

2. 회로도 구성


  • 준비물 : Yellow LED 64개, 저항 220옴 8개, 74HC595 칩 2개, 아두이노우노, 뻥판
  • 내용 : 8x8 도트매트릭스 형태를 표현하고 74HC595 칩 두개로 출력하니깐 거기에 맞게 배치해보자.


3. 코딩



복습

  • 74HC595칩 제어 :
    - latchPin, clockPin, dataPin을 pinMode(출력핀, 모드)로 선언
    - digitalWrite(결쇠핀, 열림/잠금)으로 74HC595 칩에 입력할때 열림/잠금을 제어
    - shiftOut(데이터입력핀, 클럭핀, MSBFIRST, 전송값)으로 이걸 통해서 역순으로 데이터가 배치

설계

1층만 개방은 1층에 Gnd 상태이고 나머지 층은 HIGH상태여야 하잖아요.

OB11111110

이렇게 됩니다. 오른쪽 끝이 1층이고 역순으로 순서대로 '87654321'층으로 위치가 결정됩니다.

그럼 1층1호실에 불이 들어올려면은 어떻게 해야 할까요. '0B11111110' 로 1층만 개방해야 겠죠.
1~8호실중에 1호실만 불이 들어올려면 1호실만 HIGH 상태이고 나머지는 Gnd(LOW)상태여야 겠죠.

0B00000001

1층(0B11111110)과 1호실(0B00000001)로 합쳐져서 1호실만 불이 들어오게 됩니다.
층별 개방할려면,

0B11111110,  
0B11111101,
0B11111011,
0B11110111,
0B11101111,
0B11011111,
0B10111111,  
0B01111111,

이렇게 '0'인 위치만 개방 해야겠죠

호실별 개방할려면,

0B00000001,  
0B00000010,  
0B00000100,  
0B00001000,  
0B00010000,  
0B00100000,  
0B01000000,  
0B10000000

이렇게 '1'인 위치로 호실만 전류를 보내겠다는 표현이겠죠. 각층의 8개의 호실에 불이 순서대로 깜박일려면 2중 for문을 사용해서 표현하면 됩니다.

for(int i=0;i<8;i++){
 for(int j=0;j<8;j++){
     층[i] 패턴에 호실[j=0~7]까지 순서대로 호실패턴이 대입을 수행;
 }
}

즉, 층[0] 패턴일때 호실[0]~[7]패턴이 대입된다면
'0B11111110 ' + '0B00000001 = 1층1호실 불이 들어옴
'0B11111110 ' + '0B00000010 = 1층2호실 불이 들어옴
'0B11111110 ' + '0B00000100 = 1층3호실 불이 들어옴
.......

대충 이런식으로 층[0]~[7]까지의 패턴이 있는데 각 층에 대한 호실[0]~[7]까지의 패턴이 순차적으로 대입되는 로직을 머리속에서 그리셔야 합니다. 어떤식인지 이해하셨는지 모르겠네요.

전체적으로 코딩을 하면,

byte layer[]={ //층
0B11111110,  
0B11111101,
0B11111011,
0B11110111,
0B11101111,
0B11011111,
0B10111111,  
0B01111111,
};
byte room[]={ //호실
0B00000001,  
0B00000010,  
0B00000100,  
0B00001000,  
0B00010000,  
0B00100000,  
0B01000000,  
0B10000000
};
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<8;i++){  //순차적으로 릴레이 깜박이기    
    for(int j=0;j<8;j++){
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, layer[i]);
      shiftOut(dataPin, clockPin, MSBFIRST, room[j]);
      digitalWrite(latchPin, HIGH);       
      delay(100);
    }
  }  
}

4. 결과


간단히 실험 결과 영상만 올렸습니다. 회로도 제작 과정은 생략합니다. 이전 74HC595 칩을 제어할때 다뤘던 내용이니 결과로 어떻게 출력되니지만 확인하시고 회로도 만드는 과정은 74HC595편을 참고하세요


마무리


오늘은 어제 실험한 내용에 오래전에 배운 74HC595칩을 결합을 해보았습니다.

내일은 LED의 꽃인 네오픽셀을 다루는 것을 해보겠습니다. LED에 관해서는 얼추 기초적인 부분은 다 끝난 것 같네요. 나머지 부분은 대부분 여러가지 부품과 결합해서 표현하는 응용편이니깐요. 암튼 네오픽셀이 가장 화려하고 재미 있을 듯 싶네요.


댓글()