cubelled에 해당하는 글 2

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

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

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



이건 조이스틱 제어 한뒤에 다룰려고 했던 주제인데 3x3x3 CUBE LED랑 같기 때문에 이번에 같이 소개하는 게 좋을 것 같아서 바로 도트매트릭스에 대해서 살펴보도록 하겠습니다.

1. 8x8 도트매트릭스


제가 가지고 있는 모델입니다. 뒷면에 핀이 8x8핀으로 구성되어 있는데 그냥 이상태에서 실험하시면 딱 이 부품만 사용하면 아두이노에서 사용할 수 있는 핀은 몇개 안남습니다. 여기에 따로 모듈을 붙여서 사용핀을 줄여서 실험하셔야 다른 부품들과 같이 다양한 실험을 할 수 있습니다. 모듈화 된 제품을 구하시는게 좋고요. Max7219 칩인가 그걸로 도트매트릭스 핀을 다 제어가 가능합니다. 아니면 74HC595를 2개 사용하여 8핀씩 제어하는 방법도 있고요. 그냥 모듈화 된 것을 구매하셔서 라이브러리로 쉽게 제어하는게 편하겠지요.


오늘 다루는 내용은 사실 실제부품과는 차이가 있고 원리를 설명하며 가상시뮬레이터에서 실험을 통해거 그 결과를 보기 위한 내용으로 꾸며질 꺼에요. 그 이유는 도트매트릭스 부품이 가상시뮬레이터에서는 없기 때문이고 해당 8x8 도트매트릭스 부품은 핀 번호가 좀 복잡합니다. 단순하에 8x8핀이 있다고 해서 대충 연결해서는 원하는 결과를 얻을 수 없습니다.

실제로 실험하실려면은 아래 아두이노 튜토리얼를 참고 하시기 바랍니다.

이것만 보시면 안되고 앞쪽과 뒷쪽을 구분해야 합니다. 앞쪽에 볼록 약간 뛰어 나온 모양이 있는데 그 부분이 앞쬭인데 부품이름이 적혀있는 면일 꺼에요. 가장 중요한 핀번호를 알아야 합니다.

여기 블로그 게시물을 쓴분의 8x8 도트매트릭스 뒷면에 핀번호 사진이 있습니다. 그걸 보시고 핀번호를 확인하시면 됩니다. 그러면 아두이노 공식 홈페이지에 나온 튜토리얼 예제를 보시고 핀 연결한 뒤에 실제로 돌려보시면 아마 될꺼에요.

이걸 다 다룰려면 포스트가 또 길어지고 실제 아두이노를 다루는 것에 초점을 둔게 아니라 가상시뮬레이터 실험을 통해서 아두이노를 이해하는게 목적임으로 간단히 8x8 도트매트릭스 원리를 이해하는 내용으로 전개하겠습니다.

그러면 직접 LED로 제작해야죠. 도트매트릭스 회로도를 만들어 봅시다. 다시 노가다의 길이 시작 되었네요.

2. 8x8 도트매트릭스 회로도 구성


  • 준비물 : Yellow LED 64개, 저항 220옴 8개, 아두이노우노
  • 내용 : 8x8 도트매트릭스 형태를 표현하자.


아마도 지난시간에 3x3x3 CUBE LED를 같다고 생각하시는 분들이 있을거에요. 맞습니다. 도트매트릭스가 이런 구조로 된 부품입니다. 이 회로도를 만드는 중에 난 지금 뭐하고 있는거지 하는 생각이 들정도로 엄청 노가다 작업을 했네요. 동작 원리는 동일합니다. 층과 호실의 개념으로 접근하시면 됩니다. 이건 지난시간에 많이 설명을 해서 더이상 반복하지 않게습니다.

스피드하게 다음 코딩작업으로 갈까요. 참고로 A0~A4핀은 아날로그 입력핀인데 pinMode()를 선언하면 디지털핀 용으로 사용이 가능합니다. 그래서, 16개 핀이 필요한데 겨우 배치했네요. 참고로 0,1핀은 통신핀으로 일부러 사용하지 않았습니다. 사용할 수 있지만 나중에 시리얼통신을 할 때 적용해야 하기 때문에 습관을 0,1핀을 될 수 있으면 사용안하시는게 좋습니다.

3. 코딩



복습

  • pinMode(사용핀, 사용모드) : 사용핀을 INPUT/OUTPUT/INPUT_PULLUP 모드중 뭘로 사용할지를 정함.
  • digitalWrite(사용핀, 출력형태) : 사용핀을 HIGH(5V) or LOW(0V) 중 출력 형태를 정함.
  • delay(1000) : 1초(1000)를 대기한다.

