ISSAC.Min

[Arduino] 아두이노 푸시 버튼, 매트릭스 모듈, 이진수 LED 예제 본문

STUDY/Arduino

[Arduino] 아두이노 푸시 버튼, 매트릭스 모듈, 이진수 LED 예제

ISSAC.M 2020. 11. 24. 16:13
반응형

푸시 버튼이란?

아두이노에서 대표적인 입력장치로는 컨트롤러 모듈, 푸시버튼 등이 있습니다.

푸시버튼은 버튼을 누르는 동안 HIGH 값을 가지고 땔 때 LOW 값을 갖습니다. 또한 일반적으로 푸시버튼은 4개의 단자를 가지고 있으며 하나의 단자가 끊어지더라도 다른 방향의 단자를 통하여 컨트롤 할 수 있습니다. 

 

[그림 1 푸시 버튼]

 

[그림 2] 푸시버튼
[그림 3] 푸시버튼 구성요소

 

[그림 3]에서 확인 할 수 있듯이 1번 3번, 2번 4번이 연결되어 있으므로 만약 4번이 단선되더라도 2번 라인을 통해서 연결이 가능하다.

 

 

매트릭스 모듈이란?

 아두이노에서의 대표적인 입력장치인 푸시버튼은 단일 입력을 받고 있지만 여러가지 입력을 간단한 코드로 제어할 수 있는 매트릭스 모듈도 있다. 하지만 사용방법 및 역할 등에 다른 점은 존재하지 않는다.

 

[그림 4] 버튼 매트릭스 모듈 

 

 일반 단일 푸시버튼과 같이 입력을 위한 Digital Pin이 꼭 하나씩 존재했지만 매트릭스형 모듈 같은 경우 더 적은 핀으로 여러가지 입력을 받을 수 있다. 그럴수 있는 이유는 매트릭스의 구조 때문인데 [그림 4]의 4 by 4 매트릭스 모듈을 예로 들면 아래와 같이 이해할 수 있다.

 

행/열 1 2 3 4
a a1 a2 a3 a4
b b1 b2 b3 b4
c c1 c2 c3 c4
d d1 d2 d3 d4

 

 위의 표에서 행 a, b, c, d / 열 1, 2, 3, 4는 입력을 받는 핀이라고 생각하면 된다. 그렇게 된다면 행과 열의 데이터 정보에 따라 총 16개의 서로 다른 입력 데이터가 가능하다. 그러므로 단지 핀 8개로 16개의 입력을 받을 수 있는 것이다.

 

 

[예제 1] 푸시버튼을 이용하여 LED를 켜보자!!

 푸시버튼의 첫 예제로서 간단히 푸시버튼을 이용하여 LED를 켜보도록하자. 준비물은 다음과 같다.

 

준비물

 

부품명 부품사진 개수
아두이노 우노 보드
1
푸시 버튼
1
LED(발광 다이오드)
1
10k 옴 저항
1
점퍼선(수 - 수)
6

 

아두이노 구성

[그림 5] 아두이노 구성

 

아두이노 코딩

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
int state = 0;
 
void setup() {
  pinMode(4, OUTPUT);
  pinMode(3, INPUT);
}
void loop() {
  int i = digitalRead(3);
  
  if(i == 1){
    if(state == 0){
      state = 1;
    }
    else if(state == 1){
      state = 0;
    }
  }
 
  if(state == 0){
    digitalWrite(4, LOW);
  }
  else if(state == 1){
    digitalWrite(4, HIGH);
  }
}
cs

위의 코드는 버튼을 누르고 있을때 LED가 켜지는 것이 아닌 한 번 누르면 켜지고 한 번 더 누르면 꺼지는 기능을 한다.

 

1번줄 state는 LED를 켜고 끄기 위한 상태 변수이다.

state = 0일땐 꺼지고 state = 1일땐 켜진다.

 

아두이노 업로드

 

 

 

[예제 2] 매트릭스 모듈을 이용하여 LED를 켜보자!!

 매트릭스 모듈은 키패드 모듈이라고도 부르며 다양한 싸이즈와 형태를 가지고 있다. 오늘 사용할 매트릭스 모듈은 4 x 4 매트릭스 모듈이며 제일 많이 사용하는 종류이다.

 

 이번에 사용할 매트릭스 모듈은 그전에 사용했던 푸시버튼이나 LED 등과 다르게 Keypad 라이브러리가 필요한데 또 싸이트에 들어가서 다운받고 힘들게 찾아야하는 것이 아닌 Arduino IDE의 라이브러리 관리자를 통해서 다운받을 수 있다.

 

툴 > 라이브러리 관리... > 검색창 keypad 검색 > Keypad(by Mark Stanley, Alexander Breving)을 설치

 

 

설치가 완료되었다면 코딩하기 전 구성을 보도록하겠다. 그냥 LED를 켜면 재미없고 사실 매트릭스 모듈의 핀이 8개이기 때문에 우노보드의 디지털 핀을 사용하기엔 16개의 LED를 모두 사용하기엔 좀 복잡해진다. 그러므로 이진법수를 나타낼수있도록 4개의 LED를 사용해서 16개의 수를 나타내보자.

 

준비물은 아래쪽에!


