Search
Duplicate

Uno R4 시작하기

<head> <!-- HTML Meta Tags --> <meta charset="UTF-8" /> <title> 제목 </title> <meta name="description" content=" 설명 " /> <meta name="keywords" content="키워드, 양파고, Yang Phago, 노션, 양파고 노션, notion" /> <!-- Open Graph / Facebook --> <meta property="og:title" content="제목 " /> <meta property="og:description" content=" 설명, 양파고, Yang Phago, 노션, 양파고 노션 " /> <meta property="og:image" content="대표 이미지" /> <meta property="og:url" content="페이지 주소" /> <meta property="og:type" content="website" /> </head>
HTML
복사
목차(클릭하세요)
R4버전을 오류없이 사용하려면 IDE버젼을 최신으로 유지해야 함

1. R4를 구매하는 결정적 이유

1-1. 매우 매력적인가??

물론, 마이크로 비트를 모방했다하면 할말이 없겠지만

1-2. 테트리스 애니메이션으로 test

UNO R4 WiFi에는 테트리스 애니메이션이 사전 로드되어 있음
애니메이션을 test해보기
#include "Arduino_LED_Matrix.h" #include <stdint.h> ArduinoLEDMatrix matrix; const uint32_t frames[][4] = { { 0xe0000000, 0x0, 0x0, 66 }, { 0x400e0000, 0x0, 0x0, 66 }, { 0x400e0, 0x0, 0x0, 66 }, { 0x40, 0xe000000, 0x0, 66 }, { 0x3000000, 0x400e000, 0x0, 66 }, { 0x3003000, 0x400e, 0x0, 66 }, { 0x3003, 0x4, 0xe00000, 66 }, { 0x3, 0x300000, 0x400e00, 66 }, { 0x0, 0x300300, 0x400e00, 66 }, { 0x1c000000, 0x300, 0x30400e00, 66 }, { 0x401c000, 0x0, 0x30430e00, 66 }, { 0x401c, 0x0, 0x430e30, 66 }, { 0x4, 0x1c00000, 0x430e30, 66 }, { 0x0, 0x401c00, 0x430e30, 66 }, { 0x800000, 0x401, 0xc0430e30, 66 }, { 0x800800, 0x0, 0x405f0e30, 66 }, { 0x800800, 0x80000000, 0x470ff0, 66 }, { 0x800800, 0x80080000, 0x470ff0, 66 }, { 0x800, 0x80080080, 0x470ff0, 66 }, { 0x38000000, 0x80080080, 0x8470ff0, 66 }, { 0x10038000, 0x80080, 0x8478ff0, 66 }, { 0x10038, 0x80, 0x8478ff8, 66 }, { 0x700010, 0x3800080, 0x8478ff8, 66 }, { 0x400700, 0x1003880, 0x8478ff8, 66 }, { 0x400, 0x70001083, 0x88478ff8, 66 }, { 0xf000000, 0x40070081, 0x87f8ff8, 66 }, { 0xf000, 0x400f1, 0x87f8ff8, 66 }, { 0x8000000f, 0xc1, 0xf7f8ff8, 66 }, { 0xc0080000, 0xf00081, 0xc7ffff8, 66 }, { 0x400c0080, 0xf81, 0x87fcfff, 66 }, { 0x3400c0, 0x8000081, 0xf87fcfff, 66 }, { 0x20200340, 0xc008081, 0xf87fcfff, 66 }, { 0x38220200, 0x3400c089, 0xf87fcfff, 66 }, { 0x38220, 0x2003408d, 0xf8ffcfff, 66 }, { 0x86100038, 0x220240bd, 0xf8ffcfff, 66 }, { 0xec186100, 0x38260ad, 0xfbffcfff, 66 }, { 0x3ec186, 0x100078af, 0xfaffffff, 66 }, { 0x114003ec, 0x186178af, 0xfaffffff, 66 }, { 0x3b411400, 0x3ec1febf, 0xfaffffff, 66 }, { 0x143b411, 0x4ec3febf, 0xfbffffff, 66 }, { 0xc040143b, 0x4fd7febf, 0xfbffffff, 66 }, { 0xc60c0439, 0x4ff7ffff, 0xfbffffff, 66 }, { 0x33c60f9, 0x4ff7ffff, 0xffffffff, 66 }, { 0x3cbc33ff, 0x4ff7ffff, 0xffffffff, 66 }, { 0x8ffbff, 0x7ff7ffff, 0xffffffff, 66 }, { 0xf0cffbff, 0xfff7ffff, 0xffffffff, 66 }, { 0xfe1fffff, 0xffffffff, 0xffffffff, 66 }, { 0xffffffff, 0xffffffff, 0xffffffff, 66 }, { 0x7fffffff, 0xffffffff, 0xfffff7ff, 66 }, { 0x3fe7ffff, 0xffffffff, 0xff7ff3fe, 66 }, { 0x1fc3fe7f, 0xfffffff7, 0xff3fe1fc, 66 }, { 0xf81fc3f, 0xe7ff7ff3, 0xfe1fc0f8, 66 }, { 0x500f81f, 0xc3fe3fe1, 0xfc0f8070, 66 }, { 0x500f, 0x81fc1fc0, 0xf8070020, 66 }, { 0x5, 0xf80f80, 0x70020000, 66 }, { 0x5, 0xa80880, 0x50020000, 600 }, { 0xd812, 0x41040880, 0x50020000, 200 }, { 0x5, 0xa80880, 0x50020000, 0xFFFFFFFF } }; void setup() { Serial.begin(115200); // you can also load frames at runtime, without stopping the refresh matrix.loadSequence(frames); matrix.begin(); // turn on autoscroll to avoid calling next() to show the next frame; the parameter is in milliseconds // matrix.autoscroll(300); matrix.play(true); pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); }
Arduino
복사