int layer[8] = {10,11,12,13,A0,A1,A2,A3};
int room[8] = {2,3,4,5,6,7,8,9};
int m_layer = 8;  // 층 수
int m_room = 8; // 호실 수

void setup()
{  
  for(int i=0;i<m_layer;i++){
    pinMode(layer[i], OUTPUT); // 층 선언
    pinMode(room[i], OUTPUT); //호실 선언
    digitalWrite(layer[i], HIGH);  // 각층 닫기
    digitalWrite(room[i], LOW);  // 각호실 닫기   
  }   
}
void loop()
{
  for(int i=0;i<m_layer;i++){
    digitalWrite(layer[i], LOW);
    for(int j=0;j<m_room;j++){      
      digitalWrite(room[j], HIGH);
      delay(100);
      digitalWrite(room[j], LOW);
    }
    digitalWrite(layer[i], HIGH);
  }
}  

4. 패턴글자 출력 코딩


참고소스 : [아두이노] 3x3x3 CUBE LED 패턴 코딩 완성본


참고소스는 각 층별로 패턴을 저장했다면 이번 경우는 패턴을 기준으로 각층별의 패턴을 묶어서 저장했네요. 약간의 차이가 있습니다.
'STEEM'이란 글자를 만들기 위해서 8x8에서 'S'를 하나의 패턴으로 층별로 값을 묶었습니다. 지난시간에는 1층이면 1층만의 패턴을 하나의 배열변수에 저장했다면 이번에는 'S'자를 만드는 1~8층의 정보를 하나의 배열변수에 저장했다고 생각하시면 됩니다. 약간은 차이가 있고 이런식으로도 패턴을 저장하는구나를 보여주기 위해서 입니다. 사실, 이방식으로 패턴을 저장하는게 더 옳은 방법입니다. 지난 포스팅에 패턴은 층별 개별적인 패턴을 만들기 때문에 층별 배열변수로 저장이 이뤄졌고요. 이번에는 전체 층을 합산한 패턴을 만들기 때문에 패턴에 대한 전체층의 값을 묶어서 저장해서 좋더 효율으로 패턴을 만들고 출력할 수 있다는 점을 생각하시고 코드를 보시기 바랍니다.

int layer[8] = {10,11,12,13,A0,A1,A2,A3};
int room[8] = {2,3,4,5,6,7,8,9};
int m_layer = 8;  // 층 수
int m_room = 8; // 호실 수

unsigned int layerPattern[5][8] ={ //패턴
  //S :   
  {0x3C,0x66,0x06,0x1C,0x38,0x60,0x66,0x3C},
  //T : 
  {0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0xFF},  
  //E : 
  {0x7E,0x7E,0x60,0x7E,0x7E,0x60,0x7E,0x7E},
  //E : 
  {0x7E,0x7E,0x60,0x7E,0x7E,0x60,0x7E,0x7E},
  //M : 
  {0xC3,0xC3,0xC3,0xC3,0xDB,0xFF,0xE7,0xC3}  
};

void setup()
{  
  for(int i=0;i<m_layer;i++){
    pinMode(layer[i], OUTPUT); // 층 선언
    pinMode(room[i], OUTPUT); //호실 선언
    digitalWrite(layer[i], HIGH);  // 각층 닫기
    digitalWrite(room[i], LOW);  // 각호실 닫기
   
  }  
 
}
void loop()
{
  for(int i=0;i<5;i++){  //순차적으로 패턴수만큼 동작
    for(int j=0;j<30;j++){  //m_delay 시간만큼 해당 패턴을 유지한다.
      for(int p=0;p<8;p++){ //층 별 패턴
        LEDSetting(layer[p], layerPattern[i][p]);  //1층 i번째 패턴        
      }
    }
    delay(500);
  }  
}  
void LEDSetting(int layer, unsigned int state){
  digitalWrite(layer, LOW); //층 개방
  for(int i=0;i<8;i++){    
    digitalWrite(room[i],bitRead(state, i)); //호실 개방     
  }
  delay(5);
  for(int i=0;i<8;i++){     
    digitalWrite(room[i], LOW);   //호실 닫힘   
  }
  digitalWrite(layer, HIGH); //층 닫힘    
}

5. 결과


가상시뮬레이터 결과는 순차적으로 릴레이 출력과 글자 패턴을 출력하는 영상입니다. 따로 만드는 과정은 생략했고요. 그냥 어떻게 동작하는지만 살펴보세요. 그리고 글자 패턴은 'STEEM' 글자가 출력되게 했네요. 가상시물레이터가 뚜렷하게 출력되지는 않네요.

마무리


