본문 바로가기

아두이노우노 R4

만능 멤브레인 키패드 4X4-D 제어

반응형

 

 

보통 이런 키패드 스위치를 멤브레인 스위치라고 합니다. 

 

멤브레인 스위치는 얇은 플라스틱 막 세 장을 겹치고 구리로 패턴을 인쇄해서 접점(스위치)을 형성하는 기술로 만들어져 있습니다. 얇은 막의 형태이기 때문에 이것을 멤브레인 스위치라고 하며, 산업용 또는 가정용 전자기기에 적용되는 방식으로는 러버돔 방식, 열엠보 방식, 택트돔 내장방식 등으로 구성됩니다.

 

이렇게 제작된 멤브레인 스위치는 전자기기의 사용자 조작부에 양면테이프 등의 접착제로 부착하여 제품의 외관을 더욱 고급스럽고 미려하게 할 수 있으며, 제품을 보다 사용자 친화적으로 만들 수 있는 이점이 있습니다. 또한 제품을 대량으로 양산할 경우 조립과정이 비교적 간단하여 조립공수 또한 절감할 수 있는 효과를 가져올 수 있습니다. 

 

만능 멤브레인 키패드 4X4-D 제어

 

 

멤브레인 스위치에 대해 자세한 내용은 맨 아래의 링크를 참고하세요.

 

키패드 제어 방법입니다. 아래는 회로도입니다.

 

 

 

진짜로 간단하지요. 그냥 순서대로 0부터 7핀으로 아두이노에 그냥 Keypad를 붙이여 연결되어 버립니다. 하지만 그렇게 하지 않고 2번 핀부터 연결했습니다. 왜냐면 시리얼통신으로 그 결과를 출력하기 때문에 시리얼통신을 담당하는 0, 1핀 때문에 Keypad가 0, 1핀에 연결된 위치값이 가상시뮬레이터에서 작동을 하지 않습니다. 그래서 어쩔 수 없이 회로도 그림처럼 연결해야겠죠. 

 

이 부분에서 16 Keypad와 아두이노와 연결 핀 할당이 중요합니다. 다음 그림을 보면 

 

 

 

이렇게 연결되어 있습니다. 그러니 Row 핀과 컬럼 핀을 잘 할당해야 합니다.

 

아두이노 코드는 아래와 같습니다.

 

#include <Keypad.h>
 
const byte rows = 4; //four rows
const byte cols = 4; //four columns
 
byte rowPins[rows] = {9,8,7,6};
byte colPins[cols] = {5,4,3,2};
 
char keys[rows][cols] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
 
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);
 
void setup(){
  Serial.begin(9600);  
}
 
void loop(){
   
   char key = keypad.getKey();
 
   if (key != NO_KEY){      //키값이 눌렀는지 확인문
      Serial.println(key);
   }
}

 

 

아래는 16*2 캐릭터 LCD와 16 키패드를 조합한 회로와 코드입니다. 참고하세요.

 

 

 

동작 아두이노 코드

 

#include <LiquidCrystal.h>
#include <Keypad.h>
const byte rows = 4; //four rows
const byte cols = 4; //four columns
byte rowPins[rows] = {7, 6, 5, 4};
byte colPins[cols] = {3, 2, 1, 0};
char keys[rows][cols] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
//LiquidCrystal(rs, enable, d4, d5, d6, d7) 
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);

void setup(){
  lcd.begin(16,2);
  lcd.print("Pressed key:");
}
void loop(){

char key = keypad.getKey();
   if (key != NO_KEY){
      lcd.setCursor(13, 0);  
      lcd.print(key);
   }
}

 

 

코드 설명입니다. 

 

A라는 키를 누르면 LCD 16X2에 정상적으로 A값이 출력되는 예제입니다. 기본적 설계회로는 0~8핀은 키패드 핀값으로 정했고. LCD 16X2는 8~13번으로 몰아서 붙였습니다. 


LCD 16X2는 저항을 좀 밝게 하려고 가상시뮬레이터에서 보니깐 220옴 정도로 gnd에 연결했습니다. vcc 쪽 연결해도 상관없지만 이전 시간에 가변저항기에 부분에 저항을 붙이면 되겠죠. 실제론 LCD 16X2 제품의 데이터시트의 정보를 보고 정확히 잡아두는 게 좋겠죠.


