[아두이노] 8x32 도트 매트릭스로 글자 이동시켜보기



안녕하세요 대짜이찐입니다.
이번 시간에는 이전에 한번 해봤던
8x32 도트 매트릭스에서 추가로 글자를 
이동(시프트)시켜 보는 포스트입니다.

이전 작성 글은 아래링크에서 확인해 볼 수 있습니다.






여기 간단하게 8x8 도트 매트릭스로 그려진 하트가 있습니다.

1
2
3
4
5
6
7
8
9
10
{
B00000000,
B01100110,
B11111111,
B11111111,
B11111111,
B01111110,
B00111100,
B00011000
},


참고로 2진수 배열로 보면 이런 모습입니다.








위에 그림처럼  8x32 도트 매트릭스에서
하트를 왼쪽으로 이동시키기 위해서는 비트 연산이 필요합니다.

비트 연산자에 대해서는 아래 링크에서 확인 할 수 있습니다.


https://devicemart.blogspot.com/2019/05/blog-post_7.html




첫번째 도트 매트릭스에 하트가 그려져 있습니다.

이 하트를 두번째 도트 매트릭스로 보내기 위해서는
첫번째 도트 매트릭스의 맨 왼쪽 열(Column)이 
두번째 도트 매트릭스의 8번째 led로 가야합니다.

1. 두번째 도트 매트릭스는 왼쪽으로 시프트(<<)를 1번를 합니다.
2. 첫번째 도트 매트릭스는 오른쪽으로 7번 시프트(>>)를 합니다.
3. 이후 두 데이터를 OR 비트 연산으로 합치면 이동하게 됩니다. 

그림으로 예를 들어 설명해 드리겠습니다.



위 그림처럼 8 x 32 도트 매트릭스 led가 on 이 되었다고 했을 때,



두번째 도트매트릭스는 왼쪽으로 1번 시프트(<<) 합니다.



첫번째 도트매트릭스는 오른쪽으로 7번 시프트(>>) 합니다.



그리고 두 데이터를 OR 비트 연산을 해주면
위 이미지 처럼 데이터가 합쳐지게 됩니다.