코딩에 대한 설명은 생략했습니다. 지난시간에 순차적으로 릴레이하는 코딩을 그대로 인용하였고, 패턴 만들기로 2편의 포스팅으로 대충 감을 잡으셨을꺼에요. 따로, 8x8 도트 매트릭스를 설명 드릴 것은 없네요. 3x3x3 CUBE LED나 8x8 도트매트릭스는 다 동일한 원리니깐요. 오늘은 복습 차원으로 생각하시면 되겠습니다.

사실 이 포스트는 지난 3x3x3 CUBE LED할 때 완성했는데 따로 Steem API가 재미 있어서 그쪽으로 맛보기로 포스팅하다 보니깐 이제서야 올리게 되었네요. 1일 1포스트를 하다 보니깐 뭔가 빨리 올리고 싶어서 밀리게 되네요.

아! Steem API 몇개 함수를 이용해서 또 재밌는 걸 만들려고 구상중이네요. 그건 포스팅을 안하겠지만요. 아두이노하다거 포스트 정체성이 상실하니깐 아두이노를 당분간 계속 올려야겠네요. 혹시 재밌는 표현이 완성된 것 있으면 주말에나 한번씩 포스팅을 해봐야 겠네요.


댓글()

[아두이노] 3x3x3 CUBE LED 제어 I

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

[아두이노] 3x3x3 CUBE LED 제어 I



오늘의 주제는 흥미를 유발할 수 있는 3x3x3 CUBE LED 원리를 배우도록 하겠습니다. 지난 [아두이노] 스위치버턴을 이용한 Keypad 제어에서 스위치 버턴을 건물의 층과 호실로 나눠서 살펴봤는데 스위치 버턴은 아두이노로 입력을 받는 방식이라면 역으로 3x3x3 CUBE LED은 아두이노에서 LED로 출력하는 방식이라고 생각 하시면 됩니다. 스위치 버턴은 시각적으로 이해하기는 어렵지만 이번 포스팅 내용은 최대한 시각적인 표현을 통해 LED 제어하는 원리를 쉽게 이해할 수 있도록 표현해 보겠습니다.

1. 3x3x3 CUBE LED 원리


무료이미지 없고 실제로 제작한 것이 없어서 남의 이미지를 가져오는게 좀 문제가 있어서 가상시뮬레이터 최대한 표현은 해 봤네요. 검색어로 3x3x3 CUBE LED를 치시면 사진으로 화려한 이미지들을 볼 수 있을꺼에요. 이런걸 만드는 거구나 하고 우선 구경만 해보세요.


3x3x3 CUBE LED은 x,y 축으로 3x3 LED가 있고 z축으로 3x3 LED가 3개가 있는 것을 3x3x3 CUBE LED라고 부릅니다. 평면이 아닌 3차원 LED라고 생각하면 편하실꺼에요.

아래 그림은 x,y축으로 1개의 LED 단면을 나타낸 실험 그림입니다. 그림을 보면 5V 파워서플라이를 이용해서 전류를 보낼때 회로도 처럼 +, - 를 보내면 아래 한줄이 전부 불이 들어오는 결과를 보실 수 있을거에요. 왜 이렇게 불이 들어왔는지 그 원리에 대해서 공부해보도록 하겠습니다.

회로도결과

2. LED 원리



LED은 다리가 긴쪽이 '+' 이고 다리가 짧은쪽이 '-' 입니다. 가상시뮬레이터에서 사용하는 LED은 다리가 긴쪽이 꺽여있는 걸 보실꺼에요. 다리가 길다는 것을 표현한 이미지 입니다.


위 그림처럼 LED은 5V의 전류가 공급되면 바로 터져버립니다. 그래서 저항을 붙여줘서 전류의 양을 필요한 만큼만 공급되게 해야 아래와 같이 정상적으로 켜집니다. 220옴을 사용했네요. [아두이노] LED 제어 편에서 LED 색상별 필요한 전류가 표로 나와 있으니깐 참조하세요.



3. LED 동작



전류의 공급이 이루어진 LED만 불이 들어오는 것을 보실 수 있죠. 해당 LED에 Vcc(+) 전류가 공급되면 Gnd(-)핀과 쌍으로 연결된 LED에만 정상적으로 전류가 흐르니깐 LED에 불이 들어오게 됩니다. 이 동작 원리를 잘 이해해 주세요. 3x3x3 CUBE LED의 기본 동작 원리이기 때문입니다.


4. 3x3x3 CUBE LED 동작



위 LED 동작에서 보신 3개의 LED를 하나의 층으로 생각하고 총 3층으로 구성되었다고 생각하세요. 3개의 LED가 3개씩 총 9개가 배치된 그림입니다.

전선의 색을 잘 살펴봐주세요. 세로로 같은색을 이루고 있죠. 그 색은 서로 연결되어 있는거라고 생각해 주세요. 오렌지, 블루, 핑크색 선들이 세로로 연결되어 있으니깐 혼동하지 마세요

