아두이노로 LED matrix 제어하기 #3 : LecControl Library 2

2017. 9. 20. 08:13

Arduino/Display

Arduino LedControl Library #2

이전 글에 이어서 LedControl Library에 대해서 계속 살펴 보겠습니다. LED matrix 출력과 관련해서 이 라이브러리에서 제공하는 함수는 3개입니다. 그 외 7-segment Led display와 관련된 함수 2개가 더 있는데 다음 기회에 다루도록 하고, 3개의 Led matrix 출력 함수 중 하나는 이전 글에서 본 setLed() 함수입니다. 우선, setLed() 함수를 이용하는 몇 가지 예제를 작성해 보겠습니다.

먼저, For문을 이용해서 LED를 순서대로 점등해 보겠습니다.

void loop() {
  lc.setLed(0, 0, 0, true);
  lc.setLed(0, 0, 1, true);
  lc.setLed(0, 0, 2, true);
  lc.setLed(0, 0, 3, true);
  lc.setLed(0, 0, 4, true);
  lc.setLed(0, 0, 5, true);
  lc.setLed(0, 0, 6, true);
  lc.setLed(0, 0, 7, true);
}

위 코드는 0번 모듈 0번째 행 즉, 첫 번째 모듈의 첫 번째 행 첫 번째 LED부터 마지막 LED(7번)까지 차례로 켜는 명령입니다. 켜기만 하고 끄지는 않기 때문에 차례로 켜진 후에는 계속해서 첫 째줄 8개의 LED가 모두 켜져 있게 됩니다.

void loop() {
  int i;
  for (i = 0; i < 8; i++) {
    lc.setLed(0, 0, i, true);
  } 
}

대부분 반복되는 코드로 구성되었기 때문에 For문 등의 반복문을 통해서 위와 같이 간단하게 표현할 수 있습니다. 위 코드는 한 행에 대해서만 처리하지만, 여러 행에 걸쳐 처리하려면 두 개의 For문을 중첩하여 처리할 수 있습니다.

void loop() {
  int i;
  for (i = 0; i < 8; i++) {
    lc.setLed(0, 0, i, true);
    delay(500);
  }
  lc.clearDisplay(0);
  delay(500);
}

위 코드는 첫 번째 행의 LED를 하나씩 켜고 8개 모두 켜지면 clearDisplay() 함수를 이용해 Led를 모두 off 합니다. 실제 구동 속도가 워낙 빠르기 때문에 눈으로 확인하기 위해서 delay() 함수를 적절히 사용했습니다. loop() 함수내에 있으므로 위 동작을 계속해서 반복하게 됩니다.

여기까지 작성한 코드를 실행한 모습입니다.

#include "LedControl.h"
LedControl lc = LedControl(12,11,10,3);
void setup() { 
  lc.shutdown(0, false);
  lc.shutdown(1, false);
  lc.shutdown(2, false); 
  lc.setIntensity(0,8);
  lc.setIntensity(1,8);
  lc.setIntensity(2,8);
  lc.clearDisplay(0);
  lc.clearDisplay(1);
  lc.clearDisplay(2);
}
void loop() {
  int i;
  for (i = 0; i < 8; i++) {
    lc.setLed(0, 0, i, true);
    lc.setLed(1, 0, i, true);
    lc.setLed(2, 0, i, true);
    delay(500);
  }
  lc.clearDisplay(0);
  lc.clearDisplay(1);
  lc.clearDisplay(2);
  delay(500);
}

위 코드는 setLed()함수를 3개 구성하고, 각각 0, 1, 2번 모듈을 제어합니다. 따라서, 바로 위 코드와 동일하지만 3개의 모듈이 동일한 결과를 보여주는 것만 다릅니다.

역시, 결과 화면에서 확인할 수 있습니다.