아래 코드는 8x32 도트 매트릭스에 'No.1 디바이스마트' 글자를
 시프트 시키는 소스입니다.

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
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
#include "LedControl.h" // 라이브러리 사용 선언
// LedControl객체의 인스턴스를 lc로 선언
// Din 핀을 12번, ClK핀을 11번 CS핀을 10번에 연결, 매트릭스는 4개를 사용 선언
LedControl lc = LedControl(12,11,10,4);
byte data[15][8] = //14개의 데이터 선언
{
 // 영문 'N'을 이진수로 배열 선언
            {
            B00000000,
            B00000000,
            B00100010,
            B00110010,
            B00101010,
            B00100110,
            B00100010,
            B00000000
            },
 // 영문 'O'을 이진수로 배열 선언
            {
            B00000000,
            B00000000,
            B00000000,
            B00011000,
            B00100100,
            B00100100,
            B00011000,
            B00000000
            },
 // 문자+숫자 '.1'을 이진수로 배열 선언
            {
            B00000000,
            B00000100,
            B00001100,
            B00000100,
            B00000100,
            B00000100,
            B01001110,
            B00000000
            },
 // NULL
            {
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000
            },
 // 한글 '디'를 이진수로 배열 선언
            {
            B00000000,
            B00000010,
            B01111010,
            B01000010,
            B01000010,
            B01111010,
            B00000010,
            B00000000
            },
 // 한글 '바'를 이진수로 배열 선언
            {
            B00000000,
            B00000010,
            B01001010,
            B01111011,
            B01001010,
            B01111010,
            B00000010,
            B00000000
            },
 // 한글 '이'를 이진수로 배열 선언
            {
            B00000000,
            B00000010,
            B00110010,
            B01001010,
            B01001010,
            B00110010,
            B00000010,
            B00000000
            },
 // 한글 '스'를 이진수로 배열 선언
            {
            B00000000,
            B00000000,
            B00001000,
            B00010100,
            B00100010,
            B00000000,
            B01111111,
            B00000000},
 // 한글 '마'를 이진수로 배열 선언
            {
            B00000000,
            B00000010,
            B01111010,
            B01001011,
            B01001010,
            B01111010,
            B00000010,
            B00000000
            },
 // 한글 '트'를 이진수로 배열 선언
            {
            B00000000,
            B00111100,
            B00100000,
            B00111100,
            B00100000,
            B00111100,
            B01111110,
            B00000000
            },
 // 하트 모양을 이진수 배열로 선언
            {
            B00000000,
            B01100110,
            B11111111,
            B11111111,
            B11111111,
            B01111110,
            B00111100,
            B00011000
            },
 // NULL
            {
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000
            },
 // NULL
            {
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000
            },
 // NULL
            {
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000
            },
 // NULL
            {
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000,
            B00000000
            }
};
// 초기화 세팅
void setup()
{
for(int num=0; num<4; num++) // 매트릭스 0번부터 3번까지 세팅
 {
  lc.shutdown(num,false); // 0~3번까지 매트릭스 절전모드 해제
  lc.setIntensity(num,8); // 0~3번까지 매트릭스의 밝기 8로 선언, 0~15까지 가능
  lc.clearDisplay(num); // 0~3번까지 매트릭스 led를 초기화
 }
}
void loop()
{
 // 데이터 처리를 위해 buffer1 배열 선언
 // 모듈 4개 + 데이터처리 변수 1개
 byte buffer1[4+1][8];
 
 // 버퍼값을 0으로 초기화 작업
 for (int i = 0; i < 4; i++)
 {
   for (int j = 0; j < 8; j++)
   {
     buffer1[i][j] = B00000000;
   }
 }
 // 문자 시프트 작업
 for (int i = 0; i < 15; i++) // 전체 글자수 만큼 반복
 {
   // memcpy 함수를 사용해서 데이터를 버퍼로 옮김
   // memcpy(destination, source, size)
   // memcpy(목적지 주소값, 원본 주소값, 데이터크기)
   memcpy(&buffer1[4], &data[i], sizeof(data[i]));
   
   for (int j = 0; j < 8; j++) // 한 글자는 8열이므로, 글자당 8번 수행
   {
     for (int k = 0; k < 8; k++) // 한 글자는 8행이므로, 글자당 8번 수행
     {
       // 비트 시프트로 왼쪽으로 한칸씩 시프트
       // 비트 시프트로 첫번째 열의 데이터가 오른쪽으로 7칸 시프트
       // 비트 OR 연산자(|)로 두 데이터를 합침
       buffer1[0][k] = (buffer1[0][k] << 1) | (buffer1[1][k] >> 7);
       buffer1[1][k] = (buffer1[1][k] << 1) | (buffer1[2][k] >> 7);
       buffer1[2][k] = (buffer1[2][k] << 1) | (buffer1[3][k] >> 7);
       buffer1[3][k] = (buffer1[3][k] << 1) | (buffer1[4][k] >> 7);
       buffer1[4][k] = (buffer1[4][k] << 1);
     }
     // 출력
     for (int i = 0; i < 8; i++)
     {
       // lc.setRow 함수는 행(Row) 기준으로 도트매트릭스를 제어
       // lc.setRow(matrix_number,Row,value)
       // lc.setRow(출력 매트릭스 번호, 행, 출력값)
       lc.setRow(0, i, buffer1[0][i]);
       lc.setRow(1, i, buffer1[1][i]);
       lc.setRow(2, i, buffer1[2][i]);
       lc.setRow(3, i, buffer1[3][i]);
     }
     delay(10); // 시프트 속도 10ms
   }
 }
 delay(1000);
}


위 예제에서 사용한 라이브러리는 
아래 링크에서 다운받을 수 있습니다.



8x32 도트 매트릭스 제품에 따라서 위 소스코드대로 안되고
좌우가 뒤집혀서 나오는 경우가 있습니다.

이럴 경우 소스코드에서 출력 부분을 순서를 바꾸시기 바랍니다.

1
2
3
4
5
6
7
8
9
10
11
      // 출력 
      for (int i = 0; i < 8; i++
      {
        // lc.setRow 함수는 행(Row) 기준으로 도트매트릭스를 제어
        // lc.setRow(matrix_number,Row,value)
        // lc.setRow(출력 매트릭스 번호, 행, 출력값)
        lc.setRow(0, i, buffer1[3][i]);
        lc.setRow(1, i, buffer1[2][i]);
        lc.setRow(2, i, buffer1[1][i]);
        lc.setRow(3, i, buffer1[0][i]);
}
      

8x32 도트 매트릭스는 아래링크에서 구매하실 수 있습니다.


감사합니다.


글 작성 참고 사이트 

댓글 쓰기

0 댓글