이제 3층 3호실로 이루어진 건물이 있다고 생각하세요. 각층의 1호실은 핑크선, 각층의 2호실은 블루선, 각층의 3호실은 오렌지선으로 연결되어 있다고 생각하세요.

1층 1호실방에 불이 들어올려면 LED 동작에서 이해 했다면 Vcc(+)와 Gnd(-)를 연결을 어떻게 해야 할까요. 핑크선에 Vcc(+)을 연결하고 1층의 녹색선에 Gnd(-)를 연결하면 됩니다.


여기서 핑크선에 Vcc(+)를 연결하면 1층1호실, 2층1호실, 3층1호실에 Vcc(+) 전류가 공급됩니다. 여기서 1층 녹색선만 Gnd(-)선이 연결되어 있다면 1층1호실만 불이 들어옵니다. 하지만 2,3층 녹색선도 Gnd(-)에 연결되어 있다면 어떻게 될까요.



위 그림처럼 각층에 1호실에 Vcc(+)가 공급되니깐 각층마다 Gnd(-)가 연결된다면 각층 1호실 전부다 불이 들어오게 되겠죠. 이 의미를 잘 이해해 주세요.

그러면 다시 2층 2호실에 불이 들어올려면 어떻게 해야 할까요. 블루선에 Vcc(+)가 연결되고 2층 녹색선만 Gnd(-)선이 연결된다면 아래와 같이 불이 들어 오겠죠.


어렵지 않죠. 여러분들도 원하는 위치에 불이 들어오게 한다면 Vcc(+)와 Gnd(-)를 어떻게 연결할지 그려보시거나 가상시뮬레이터에서 한번 실험 해보세요.

이게 3x3x3 CUBE LED의 원리입니다. 오늘 실험은 3x3x1 CUBE LED 라고 생각하시면 되겠죠. 3x3x3 CUBE LED라면 9 호실로 이루어진 3층 건물로 생각하시면 됩니다. 3호실이 아니라 9호실로 늘어났다고 생각하시면 됩니다. 단지 LED를 큐브 모양으로 배치했을뿐 위에서 다룬 LED 동작을 3층 9호실로 호실만 늘어난 구조라고 생각하시면 오늘 내용은 이게 전부입니다.

Vcc(+)와 Gnd(-)을 어떻게 연결하느냐에 따라 LED에 불이 들어오는지만 이해하시면 됩니다. 핑크, 블루, 오렌지 선에 공급되는 Vcc(+)와 각층에 연결된 Gnd(-)선이 서로 연결되었을때 원하는 위치에 LED에 불이 들오는 것만 이해하시면 됩니다.

설명보다는 실제로 가상시뮬레이터에서 선을 연결해보세요. 그래야 이해가 되실 듯 싶네요

마무리


위에서 Vcc(+), Gnd(-) 선을 연결하여 해당 위치의 LED에 불이 들어오게 하는 방법을 배웠습니다. 하지만 중요한것은 아두이노에서는 위에서 실험한것처럼 그때 그때마다 선을 바꿀 수 없잖아요. 그걸 아두이노가 디지털핀으로 Vcc(+0)와 Gnd(-)을 출력함으로써 그 역활을 대신합니다.


파워서플라이에서 선이 전부다 Vcc(+), Gnd(-)가 연결되어 있죠 1층 1,2,3호실에 불이 들어오고 나머지는 불이 안들어오게 하기 위해서 표현한 예인데 아두이노였다면 디지털핀 6개를 Vcc(+)와 Gnd(-)를 출력으로 보내면 보시는 것처럼 LED불이 들어오게 되겠죠.

그리고 선을 보시면 녹색선에 Gnd(-) 대신에 Vcc(+)를 연결하신 걸 보실꺼에요. 양극이 같은 극이 되면은 전류가 흐를 않는 원리를 이용한 것입니다. 왜 이렇게 구지 연결했냐면 다음편에 소개할 아두이노에서는 해당핀을 Vcc(+) or Gnd(-) 에서 핀은 둘중 하나의 상태를 유지하기 때문에 시각적으로 보여주기 위해서 파워서플라이 연결을 이런식으로 표현 한 것이죠.

이부분은 다음편에서 자세히 이야기 하도록 하겠습니다. 오늘은 LED 선을 어떻게 연결하면 어느 위치에 LED가 불이 들어오는지 전류의 흐름을 잘 관찰하시고 그 원리를 이해만 해주시면 어렵지 않을 것에요. 그리고 이 부분이 핵심이니깐 전류의 흐름의 느낌을 잘 이해해 주세요.

댓글()