잔상효과/persistence of vision
저번에는 knight rider LED까지 해 봤다.
이번에는 조금 더 발전시켜서, 잔상효과라는 것을 해 보자.
어렸을 때, 수업시간에 공부하기 싫을 때, 많이 들 해 봤을 것이다. 교과서 한 귀퉁이에 스틱맨 같은 캐릭터 그려서 멀리뛰기나 무술 같은 애니메이션을 해서 장난치면서 놀던 기억.
책장을 빠르게 넘기면, 이게 만화가 된다. 바로 이것이 잔상효과이다. 이걸 이용해서 LED를 가지고 캐릭터를 디스플레이 해보자.
#include <MsTimer2.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
uint8_t const pov_pattern[] PROGMEM = {
0b000000, 0b000000, 0b00000000, // line 1: ....................
0b000000, 0b000000, 0b00000000, // line 2: ....................
0b000000, 0b000000, 0b00000000, // line 3: ....................
0b000000, 0b000000, 0b00000000, // line 4: ....................
0b000000, 0b000000, 0b00000000, // line 5: ....................
0b000000, 0b000000, 0b00000000, // line 6: ....................
0b000000, 0b011110, 0b00000000, // line 7: .......XXXX.........
0b000001, 0b111110, 0b00000000, // line 8: .....XXXXXX.........
0b000011, 0b111110, 0b00000000, // line 9: ....XXXXXXX.........
0b000111, 0b111100, 0b00000000, // line 10: ...XXXXXXX..........
0b001111, 0b110000, 0b00000000, // line 11: ..XXXXXX............
0b001111, 0b100000, 0b00000000, // line 12: ..XXXXX.............
0b011111, 0b000000, 0b00000000, // line 13: .XXXXX..............
0b011110, 0b000000, 0b00000000, // line 14: .XXXX...............
0b011110, 0b000000, 0b00111110, // line 15: .XXXX.........XXXXX.
0b011100, 0b000000, 0b01111110, // line 16: .XXX.........XXXXXX.
0b111100, 0b000000, 0b01111110, // line 17: XXXX.........XXXXXX.
0b111100, 0b000000, 0b01111110, // line 18: XXXX.........XXXXXX.
0b111100, 0b000000, 0b01111100, // line 19: XXXX.........XXXXX..
0b111000, 0b000000, 0b00000000, // line 20: XXX.................
0b111000, 0b000000, 0b00000000, // line 21: XXX.................
0b111000, 0b000000, 0b00000000, // line 22: XXX.................
0b111000, 0b000000, 0b00000000, // line 23: XXX.................
0b111100, 0b000000, 0b01111100, // line 24: XXXX.........XXXXX..
0b111100, 0b000000, 0b01111110, // line 25: XXXX.........XXXXXX.
0b111110, 0b000000, 0b01111110, // line 26: XXXXX........XXXXXX.
0b011111, 0b000000, 0b01111110, // line 27: .XXXXX.......XXXXXX.
0b001111, 0b000000, 0b00111100, // line 28: ..XXXX........XXXX..
0b001111, 0b100000, 0b00000000, // line 29: ..XXXXX.............
0b000111, 0b111000, 0b00000000, // line 30: ...XXXXXX...........
0b000011, 0b111100, 0b00000000, // line 31: ....XXXXXX..........
0b000001, 0b111100, 0b00000000, // line 32: .....XXXXX..........
0b000000, 0b111100, 0b00000000, // line 33: ......XXXX..........
0b000000, 0b000000, 0b00000000, // line 34: ....................
0b000000, 0b000000, 0b00000000, // line 35: ....................
0b000000, 0b000000, 0b00000000, // line 36: ....................
0b000000, 0b000000, 0b00000000, // line 37: ....................
0b000000, 0b000000, 0b00000000, // line 38: ....................
0b000000, 0b000000, 0b00000000, // line 39: ....................
0b000000, 0b000000, 0b00000000, // line 40: ....................
};
void blink() {
static uint16_t index = 0;
PORTC = pgm_read_byte(pov_pattern+(index++));
PORTB = pgm_read_byte(pov_pattern+(index++));
PORTD = pgm_read_byte(pov_pattern+(index++));
if (index >= sizeof(pov_pattern)) { index = 0; }
}
void setup() {
DDRD = 0b11111111; // set digital 0- 7 to output
DDRB = 0b00111111; // set digital 8-13 to output
DDRC = 0b00111111; // set digital 14-19 to output (coincidences with analog 0-5)
MsTimer2::set(2, blink);
MsTimer2::start();
}
void loop() { }
이 코드도 knight rider 하신 분이 만든 코드이다. 정말 대단하다.
요걸 컴파일해서 로딩해 보자.
화면 클릭~!
어떤가? 신기하지 않은가? 코드는 어렵지 않으니 다들 분석해 보시라~!