준비물

 

부품명 부품사진 개수
아두이노 우노 보드
1
발광 다이오드
4
4 x 4 매트릭스 모듈 
 
점퍼선(수 - 수)
8
점퍼선(암 - 수)
8

 

아두이노 구성

추가적으로 말할게 있다면 매트릭스 제품마다 C1 ~ C4, R1 ~ R4의 Pin의 배열이 다르다. 지금 사용하고 있는 모듈은 에듀이노에서 구입한 제품이며 아래에 링크를 담아놓겠다. 물론 구입할때 설명서에 핀에 대한 정보가 적혀있으니 꼭 참고하고 사용하길 바란다.

eduino.kr/product/detail.html?product_no=123&cate_no=55&display_group=1

 

핀의 맨 위부터 R1 R2 R3 R4 C1 C2 C3 C4 이다. 제품마다 다르니 꼭 확인하고 사용하길 바란다.

 

아두이노 코딩 및 업로드

Switch 문을 사용하면 더 깔끔하겠다. 하지만 난 귀찮으니 하지 않는다. 

 

"CTRL + C, CTRL + V는 최대의 미덕"

 

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
#include <Keypad.h>
 
const byte row = 4;               // 행(row) 개수
const byte column = 4;            // 열(columns) 개수
char keys[row][column] = {        // 행, 열 문자열을 지정합니다.
  {'4','8','C','G'},              
  {'3','7','B','F'},
  {'2','6','A','E'},
  {'1','5','9','D'}
};
 
byte rowPins[row] = {9876};      // R1, R2, R3, R4 단자가 연결된 아두이노 핀 번호
byte colPins[column] = {5432};   // C1, C2, C3, C4 단자가 연결된 아두이노 핀 번호
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, row, column );
 
void setup() {
  Serial.begin(9600);
 
  pinMode(10, OUTPUT);   // 1자리 수
  pinMode(11, OUTPUT);   // 2^1자리 수
  pinMode(12, OUTPUT);   // 2^2자리 수
  pinMode(13, OUTPUT);   // 2^3자리 수 
}
  
void loop() {
  char key = keypad.getKey();
  if (key){
    if (key == '1'){
      Serial.println(key);
      digitalWrite(10, HIGH);
      digitalWrite(11, LOW);
      digitalWrite(12, LOW);
      digitalWrite(13, LOW);
      delay(100);
    }else if(key == '2'){
      digitalWrite(10, LOW);
      digitalWrite(11, HIGH);
      digitalWrite(12, LOW);
      digitalWrite(13, LOW);
      delay(100);
    }else if(key == '3'){
      digitalWrite(10, HIGH);
      digitalWrite(11, HIGH);
      digitalWrite(12, LOW);
      digitalWrite(13, LOW);    
      delay(100);
    }else if(key == '4'){
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      digitalWrite(12, HIGH);
      digitalWrite(13, LOW);    
      delay(100);
    }else if(key == '5'){
      digitalWrite(10, HIGH);
      digitalWrite(11, LOW);
      digitalWrite(12, HIGH);
      digitalWrite(13, LOW);   
      delay(100); 
    }else if(key == '6'){
      digitalWrite(10, LOW);
      digitalWrite(11, HIGH);
      digitalWrite(12, HIGH);
      digitalWrite(13, LOW);    
      delay(100);
    }else if(key == '7'){
      digitalWrite(10, HIGH);
      digitalWrite(11, HIGH);
      digitalWrite(12, HIGH);
      digitalWrite(13, LOW); 
      delay(100);   
    }else if(key == '8'){
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      digitalWrite(12, LOW);
      digitalWrite(13, HIGH); 
      delay(100);   
    }else if(key == '9'){
      digitalWrite(10, HIGH);
      digitalWrite(11, LOW);
      digitalWrite(12, LOW);
      digitalWrite(13, HIGH);    
      delay(100);
    }else if(key == 'A'){
      digitalWrite(10, LOW);
      digitalWrite(11, HIGH);
      digitalWrite(12, LOW);
      digitalWrite(13, HIGH);    
      delay(100);
    }else if(key == 'B'){
      digitalWrite(10, HIGH);
      digitalWrite(11, HIGH);
      digitalWrite(12, LOW);
      digitalWrite(13, HIGH);   
      delay(100); 
    }else if(key == 'C'){
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      digitalWrite(12, HIGH);
      digitalWrite(13, HIGH);  
      delay(100);  
    }else if(key == 'D'){
      digitalWrite(10, HIGH);
      digitalWrite(11, LOW);
      digitalWrite(12, HIGH);
      digitalWrite(13, HIGH);  
      delay(100);  
    }else if(key == 'E'){
      digitalWrite(10, LOW);
      digitalWrite(11, HIGH);
      digitalWrite(12, HIGH);
      digitalWrite(13, HIGH);  
      delay(100);  
    }else if(key == 'F'){
      digitalWrite(10, HIGH);
      digitalWrite(11, HIGH);
      digitalWrite(12, HIGH);
      digitalWrite(13, HIGH);  
      delay(100);  
    }else{
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      digitalWrite(12, LOW);
      digitalWrite(13, LOW);    
    }
  }
}
cs

 

 

 

 

반응형