저번에는 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 하신 분이 만든 코드이다. 정말 대단하다.

요걸 컴파일해서 로딩해 보자.

Video Label

화면 클릭~!

어떤가? 신기하지 않은가? 코드는 어렵지 않으니 다들 분석해 보시라~!