#include "LedControl.h"
LedControl lc = LedControl(12,11,10,3);
void setup() { 
  lc.shutdown(0, false);
  lc.shutdown(1, false);
  lc.shutdown(2, false); 
  lc.setIntensity(0,8);
  lc.setIntensity(1,8);
  lc.setIntensity(2,8);
  lc.clearDisplay(0);
  lc.clearDisplay(1);
  lc.clearDisplay(2);
}
void loop() {
  int row, col;
  for (row = 0; row < 8; row++) {
    for (col = 0; col < 8; col++) {
      lc.setLed(0, row, col, true);
      lc.setLed(1, row, col, true);
      lc.setLed(2, row, col, true);
      delay(300);
    }
  } 
  lc.clearDisplay(0);
  lc.clearDisplay(1);
  lc.clearDisplay(2);
  delay(500);
}

위 코드는 바로 위의 예제를 첫 번째 행부터 마지막 행까지 반복하도록 출력 코드를 중첩되는 For문으로 구성한 것입니다.

#include "LedControl.h"
LedControl lc = LedControl(12,11,10,3);
void setup() { 
  lc.shutdown(0, false);
  lc.shutdown(1, false);
  lc.shutdown(2, false); 
  lc.setIntensity(0,8);
  lc.setIntensity(1,8);
  lc.setIntensity(2,8);
  lc.clearDisplay(0);
  lc.clearDisplay(1);
  lc.clearDisplay(2);
}
void loop() {
  int addr, row, col;
  for (row = 0; row < 8; row++) {
    for (addr = 0; addr < 3; addr++) {
      for (col = 0; col < 8; col++) {
        lc.setLed(addr, row, col, true);
        delay(200);
      }
    }
  } 
  lc.clearDisplay(0);
  lc.clearDisplay(1);
  lc.clearDisplay(2);
  delay(500);
}

위 코드는 3개의 Led 모듈을 하나의 모듈처럼 첫 번째 행부터 마지막 행까지 차례로 led on 하는 코드입니다.

결과 화면입니다. 한 줄에 24개의 LED를 가진 하나의 모듈처럼 차례대로 한 줄씩 출력하고 있습니다.

setLed()함수에 대한 설명을 마치고, 계속해서 라이브러리에서 제공하는 다른 함수들을 살펴 보겠습니다.

LED matrix 출력과 관련해서 이 라이브러리에서 제공하는 함수는 3개입니다. 그 외 7-segment Led display와 관련된 함수 2개가 더 있는데 다음 기회에 다루도록 하고, 3개의 Led matrix 출력 함수 중 하나는 이전 글에서 본 setLed() 함수입니다. 나머지 2개는 아래와 같습니다.

void setRow(int addr, int row, byte value);
void setColumn(int addr, int col, byte value);

setLed, setRow, setColumn 세 개의 함수 중, setRow(), setColumn() 함수는 이름 그대로 각각 행 단위, 열 단위로 출력하므로 개별 단위로 제어하는 setLed()함수보다는 주로 사용하게 됩니다.

LED on/off with setRow()

먼저 setRow() 함수에 대해 살펴 보겠습니다. 함수 첫 번째 인수는 int addr이고 setLed() 함수와 마찬가지로 연결된 모듈중 하나를 지정하는 인덱스입니다. 연결된 모듈의 수를 벗어날 경우 처리하지 않고 그냥 리턴합니다. 두 번째 인수는 출력할 행을 지정합니다. 행은 총 8개이므로 "0"부터 "7"까지의 숫자로 지정합니다. 이 범위를 벗어날 경우 역시 처리없이 리턴합니다. 세 번째 함수는 출력할 값입니다. 한 행은 8개의 LED로 구성되었으므로 on/off 상태값 8개를 한번에 제공해야 합니다.

1 bit는 "1"과 "0" 둘 중의 하나를 값으로 가질 수 있습니다. 그리고, 이 값은 코드상에서 true, false로 표현될 수 있으며, setLed() 함수에서 이 값들을 이용해 LED의 on, off를 처리했습니다. Led matrix의 한 행은 8개의 Led로 구성되므로 총 8bit의 데이터가 필요하며 따라서 한 행마다 1 Byte 값이 필요합니다.