2. LED 제어 익히기

2-1. UNO R4 WiFi LED 매트릭스 사용의 전체흐름

1. 매트릭스 초기화 2. LED 매트릭스 개체 생성 3. begin메서드로 시작 4. 프레임을 사용한 제어
#include "Arduino_LED_Matrix.h" //객체를 만드는 부분 ArduinoLEDMatrix matrix; void setup() { Serial.begin(115200); matrix.begin(); } void loop(){ }
Arduino
복사
프레임이란?
프레임은 메모리 상에 임시적으로 저장되는 데이터 구조를 의미
구체적으로 프레임은 주어진 순간에 매트릭스에 표시되는 "이미지"라고 이해하자!
애니메이션이 일련의 이미지인 경우 프레임은 시리즈의 이미지 중 하나
UNO R4 WiFi에서 12x8 LED 매트릭스를 제어하려면 “최소 96비트 크기의 메모리 공간”이 필요
12x8 LED 매트릭스는 총 96개의 LED를 포함하기 때문
"Arduino_LED_Matrix.h"라이브러리는 프레임을 작성하는 2가지 방법을 제공함
1번째 방법: byte를 사용해 LED각각을 제어하는 프레임 작성
2번째 방법: 32bit를 사용해 LED32개씩 제어하는 프레임 작성

2-2. 초급-2차원 바이트 배열 활용

아두이노 LED매트릭스 자체가 가로 12, 세로8로 구성된 배열
따라서 [8][12]배열이 되어야 함!
0부터 세야 함을 잊지 말자!
#include "Arduino_LED_Matrix.h" 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 } }; //객체를 만드는 부분 ArduinoLEDMatrix matrix; void setup() { Serial.begin(115200); matrix.begin(); matrix.renderBitmap(frame, 8, 12); //renderBitmap메서드를 사용 } void loop(){ delay(500); }
Arduino
복사
이 옵션은 배열의 패턴으로 이미지를 볼 수 있기 때문에 이해하기 쉽고 런타임에 편집하기도 쉬움
문제점
필요한 것보다 더 많은 메모리를 사용
 각 LED는 상태를 저장하는 데 단일 비트만 필요하지만 8비트(1바이트)를 사용하고 있음
TMI: 컴퓨터의 메모리 구조상 데이터를 처리할 때는 보통 바이트 단위(8비트 단위)로 다루는 것이 일반적이므
프레임을 저장하는 메모리 효율적인 방법은 32비트 정수 배열을 사용하는 것
32비트 정수 배열을 사용하면, 4개의 LED 상태를 하나의 정수(4바이트)로 저장할 수 있음!! 즉, 32비트 정수 하나로 4개의 LED 상태를 동시에 저장할 수 있으므로, 메모리 사용이 더 효율적

2-3.중급-32비트 정수 기초

32bit를 사용해 LED32개씩 제어하는 프레임 작성해야 하므로, 총 3개의 프레임이 들어가야 함
LED총 갯수가 96개 이니
#include "Arduino_LED_Matrix.h" unsigned long frame[] = { 0x3184a444, 0x42081100, 0xa0040000 }; //객체를 만드는 부분 ArduinoLEDMatrix matrix; void setup() { Serial.begin(115200); matrix.begin(); matrix.loadFrame(frame); //loadFrame메서드를 사용 } void loop(){ delay(500); }
Arduino
복사

2-4.중급-32비트 정수 활용

여러 개의 서로 다른 프레임을 만들어 적용해보자
loop를 통해 2개 프레임이 서로 교차되어 반복되도록
#include "Arduino_LED_Matrix.h" const uint32_t happy[] = { 0x19819, 0x80000001, 0x81f8000 }; const uint32_t heart[] = { 0x3184a444, 0x44042081, 0x100a0040 }; //객체를 만드는 부분 ArduinoLEDMatrix matrix; void setup() { Serial.begin(115200); matrix.begin(); } void loop(){ matrix.loadFrame(happy); delay(500); matrix.loadFrame(heart); delay(500); }
Arduino
복사

3. LED 매트릭스 가지고 놀기

3-1. 윙크

