반응형
아두이노 키트 중에 가로 세로 8개씩 총 64개의 LED가 박혀있는 부품이 있다. 64개의 Dot 이니 문자 중 거의 표현하지 못 할 문자는 없는 것 같다. 오늘은 이것을 컨트롤 해 보려고 한다.
위와 같이 전면에는 8x8 의 LED가 박혀있으며 후면에는 상/하로 8개씩 총 16개의 핀이 있다.
총 16개를 디지컬 단자에 연결해야 하는데 아날로그 단자의 A0~A5핀도 디지털 핀(14~19번)으로 사용할 수 있으니 이를 활용하면 16개의 핀을 모두 아두이노 우노에 연결이 가능하다.
데이터시트 상의 부품의 구조는 다음과 같다..
데이터시트:
아두이노와의 연결은 위와 같이 했다. 모자란 디지털 단자는 아날로그핀 A0~A3 까지 사용한다.
Fritzing 파일:
##소스##
HELLOWORLD 를 스크롤하여 표시한다. FrequencyTimer2 라이브러리가 필요하다.
FrequencyTimer2 라이브러리:
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 { \ {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, 0, 0, 0, 0, 0, 0} \ } #define H { \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 1, 1, 1, 1, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0} \ } #define E { \ {0, 1, 1, 1, 1, 1, 1, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 1, 1, 1, 1, 1, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 1, 1, 1, 1, 1, 0} \ } #define L { \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 1, 1, 1, 1, 1, 0} \ } #define O { \ {0, 0, 0, 1, 1, 0, 0, 0}, \ {0, 0, 1, 0, 0, 1, 0, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 0, 1, 0, 0, 1, 0, 0}, \ {0, 0, 0, 1, 1, 0, 0, 0} \ } #define W { \ {1, 0, 0, 0, 0, 0, 0, 1},\ {1, 0, 0, 0, 0, 0, 1, 0},\ {1, 0, 0, 0, 0, 0, 1, 0},\ {0, 1, 0, 1, 0, 0, 1, 0},\ {0, 1, 0, 1, 0, 1, 0, 0},\ {0, 1, 0, 1, 0, 1, 0, 0},\ {0, 0, 1, 1, 0, 1, 0, 0},\ {0, 0, 0, 1, 1, 0, 0, 0},\ } #define R { \ {1, 1, 1, 1, 1, 0, 0, 0},\ {1, 0, 0, 0, 1, 0, 0, 0},\ {1, 0, 0, 0, 1, 0, 0, 0},\ {1, 1, 1, 1, 1, 0, 0, 0},\ {1, 0, 1, 0, 0, 0, 0, 0},\ {1, 0, 0, 1, 0, 0, 0, 0},\ {1, 0, 0, 0, 1, 0, 0, 0},\ {1, 0, 0, 0, 0, 1, 0, 0},\ } #define D { \ {1, 1, 1, 1, 1, 0, 0, 0},\ {1, 1, 0, 0, 1, 1, 0, 0},\ {1, 1, 0, 0, 0, 1, 1, 0},\ {1, 1, 0, 0, 0, 1, 1, 0},\ {1, 1, 0, 0, 0, 1, 1, 0},\ {1, 1, 0, 0, 0, 1, 1, 0},\ {1, 1, 0, 0, 1, 1, 0, 0},\ {1, 1, 1, 1, 1, 0, 0, 0},\ } 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]= {-1, 5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9,8, 7, 6}; // 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 문자, 아이콘 만들기 프로그램 다운로드:
반응형
'아두이노' 카테고리의 다른 글
[아두이노] 시리얼 모니터의 내용을 텍스트파일로 저장하기 (3) | 2015.09.19 |
---|---|
[아두이노] 7 Segment LED(4 Digit LED, FND)의 사용 (4) | 2015.09.18 |
[아두이노] RFID의 이용 (RFID-RC522 모듈 이용) (7) | 2015.09.14 |
[아두이노] 워터센서(Water Sensor)를 이용한 물감지, 수위감지 (13) | 2015.09.08 |
[아두이노] 릴레이(Relay)를 이용하여 220V 전원을 제어해보자 (51) | 2015.09.07 |