오늘은 LCD KEYPAD 모듈 동작에 대해서 알아보도록 하겠습니다.
원래는 LCD를 먼저 진행했어야 했는데 어떻게 하다보니 이제서야 진행하네요.
아무래도 처음 진행하는 것이다보니 조금 사용하기 쉬운 쉴드 모듈로 진행해 보도록 하겠습니다.
20-1. LCD KEYPAD 모듈?
< 출처 : 구글 사진 > |
사진에 보고 있는 것이 LCD KEYPAD 모듈입니다. DFROBOT에서 만든 것인데요~ 이 쉴드의 장점은 LCD와 키패드가 일체형으로 되어 있다는 점 입니다. 그리고 KEY 입력의 경우 저항을 이용한 좋은 아이디어 회로로 아두이노의 ADC 한포트만을 이용해서 입력 받는다는 것이 장점이 되겠네요!
LCD는 CLCD라고 해서 문자를 출력할 수 있는 LCD가 달려있는데요. 줄여서 CLCD라고 부릅니다. 이 LCD의 장점은 사용하는 문자를 미리 저장해 놓고 주소값만을 읽어서 쉽게 문자를 출력할 수 있다는 점이 장점이 되겠네요! 다른 일반 LCD 같은 경우 하나하나 정확한 위치에 점을 찍어서 문자를 표시하는 것인데 CLCD는 간편하게 주소값만을 불러오면 되죠. 단점은 CLCD는 내가 원하는 그림이나 문자를 표시할 수 없고 저장된 것만 이용할 수 있습니다. 다른 LCD는 원하는 대로 문자나 그림을 표시할 수 있죠!
KEYPAD 같은 경우에는 특별한게 없으니 여기서는 넘어가고 회로에서 신기한 회로를 보도록 하겠습니다.
20-2. 회로도
< 출처 : www.dfrobot.com > |
회로도 입니다~ 잘 안보이시죠~? ㅎㅎ www.dfrobot.com 으로 가시면 회로도를 크게 보실 수 있습니다.
중요한 부분이 회로의 오른쪽 부분이구요! 오른쪽 위부분이 CLCD 회로! 아래가 KEYPAD 회로가 되겠네요~
블로그에서 잘 안보이지만 www.dfrobot.com 가셔서 회로도를 받으셨다는 가정으로 설명 드릴께요~ ㅎㅎ KEY를 여러개 연결하고 가운데 각각 저항을 병렬로 연결해서 키가 눌릴때마다 아두이노의 ADC핀으로 각각 다른 전압값이 입력되게 됩니다~ ㅎㅎ
그것을 이용해서 여러가지 키를 입력 받게 되는 것이죠. 간단하죠~? 이전에 한번 설명 드렸던 '전압분배법칙' 을 응용한 회로라고 보시면 될 것 같네요~ ㅎㅎ
그럼 바로 펌웨어를 짜보도록 할까요~?
20-3. 펌웨어
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
// read the buttons
int read_LCD_buttons()
{
adc_key_in = analogRead(0); // read the value from the sensor
// my buttons when read are centered at these valies: 0, 144, 329, 504, 741
// we add approx 50 to those values and check to see if we are close
if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
// For V1.1 us this threshold
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 250) return btnUP;
if (adc_key_in < 450) return btnDOWN;
if (adc_key_in < 650) return btnLEFT;
if (adc_key_in < 850) return btnSELECT;
// For V1.0 comment the other threshold and use the one below:
/*
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 195) return btnUP;
if (adc_key_in < 380) return btnDOWN;
if (adc_key_in < 555) return btnLEFT;
if (adc_key_in < 790) return btnSELECT;
*/
return btnNONE; // when all others fail, return this...
}
void setup()
{
lcd.begin(16, 2); // start the library
}
void loop()
{
lcd.setCursor(0, 0);
lcd.print("Hello Maduinos!!"); // print a simple message
lcd.setCursor(0, 1); // move to the begining of the second line
lcd_key = read_LCD_buttons(); // read the buttons
switch (lcd_key) // depending on which button was pushed, we perform an action
{
case btnRIGHT:
{
lcd.print("3+7 = ");
lcd.print(3 + 7);
break;
}
case btnLEFT:
{
lcd.print("LEFT ");
break;
}
case btnUP:
{
lcd.print("UP ");
break;
}
case btnDOWN:
{
lcd.print("DOWN ");
break;
}
case btnSELECT:
{
lcd.print("SELECT");
break;
}
case btnNONE:
{
lcd.print("NONE ");
break;
}
}
delay(100);
lcd.clear();
}
역시나 펌웨어도 DFROBOT 홈페이지에서 퍼왔습니다. 제가 조금 수정하긴 했지만 바탕은 똑같으니 여기까지 따라오셨던 어려분 모두 잘 하셨으리라 믿습니다~
다음주는 개인적으로 여행을 떠나 방송을 쉴 것 같구요!
다다음주에는 릴레이와 조이스틱을 준비해보도록 하겠습니다.
이제 슬슬 중급강좌도 끝나가네요~ >.< 고급 강좌에서는 지금까지 다루었던 것들을 응용하고 조금 난이도 있는 과정을 진행해 보려고 합니다.
개구리가 멀리 뛰기위해 움츠리는 것처럼!! ㅎㅎ 힘들어서 끝까지 가봐요!~ >.<
그럼 다음주에 뵈요~~
11 댓글
앗 이건 들었어야 하는데 주말에 시간이 요즘 안나네요 ㅎㅎㅎ
답글삭제ㅎㅎ ㅠ 저도 요즘 정신없네요 ㅎㅎ 강좌를 막 쉬고 있어요 ㅎㅎ
삭제앗 드론 1팀...저도 레이싱 조립해서 날리고는 있지만 ㅋㅋ
삭제괌에서 4/10 하프 마라톤(1233번) 3:10:05초 뛰셨네요 대단합니다..
삭제아쉽게도 여기는 사진을 못 올리는 군요 ㅎㅎ 짝짝짝...
ㅋㅋ 드론1팀 이였습니다~ .. 이번 마라톤은 망했어요 ㅠㅠ 다음부터 해외 마라톤은.. 10키로만 하는걸로.. ㅎㅎㅎㅎ 그..그런데 어떻게 아셨어요!? ㅋㅋ
삭제괌 마라톤 치니 서이트가 뜨고 명단 검색이 있길래 하프 뛰신다고 해서 찾아봤죠 ㅋㅋ
삭제혹시 저 lcd키패드 아랫부분 키옆부분 Vin 부분에 12v 전원연결해서 사용해도 되나요?
답글삭제안녕하세요~ 매드입니다.
삭제말씀하신 vin 에는 12v 연결 가능합니다.
아두이노에서 발열은 조금 나실꺼에요^^
감사합니다~
아 감사합니다 ㅎㅎ 되네요
삭제그리구 한가지더 물어보려고하는데요 키패드를 설정온도로 변경했는데 올리고 내리고 할수있게요
근데 이게 꾹눌러야 바뀌더군요 한번 누를때마다 바뀌는걸원햇는데 이거는 어떻게해야하나요??
이거는 코드 상황에 따라 다를 수 있겠네요. 키패드 인식하는 위로 delay 구문이 없어야됩니다~~
삭제키패드 읽는 Adc 동작을 타이머로 동작하게 한번 해보면 될것 같아요~
아하 감사합니다 ㅋㅋ 한번해보고 다시 글올리겟습니다 ㅎ
삭제