접근 방식을 변경하고 런타임에 변경하는 비트맵을 만들어보기
각각 얼굴의 일부를 그린 다음 특정 픽셀을 꺼서 왼쪽 눈을 윙크하는 여러 기능이 포함
#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); }
Arduino
복사

3-2.스크롤링 텍스트

 ArduinoGraphics 라이브러리를 통해 텍스트 출력을 지원
해당 라이브러리는 추가로 설치해야 사용가능
색상을 바꾸고 싶다면? - 여기 참고:
텍스트 출력의 전체 흐름(색상도 변경가능)
1. 텍스트 시작위치 지정:matrix.beginText() 2. 텍스트 인쇄: matrix.printText() 3. 출력을 종료하고 (선택적으로) 다음을 사용하여 스크롤 방향을 지정: matrix.endText(direction) 4. 스크롤을 원하지 않으면 공백
// ArduinoGraphics API를 사용하려면 Arduino_LED_Matrix 앞에 포함해야 함 #include "ArduinoGraphics.h" #include "Arduino_LED_Matrix.h" ArduinoLEDMatrix matrix; void setup() { Serial.begin(115200); matrix.begin(); matrix.beginDraw(); matrix.stroke(0xFFFFFFFF); //stork는 색상을 지정하는 메서드, 0xFFFFFF"는 기본 색상(빨간색) // "UNO"만 표시됨(디스플레이 공간이 부족함) const char text[] = "UNO r4"; matrix.textFont(Font_4x6); matrix.beginText(0, 1, 0xFFFFFF); matrix.println(text); matrix.endText(); matrix.endDraw(); delay(2000); } void loop() { matrix.beginDraw(); matrix.stroke(0xFFFFFFFF); matrix.textScrollSpeed(50); // 스크롤할 텍스트 지정 const char text[] = " Hello World! "; matrix.textFont(Font_5x7); matrix.beginText(0, 1, 0xFFFFFF); matrix.println(text); matrix.endText(SCROLL_LEFT); //여기가 스크롤의 핵심 matrix.endDraw(); }
Arduino
복사

3-3.LED 매트릭스 도구 설정

아래 예제와 같이 시리얼 통신을 통해 LED 매트릭스 형태를 바꿀 수 있음
주의점: 시리얼 통신의 통신속도를 일치시켜야 함(115200Baud)
#include "Arduino_LED_Matrix.h" ArduinoLEDMatrix matrix; void setup() { Serial.begin(115200); matrix.begin(); } uint32_t frame[] = { 0, 0, 0, 0xFFFF }; void loop() { if(Serial.available() >= 12){ frame[0] = Serial.read() | Serial.read() << 3 | Serial.read() << 6 | Serial.read() << 9; frame[1] = Serial.read() | Serial.read() << 3 | Serial.read() << 6 | Serial.read() << 9; frame[2] = Serial.read() | Serial.read() << 3 | Serial.read() << 6 | Serial.read() << 9; matrix.loadFrame(frame); } }
Arduino
복사

3-4.실시간 시계

 UNO R4 보드 패키지 에 포함된 RTC 라이브러리를 사용하여 액세스할 수 있음
 이 라이브러리를 사용하면 시간을 설정/가져올 수 있을 뿐만 아니라 알람을 사용하여 인터럽트를 트리거할 수도 있음
우노 이전버젼에서는 RTC모듈을 별도로 사용했어야 위 기능을 구현할 수 있었

3-4-1. 시간 설정하기 예제

#include "RTC.h" void setup() { Serial.begin(9600); //RTC시작 RTC.begin(); //일, 월, 연도, 시, 분, 초를 지정, 요일과 일광 절약 모드를 지정할수도 있음 RTCTime startTime(29, Month::JUNE, 2024, 2, 24, 00, DayOfWeek::WEDNESDAY, SaveLight::SAVING_TIME_ACTIVE); //그리고 시간을 설정 RTC.setTime(startTime); } void loop(){ }
Arduino
복사

3-4-2. 현재 시간가져와서 설정

getTime()을 통해 현재시간을 가져오는 방
#include "RTC.h" void setup() { Serial.begin(9600); RTC.begin(); RTCTime startTime(29, Month::JUNE, 2024, 2, 24, 00, DayOfWeek::WEDNESDAY, SaveLight::SAVING_TIME_ACTIVE); RTC.setTime(startTime); } void loop(){ RTCTime currentTime; // 현재시각 가져오기 RTC.getTime(currentTime); //출력하기 Serial.print(currentTime.getDayOfMonth()); Serial.print("/"); Serial.print(Month2int(currentTime.getMonth())); Serial.print("/"); Serial.print(currentTime.getYear()); Serial.print(" - "); // Print time (HH/MM/SS) Serial.print(currentTime.getHour()); Serial.print(":"); Serial.print(currentTime.getMinutes()); Serial.print(":"); Serial.println(currentTime.getSeconds()); delay(1000); }
Arduino
복사

4. 더 많은 예제 확인