#include
#include
const byte rows = 4; //four rows
const byte cols = 4; //four columns
byte rowPins[rows] = {7, 6, 5, 4};
byte colPins[cols] = {3, 2, 1, 0};
char keys[rows][cols] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};

LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);

 

LCD 16X2를 와 Keypad 라이브러리 파일을 인크루드 하고, 기본적으로 Keypad 객체변수를 선언하기 전에 들어갈 인자값을 세팅하는 과정이 필요합니다.


4x4 keypad 사용함으로 row과 col의 변수를 선언하고 row에 사용되는 핀과 col에 사용되는 핀값을 배열변수로 만들어 놓습니다.


그리고 각키들에 해당위치에 값들을 2차 배열로 만들어 놓습니다.


Keypad keypad = Keypad(makeKeymap(키판), 행핀들, 열핀들, 행수, 열수);


행과 열의 대한 정보를 keypad 객체변수를 선언할 때 인자값으로 다 던져줘야 합니다. 좀 귀찮아 보일지 모르지만, 실제로 라이브러리 함수 없이 직접 구현한다면 좀 복잡한 코딩을 해야 합니다. 그나마 이 정도도 양호하다고 생각하세요.


LiquidCrystal의 객체인 lcd의 핀인자 들은 코드와 그림에서 보는 것처럼 순차적으로 연결해 주면 됩니다.


void setup(){
lcd.begin(16,2);
lcd.print("Pressed key:");
}


lcd.setCursor(0, 0)을 붙여줘도 되지만 안 붙여줘도 자동으로 첫 줄에 출력되겠죠 문자열이 16x2은 두줄을 사용하는데 첫 줄에 자동으로 저 문자열일 출력됩니다.


void loop(){

char key = keypad.getKey();

if (key != NO_KEY){
lcd.setCursor(13, 0);
lcd.print(key);
}
}


이제 Keypad의 동작을 보면은 딱 한 줄로 끝나버리네요.

char key = keypad.getKey();


Keypad에서 getKey() 함수로 Keypad가 누러진 키값 즉 keys에 키판을 2차 배열로 만들었고 눌러진 위치값이 이 keys 2차 배열의 위치값을 반환하게 됩니다. Keypad 사용이 너무나 허무해지는 부분이지요. 뭔가 멋진 걸 사용했는데 라이브러리 함수로 딱 한 줄로 동작합니다.


출처에 Keypad의 또 다른 함수들이 있으니 가서 꼭 읽어주세요. 한 줄로 마무리하기엔 너무 그렇죠.


if문에 key!=NO_KEY 란 NO_KEY 값은 '0'로 즉 키가 눌러졌는가 안 눌러졌는가 체크하는 문입니다. 눌러졌을대 key값을 LCD 16X2로 출력하라는 문이죠.


만약 저 문장 없이 lcd.print(key)라고 눌러보세요. 쓰레기 값이 출력됩니다. 키가 눌러졌을 때에만 동작하라는 체크문이 넣은 이유를 알게 될 거예요.


딱 한 줄을 배우기 위해서 결과를 시리얼모니터로 출력하는 것보다 좀 그럴싸하게 LCD 16X2로 출력하는 게 더 뽐날것 같아서 이리 디자인했습니다. 실제 구현하실 때 LCD 16X2가 없는 분들은 저 부분을 시리얼통신으로 시리얼모니터로 결과를 출력하셔도 됩니다. 그건 출처에서 간단히 표현했네요.


마지막으로 여기서 끝나면 안 되고 더 확장해야 합니다. Keypad로 누른 게 LCD 16X2로 출력이 된다면 LCD 16X2 강좌 편에서 출력하는 함수들을 살펴보시고 한번 계산기를 구현해 보는 것도 공부에 많이 도움 될 거라 생각되네요. 

 

 

참고

멤브레인 스위치 보고서 : 멤브레인 스위치 알아보기 

멤브레인(membrane) 메탈돔 키패드, 스위치 

구매처 연결: 디바이스마트

 

온라인 가상 시뮬레이터

아두이노 공식 참고자료 - 키패드 함수 설명과 코드

LCD와 Keypad 자료

 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^