디지털 도구/아두이노

[Arduino UNO R4 WiFi] LED Matrix

dd_blog 2023. 7. 7. 11:01

다음 글은 Arduino 공식 홈페이지 내용을 번역한 글 입니다.

https://docs.arduino.cc/tutorials/uno-r4-wifi/led-matrix

 

Using the Arduino UNO R4 WiFi LED Matrix | Arduino Documentation

1byte frame[8][12] = { 2 { 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 }, 3 { 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0 }, 4 { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 }, 5 { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, 6 { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 }, 7 { 0, 0, 0, 0, 1, 0, 1

docs.arduino.cc

 

 

Arduino UNO R4 WiFi 에는 12x8 LED 매트릭스가 내장되어 있어 그래픽, 애니메이션을 표시하거나 인터페이스 역할을 하거나 게임을 할 수 있도록 프로그래밍할 수 있습니다.

 

 

Matrix 초기화

LED 매트릭스 라이브러리를 사용하려면 추가해야하는 코드가 있습니다.

 

먼저 다음과 같이 라이브러리를 포함합니다.

#include "Arduino_LED_Matrix.h"

 

그 다음 줄에 다음 코드를 추가하여 LED 매트릭스 개체를 만들어야 합니다.

ArduinoLEDMatrix matrix;

 

그 다음 다음 코드를 추가하여 LED 매트릭스를 시작합니다. void setup():

matrix.begin();

 

초기화 전체 코드는 다음과 같이 작성되어야 합니다.

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

 

프레임 작성 방법

 

UNO R4 WiFi용 LED 매트릭스 라이브러리는 프레임을 만든 다음 프레임을 표시하는 버퍼에 로드하는 원리로 작동합니다.

 

프레임은 매트릭스에서 주어진 순간에 표시되는 "이미지"라고 부르는 것입니다. 애니메이션의 일련의 이미지인 경우 프레임은 해당 시리즈의 이미지 중 하나입니다.

 

UNO R4 WiFi에서 12x8 LED 매트릭스를 제어하려면 최소 96비트 크기의 메모리 공간이 필요합니다.

라이브러리는 이를 수행하는 두 가지 방법을 제공합니다.

 

첫 번째 방법은 단순히 다음과 같이 바이트 형식의 2차원 배열을 만드는 것입니다.

byte frame[8][12] = {
  { 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
  { 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0 },
  { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
  { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
  { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};

이 방법은 배열의 패턴에서 이미지를 볼 수 있고 런타임에 편집하기 쉽기 때문에 이해하기 쉽습니다.

위의 배열에 있는 것들은 하트모양을 형성합니다.

 

주소를 선택하고 값을 변경하는 개별 픽셀을 대상으로 하려면 0부터 계산을 시작해야 합니다.

다음 코드는 왼쪽에서 세 번째 픽셀, 위에서 두 번째 픽셀을 켭니다.

frame[2][1] = 1;

matrix.renderBitmap(frame, 8, 12);

 

그러나 이러한 방법은 필요한 것보다 더 많은 메모리를 사용하게 됩니다. 각 LED는 상태를 저장하는 데 1비트만 필요하지만 8비트(1바이트)를 사용하게 됩니다. 프레임을 저장하는 보다 효율적인 방법은 32비트 정수 배열을 사용하는 것입니다.

 

 

 

두 번째 방법의 코드는 다음과 같습니다.

unsigned long frame[] = {
  0x3184a444,
  0x42081100,
  0xa0040000
};

unsigned long 변수는 32비트를 보유하고 96/32는 3이므로 unsigned long 배열은 LED 매트릭스에 필요한 모든 비트를 보유하는 효율적인 방법입니다.

 

이런 16진수의 값이 픽셀의 위치와 어떤 관련이 있는지 확인하려면 16진수 값을 2진수 값으로 변환합니다.

for (int b = 0; b < 3; b++) {
    Serial.println(frame[b], BIN);
  }

위 코드를 수행하면 배열의 모든 비트 값이 출력됩니다.

110001100001001010010001000100
1000010000010000001000100000000
10100000000001000000000000000000

그러나 위의 방법은 모든 비트를 표시하지는 않습니다. 각 배열의 요소에는 32비트가 있어야하고 32비트를 모두 표시하기 위해 0을 추가하면 다음과 같은 결과가 나타납니다.

00110001100001001010010001000100
01000010000010000001000100000000
10100000000001000000000000000000

위의 결과를 12비트 그룹으로 나누면 하트 모양을 확인할 수 있습니다.

001100011000
010010100100
010001000100
001000001000
000100010000
000010100000
000001000000
000000000000

 

여러 프레임이 있는 경우 다음과 같이 코르를 작성할 수 있습니다.

const uint32_t happy[] = {
    0x19819,
    0x80000001,
    0x81f8000
};

const uint32_t heart[] = {
    0x3184a444,
    0x44042081,
    0x100a0040
};

  matrix.loadFrame(happy);
  delay(500);

  matrix.loadFrame(heart);
  delay(500);

 

 

예제

서로 다른 프레임을 표시하는 두 개의 기본 스케치를 사용하여 하나씩 로드하는 예제입니다.

먼저 3x32 비트 정수 프레임을 만들고 하나씩 로드합니다.

 

 

- 웃는 얼굴을 그린 후 하트로 변경하는 예제입니다.

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

const uint32_t happy[] = {
    0x19819,
    0x80000001,
    0x81f8000
};
const uint32_t heart[] = {
    0x3184a444,
    0x44042081,
    0x100a0040
};
  
void loop(){
  matrix.loadFrame(happy);
  delay(500);

  matrix.loadFrame(heart);
  delay(500);
}

 

 

- 웃는 얼굴의 일부를 그린 후 특정 픽셀을 꺼서 왼쪽 눈을 윙크하는 모양을 만드는 예제입니다.

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

uint8_t frame[8][12] = {
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};

void leftEye(){
  //Left eye
  frame[1][3] = 1;
  frame[1][4] = 1;
  frame[2][3] = 1;
  frame[2][4] = 1;
}

void wink(){
  //Wink with the left eye
  frame[1][3] = 0;
  frame[1][4] = 0;
  frame[2][3] = 1;
  frame[2][4] = 1;
}

void rightEye(){
  //Right eye
  frame[1][8] = 1;
  frame[1][9] = 1;
  frame[2][8] = 1;
  frame[2][9] = 1;
}

void mouth(){
  //Mouth
  frame[5][3] = 1;
  frame[5][9] = 1;
  frame[6][3] = 1;
  frame[6][4] = 1;
  frame[6][5] = 1;
  frame[6][6] = 1;
  frame[6][7] = 1;
  frame[6][8] = 1;
  frame[6][9] = 1;
}

void loop(){
leftEye();
rightEye();
mouth();

matrix.renderBitmap(frame, 8, 12);

delay(1000);
wink();

matrix.renderBitmap(frame, 8, 12);
delay(1000);
}