반응형

아두이노 키트 중에 가로 세로 8개씩 총 64개의 LED가 박혀있는 부품이 있다. 64개의 Dot 이니 문자 중 거의 표현하지 못 할 문자는 없는 것 같다. 오늘은 이것을 컨트롤 해 보려고 한다.


위와 같이 전면에는 8x8 의 LED가 박혀있으며 후면에는 상/하로 8개씩 총 16개의 핀이 있다. 

총 16개를 디지컬 단자에 연결해야 하는데 아날로그 단자의 A0~A5핀도 디지털 핀(14~19번)으로 사용할 수 있으니 이를 활용하면 16개의 핀을 모두 아두이노 우노에 연결이 가능하다.


데이터시트 상의 부품의 구조는 다음과 같다..


데이터시트: 

A-1588AS.pdf




아두이노와의 연결은 위와 같이 했다. 모자란 디지털 단자는 아날로그핀 A0~A3 까지 사용한다.

Fritzing 파일: 

8X8LED.fzz





##소스##

HELLOWORLD 를 스크롤하여 표시한다. FrequencyTimer2 라이브러리가 필요하다.

FrequencyTimer2 라이브러리:

FrequencyTimer2.zip


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
/*
 * Show messages on an 8x8 led matrix,
 * scrolling from right to left.
 *
 * Uses FrequencyTimer2 library to
 * constantly run an interrupt routine
 * at a specified frequency. This
 * refreshes the display without the
 * main loop having to do anything.
 *
 */
 
#include <FrequencyTimer2.h>
 
//표현할 문자를 2진수로 정의 새로운 문자 추가 가능.
#define SPACE { \
    {00000000},  \
    {00000000}, \
    {00000000}, \
    {00000000}, \
    {00000000}, \
    {00000000}, \
    {00000000}, \
    {00000000} \
}
 
 
#define H { \
    {01000010}, \
    {01000010}, \
    {01000010}, \
    {01111110}, \
    {01000010}, \
    {01000010}, \
    {01000010}, \
    {01000010}  \
}
 
 
#define E  { \
    {01111110}, \
    {01000000}, \
    {01000000}, \
    {01111110}, \
    {01000000}, \
    {01000000}, \
    {01000000}, \
    {01111110}  \
}
 
 
#define L { \
    {01000000}, \
    {01000000}, \
    {01000000}, \
    {01000000}, \
    {01000000}, \
    {01000000}, \
    {01000000}, \
    {01111110}  \
}
 
 
#define O { \
    {00011000}, \
    {00100100}, \
    {01000010}, \
    {01000010}, \
    {01000010}, \
    {01000010}, \
    {00100100}, \
    {00011000}  \
}
 
#define W { \
    {10000001},\
    {10000010},\
    {10000010},\
    {01010010},\
    {01010100},\
    {01010100},\
    {00110100},\
    {00011000},\
}
 
#define R { \
    {11111000},\
    {10001000},\
    {10001000},\
    {11111000},\
    {10100000},\
    {10010000},\
    {10001000},\
    {10000100},\
}
 
#define D { \
    {11111000},\
    {11001100},\
    {11000110},\
    {11000110},\
    {11000110},\
    {11000110},\
    {11001100},\
    {11111000},\
}
 
byte col = 0;
byte leds[8][8];
 
// pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1)
int pins[17]= {-1543214151617131211109,876};
 
// col[xx] of leds = pin yy on led matrix
int cols[8= {pins[13], pins[3], pins[4], pins[10], pins[06],pins[11], pins[15], pins[16]};
 
// row[xx] of leds = pin yy on led matrix
int rows[8= {pins[9], pins[14], pins[8], pins[12], pins[1],pins[7], pins[2], pins[5]};
 
//표현할 글자 수
const int numPatterns = 11;
 
//표현할 문자 패턴, numPatterns 의 갯수에 맞게 표시
byte patterns[numPatterns][8][8= {
  //H,E,L,L,O,SPACE
  H,E,L,L,O,W,O,R,L,D,SPACE
};
 
int pattern = 0;
 
void setup() {
  // sets the pins as output
  for (int i = 1; i <= 16; i++) {
    pinMode(pins[i], OUTPUT);
  }
 
  // set up cols and rows
  for (int i = 1; i <= 8; i++) {
    digitalWrite(cols[i - 1], LOW);
  }
 
  for (int i = 1; i <= 8; i++) {
    digitalWrite(rows[i - 1], LOW);
  }
  clearLeds();
 
  // Turn off toggling of pin 11
  FrequencyTimer2::disable();
 
  // Set refresh rate (interrupt timeout period)
  FrequencyTimer2::setPeriod(2000);
  
  // Set interrupt routine to be called
  FrequencyTimer2::setOnOverflow(display);
  setPattern(pattern);
}
 
 
void loop() {
    pattern = ++pattern % numPatterns;
    slidePattern(pattern, 60);
}
 
void clearLeds() {
  // Clear display array
  for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
      leds[i][j] = 0;
    }
  }
}
 
void setPattern(int pattern) {
  for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
      leds[i][j] = patterns[pattern][i][j];
    }
  }
}
 
void slidePattern(int pattern, int del) {
  for (int l = 0; l < 8; l++) {
    for (int i = 0; i < 7; i++) {
      for (int j = 0; j < 8; j++) {
        leds[j][i] = leds[j][i+1];
      }
    }
 
    for (int j = 0; j < 8; j++) {
      leds[j][7= patterns[pattern][j][0 + l];
    }
    delay(del);
  }
}
 
 
// Interrupt routine
void display() {
  digitalWrite(cols[col], LOW);  // Turn whole previous column off
  col++;
  if (col == 8) {
    col = 0;
  }
 
  for (int row = 0; row < 8; row++) {
    if (leds[col][7 - row] == 1) {
      digitalWrite(rows[row], LOW);  // Turn on this led
    }
    else {
      digitalWrite(rows[row], HIGH); // Turn off this led
    }
  }
 
  digitalWrite(cols[col], HIGH); // Turn whole column on at once (for equal lighting times)
}
cs


##결과##



문자만들기 툴의 이용

새로운 8X8 문자를 만들려면 0과 1로 만들기가 쉽지 않다. 

이를 시각적으로 만들 수 있도록 해주고 코드까지 생성해 주는 툴도 소개해 본다.



위와 같이 폼에다가 마우스 클릭으로 문자를 그린 후 Generate를 클릭하면 이를 코드로 만들어 준다. 이것을 이용하면 더욱 쉽게 문자, 아이콘 등을 만들 수 있을 것이다.


8x8 문자, 아이콘 만들기 프로그램 다운로드: 

Program.zip


반응형

+ Recent posts