메이커 여러분, 오늘은 잔상 효과(Persistence of Vision, POV) 글로브 프로젝트를 소개합니다.
POV(잔상 효과)란? 교류 전원의 조명은 초당 60회(60Hz) 깜빡이지만 우리 뇌는 연속된 빛으로 인식합니다. 이 원리를 이용해 단일 줄의 LED로 회전하며 구면 이미지를 만듭니다. 반구당 58개, 총 116개 LED 사용. 원형 프레임은 3D 프린터로 출력. 자세한 내용은 영상 참고.
코드
d_nya.ino
#include "FastLED.h"
#define NUM_LEDS 58
#define DATA_PIN 6
unsigned char i;
unsigned char m;
unsigned int wait = 1;
unsigned int wait2 = 10;
byte hall = 0;
CRGB leds[NUM_LEDS];
// 하트 패턴 데이터 (40행 x 75열)
bool kalp[40][75] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,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,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,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,1,1,0,1,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 setup() {
FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);
attachInterrupt(1, LEDiyak, RISING);
for (int i = 0; i < 58; i++) {
leds[i] = CRGB::Black;
}
FastLED.show();
}
void LEDiyak() {
hall++;
if(hall > 2) hall = 0;
}
void loop() {
if (hall > 0) {
for (m = 0; m < 75; m++) {
for (i = 0; i < 40; i++) {
if (kalp[i][m] == 1) {
leds[i + 7] = CRGB::Green;
} else {
leds[i + 7] = CRGB::Blue;
}
}
FastLED.show();
delayMicroseconds(wait);
}
for (int i = 0; i < 58; i++) leds[i] = CRGB::Blue;
FastLED.show();
delayMicroseconds(wait2);
for (int i = 0; i < 58; i++) leds[i] = CRGB::White;
FastLED.show();
delayMicroseconds(wait2);
}
}