그래서, setRow() 함수의 마지막 인수 value의 데이터 형이 Byte type이며 한번에 한 행의 Led on/off 값을 제공하게 됩니다.

byte value = B10101010;

우선 위와 같이 byte type 변수를 하나 선언합니다. 변수의 이름은 value이고 초기값으로 "B10101010" 값을 주었습니다. 초기값 앞에 있는 문자 "B"는 뒤의 값이 bit들로 이루어진 1 byte 값이라는 의미입니다. 앞으로 setRow() 함수에 값을 제공할 때, 항상 문자 "B"를 붙여주면 됩니다.

문자 "B" 다음에 "0"과 "1"로 이루어진 숫자 8자리 즉 8bit값이 있습니다. "1"일 경우 true, 즉 Led on 이며, "0"일 경우 false, Led off를 의미합니다.

byte value = B10101010;
lc.setRow(0, 0, value);

위 코드는 변수 value의 값을 setRow() 함수를 통해 Led module에 제공합니다. 함수의 첫 번째 인수 즉, addr이 숫자 "0"이므로 연결된 첫 번째 모듈을 가리킵니다. 두 번째 인수는 Row 값인데, 역시 숫자 "0"이므로 첫 번째 행에 출력합니다. 마지막 인수는 Led의 상태값인데 인수로 주어진 value의 값이 B10101010이므로 Led가 하나 건너 켜지게 됩니다.

#include "LedControl.h"
LedControl lc = LedControl(12,11,10,3);
void setup() { 
  lc.shutdown(0, false);
  lc.shutdown(1, false);
  lc.shutdown(2, false); 
  lc.setIntensity(0,8);
  lc.setIntensity(1,8);
  lc.setIntensity(2,8);
  lc.clearDisplay(0);
  lc.clearDisplay(1);
  lc.clearDisplay(2);
}
void loop() {
  byte value = B10101010;
  lc.setRow(0, 0, value);
  lc.setRow(1, 0, value);
  lc.setRow(2, 0, value);
}

위 예제는 이전 글의 setLed() 함수 예제를 가져와서 loop() 함수 부분만 수정한 것입니다. setRow() 함수를 3개 사용해서 변수 value에 있는 값을 3개의 모듈에 모두 출력하도록 했습니다. 아래 사진에서 보는 것처럼 "1"과 "0"이 번갈아 반복됨에 따라 LED도 하나 건너 켜진 것을 확인할 수 있습니다.

lc.setRow(0, 0, 0);

위와 같이 마지막 인수를 숫자 "0"으로 주면 이는 "B00000000"과 동일하기 때문에 Led를 모두 끄는 명령이 됩니다. clearDisplay() 함수는 모듈 전체를 off 시키지만 위 코드는 해당 row만 off 시킵니다.

#include "LedControl.h"
LedControl lc = LedControl(12,11,10,3);
void setup() { 
  lc.shutdown(0, false);
  lc.shutdown(1, false);
  lc.shutdown(2, false); 
  lc.setIntensity(0,8);
  lc.setIntensity(1,8);
  lc.setIntensity(2,8);
  lc.clearDisplay(0);
  lc.clearDisplay(1);
  lc.clearDisplay(2);
}
void loop() {
  byte value = B11111111;
  int i;
  for (i = 0; i < 8; i++) {
    lc.setRow(0, i, value);
    delay(500);
  } 
  for (i = 0; i < 8; i++) {
    lc.setRow(0, i, 0);
    delay(500);
  }
}

위 예제는 for문을 이용해서 한 행씩 Led on 한 후 한 행씩 Led off 하도록 구성했습니다. 출력 값이 "B11111111"이기 때문에 한 행의 모든 LED를 켜게 되며, 역시 실행 속도가 너무 빠르기 때문에 확인을 위해서 delay() 함수를 적절히 이용했습니다.

결과 화면입니다.

다음 글에서는 setRow() 함수와 배열(Array)을 이용해서 패턴을 출력하는 프로그램을 작성하겠습니다. 이상입니다.

Comments