이번 강좌에서는 LCD Keypad Shield 를 사용해 보겠습니다.
갈릴레오(Galileo) 보드에는 문자를 출력 할 수 있는 장치가 없습니다.
문자를 출력하기 위해서는 외부에 LCD와 같은 Display 장치를 연결해야 합니다.
본 강좌에서는 16x2 LCD와 Key 를 가지고 있는 LCD Keypad Shield 를 이용해서
문자 출력과 Key 입력을 받아 보겠습니다.
본 강좌에서 사용하는 LCD Keypad Shield 는 아래 사진의 제품이며,
영문과 숫자만 표시 가능합니다.
한글 출력을 위해서는 차후 강좌의 Display 장치를 이용하시길 바랍니다.
LCD Keypad Shield 제품의 뒷면을 보면 많은 연결 단자가 있지만,
이를 모두 사용하는 것은 아니며, 갈릴레오(Galileo) 의 Aduino 호환 단자에
맞도록 만들어져 아래 사진과 같이 단자에 맞게 장착하시면 연결을
완성할 수 있습니다.
하지만 갈릴레오(Galileo) 보드와 연결은 쉽지만 나머지 단자를 사용할 수 없게 됩니다.
별도의 빵판 보드를 이용하실 경우, 아래의 단자만 연결해 주면 됩니다.
Analog A0 단자
Digital 4번 단자
Digital 5번 단자
Digital 6번 단자
Digital 7번 단자
Digital 8번 단자
Digital 9번 단자
Digital 10번 단자
각 단자의 위치에 맞게 LCD Keypad Shield 의 단자와 연결해 주면 됩니다.
Analog A0 단자로 Key 입력을 받으며, Digital 10 번 단자로 LCD의
밝기(Backlight) 를 조절할 수 있으며, Digital 4 ~ 9 번 단자를 이용해서
LCD에 글자를 출력 하게 됩니다.
5V와 GND 단자도 연결 주셔야 합니다.
연결을 완료 후에, 갈릴레오(Galileo) 보드에 전원을 넣으면
아래 사진과 같이 LCD의 켜지게 됩니다.
하드웨어 연결이 완료 되었다면 이제 글자를 출력해 보겠습니다.
---------------------------------------------------------
Freescale i.MX6 CPU 모듈 판매 중!
Android 지원
Embedded Compact 7 지원
Embedded Compact 2013 지원
Linux 지원
---------------------------------------------------------
2. LCD Keypad Shield에 문자 출력 및 Key 입력 프로그램
갈릴레오(Galileo) 보드를 이용해 LCD에 문자열을 출력하려면
LCD를 제어해야 합니다.
LCD 제어 하는 함수를 구현한 코드가 있으므로 그것을 이용하도록
하겠습니다.
Aduino 용 소스 코드 이지만 Windows OS를 사용하는
갈릴레오(Galileo) 보드에서도 이용이 가능합니다.
아래 링크에서 LCD 제어 관련 파일을 다운 받습니다.
https://github.com/arduino/Arduino/tree/master/libraries/LiquidCrystal
LiquidCrystal.cpp 파일과 LiquidCrystal.h 파일을 다운 받습니다.
다운 받은 두 파일을 Visual Studio 2013 의 Project 폴더로 복사 한 후,
Project - Add Existing Items... 메뉴를 선택해서
Project 에 추가 시켜 줍니다.
이제 소스 코드에서 LiquidCrystal.h 파일을 include 시킨 후에
LCD에 글자를 출력 시킬 수 있습니다.
그리고 Analog A0 단자를 통해서 Key 값을 입력 받을 수 있는데
입력되는 전압 레벨을 이용해서 어떤 Key 인지 구분 합니다.
analogRead 함수를 이용해서 값을 읽어와서 계산한 후
Key 값을 찾을 수 있습니다.
자세한 정보는 제품 구입처에 문의 하시거나 datasheet를 참조 하시길 바랍니다.
강좌에서는 GetKey 라는 함수를 만들어서 이용하였으며,
함수 내용은 다음과 같습니다.
// 5개의 Key를 사용합니다.
#define NUMKEY 5
// 아래의 값은 Analog A0 단자의 입력 값을 Key 값으로 변환하기 위한 기준 값입니다.
// 제품마다 다를 수 있으니, 로그 값으로 확인한 후 수정해서 사용해야 합니다.
int analogvalue[NUMKEY] = { 10, 120, 250, 380, 560};
int GetKey(unsigned int in)
{
int i;
for (i = 0; i <NUMKEY; i++) // 반복하면서 Key 를 찾습니다.
{
if (in< analogvalue[i])
{
return i;
}
}
if (i >= NUMKEY) return -1;
}
Analog A0 단자의 입력 값에 따라 0 ~ 4를 반환하게 되며, 눌려진 Key 가 없을 경우,
-1을 반환하게 됩니다.
강좌에서 사용한 LCD Keypad Shield 의 경우, Key 값과 기능은 다음과 같습니다.
Key 0 번 - Right
Key 1 번 - Up
Key 2 번 - Down
Key 3 번 - Left
Key 4 번 - Select
여기까지 Key 입력에 대해 알아 보았고, 다음으로 LCD에 글자 출력 하는 것에
대해서 알아 보겠습니다.
LCD에 글자를 출력 하기 위해서는 아래 코드와 같이
LCD에 연결된 단자들을 인자로 넘겨 주고 LiquidCrystal 객체를
만들어야 합니다.
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // LCD 제어를 위한 단자의 번호를 넘겨 줍니다.
lcd 변수를 이용해서 LCD에 글자 출력 및 Cursor 를 제어할 수 있습니다.
print 함수를 이용해서 글자를 출력 할 수 있으며,
begin 함수를 이용해서 LCD의 Line 수와 글자 수를 설정할 수 있습니다.
또한 setCursor 함수 이용해서 Cursor 를 제어할 수 있습니다.
LiquidCrystal 클래스에는 LCD 제어를 위한 다양한 함수를 제공하고 있으므로
자세한 것은 LiquidCrystal.cpp 파일을 참조 하시길 바랍니다.
여기서는 소스코드를 통해서 간단히 알아 보도록 하겠습니다.
마지막으로 LCD의 밝기 조절은 Digital 10번 단자로 가능합니다.
analogWrite(10, 밝기값) 와 같이 작성하면 밝기도 제어 가능합니다.
밝기값은 0 ~ 255 사이의 값이며, 값이 클수록 밝아 집니다.
이제 전체 코드를 살펴 보겠습니다.
_tmain 함수에서는 RunArduinoSketch()를 호출하고 있고,
setup 함수에서는 lcd를 16x2(16글자, 2줄)로 초기화 하고
print 함수를 이용해서 문자를 출력하고 있습니다.
또한 LCD의 밝기를 250으로 설정하고 있습니다.
loop 함수 에서는 GetKey 값을 이용해서 Analog A0 단자에서
Key 값을 받고 이전 Key 와 다르다면 LCD 의 2번째 줄에
Key 값을 출력하고 있습니다.
프로그램을 실행하고 Key 를 누르게 되면
눌려진 Key 값이 LCD에 아래 사진과 같이 출력됨을 확인 할 수 있습니다.
LiquidCrystal 클래스를 이용하면 LCD에 문자 출력은 쉽게 할 수 있습니다.
아래는 전체 소스 코드 입니다. 주석을 참고 하시길 바랍니다.
//----------------------------------------------------
#include "stdafx.h"
#include "arduino.h"
#include "LiquidCrystal.h" // LCD를 제어를 위한 LiquidCrystal 클래스 header 파일
// Digital 4번 ~ 9번 사용
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // LiquidCrystal 클래스 변수
#define NUMKEY 5 // Key 수
int analogvalue[NUMKEY] = { 10, 120, 250, 380, 560}; // Key 구분을 위한 기준 값들
int curkey = -1; // 현재 Key 값
int oldkey = -1; // 이전 Key 값
int KeyIn = 0; // Analog A0 단자 이용
int _tmain(int argc, _TCHAR* argv[])
{
return RunArduinoSketch();
}
void setup() {
lcd.begin(16, 2); //16x2 로 LCD 초기화
lcd.print("Test by kms"); // 문자열 출력
analogWrite(10, 250); // LCD 밝기 조절
}
int GetKey(unsigned int in) // Analog A0 단자의 입력 값으로 Key 를 구분
{
int i;
for (i = 0; i <NUMKEY; i++)
{
if (in< analogvalue[i])
{
return i;
}
}
if (i >= NUMKEY) return -1;
}
void loop()
{
curkey = GetKey(analogRead(KeyIn)); // Key 입력 확인
if (curkey != oldkey) // 이전 Key 다른 Key 일 때,
{
delay(50);
curkey = GetKey(analogRead(KeyIn)); // 다시 Key 입력 확인
if (curkey != oldkey) //
{
oldkey = curkey; // Key 값 저장
if (curkey>=0){ // 유효한 Key 라고 하면
lcd.setCursor(0, 1); // LCD의 Cursor 를 2번째 줄 1번째 칸으로 이동한다.
lcd.print("Key "); // 문자열 출력
lcd.print(curkey); // 정수값 출력 print 함수는 overliding 되어 있다.
}
}
}
}
//----------------------------------------------------
위 소스 코드는 Linux OS를 사용하는 갈릴레오(Galileo) 보드와
Aduino 보드에서도 사용이 가능합니다.
이번 강좌에서는 LCD Key Shield를 활용해 보았습니다.
각종 정보 또는 디버깅 용도로 LCD를 활용하시면 좋을 듯 합니다.
LCD 제어를 위한 클래스도 잘 만들어져 있어서 쉽게 이용할 수 있을 듯 합니다.
궁금하신 사항이 있으시거나 갈릴레오(Galileo) 보드 활용 아이디어가 있으시면
연락 주시길 바랍니다.
강좌에 도움을 주신 DY님께 감사 드립니다.
그럼 다음 강좌에서 뵙겠습니다.