16x2 LCD에 한글 출력해보기

 

[컴퓨터월드] 아두이노는 이탈리어로 ‘친한 친구’라는 뜻을 가진 대표적인 오픈소스 하드웨어다. 딱딱하고 접근하기 힘들었던 임베디드 분야를 누구나 쉽게 접근할 수 있도록 만든 미니 기판이라 할 수 있다. 이번 강좌에 사용하는 아두이노 오렌지보드는 한국형 아두이노라 할 수 있다.

아두이노의 보급은 오픈소스 하드웨어의 확산을 불러일으켰고 메이커 문화의 확산에도 큰 기여를 했다. 최근에는 인텔, 마이크로소프트 등 대형 기업들도 이런 오픈소스 하드웨어시장에 뛰어들기 시작했다. 그 만큼 오픈소스 하드웨어 시장의 잠재력이 커졌다는 얘기이다.


16x2 LCD


16x2 LCD는 이전 튜토리얼에서 한 번 설명한 적이 있는 모듈이다. 16x2 LCD는 여러 종류의 LCD 중 사용법이 비교적 쉽다는 평가를 받고 있다. 기능이 단순하고 아두이노IDE에서 기본 라이브러리를 지원하기 때문에 초보자들이 비교적 쉽게 사용해 볼 수 있는 모듈이다.

하지만 화면이 작고 그래픽 출력을 지원하지 않는다는 단점이 있다. 그리고 다른 센서들에 비해 연결해야 할 선이 많다는 점도 단점으로 꼽힌다.

▲ 16x2 캐릭터 LCD 핀 구성


16x2LCD와 한글 출력

아두이노를 사용하는 LCD중에 한글을 지원하는 LCD는 거의 없다고 봐도 무방하다. 물론 아래 사진과 같이 국내에서 만든, 한글을 출력할 수 있는 한글LCD가 있기는 하다.(한글LCD 사용하기 - http://kocoafab.cc/tutorial/view/221) 하지만 16x2 LCD와 비교할 경우 인지도 면에서 많이 떨어진다.

▲ 한글 지원 LCD

아두이노가 한글을 지원하지 않는 이유는 아두이노 자체가 외국에서 만들어 졌다는 점 외에도 아스키코드 사용으로 인해 한글 지원이 어렵기 때문이다. 이러한 이유로 아두이노에서 사용하는 LCD에 한글을 표현하는 것은 일반적인 방법으로는 불가능하다.

여기에서 소개할 한글 표현 방법은 일반적인 방법은 아니다. 따라서 한글 출력 또한 자연스럽지 못하다. 하지만 문자를 표현하는 방법 중 이런 방법도 있다는 것을 알아둔다면 추후 다양한 프로젝트에 응용해 볼 수 있을 것이다.

 

필요한 부품 목록

 

▲ 필요한 부품 목록

 

 

하드웨어 연결하기

▲ 브레드 보드

 

▲ 전자 회로도

 

소스코드

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// 문자 "코"
byte SpecialChar1[8] = {
B00000,
B11111,
B00001,
B11111,
B00001,
B00101,
B00100,
B11111
};

// 문자 "ㅇ"
byte SpecialChar2[8] = {
B00000,
B00110,
B01001,
B01001,
B01001,
B01001,
B00110,
B00000
};

// 문자 "ㅏ"
byte SpecialChar3[8] = {
B00000,
B10000,
B10000,
B11100,
B10000,
B10000,
B10000,
B10000
};

// 문자 "♡"
byte SpecialChar4[8] = {
B00000,
B01010,
B10101,
B10001,
B10001,
B01010,
B00100,
B00000
};

void setup() {
// 문자 저장
lcd.createChar(0, SpecialChar1);
lcd.createChar(1, SpecialChar1);
lcd.createChar(2, SpecialChar2);
lcd.createChar(3, SpecialChar3);
lcd.createChar(4, SpecialChar4);
lcd.begin(16, 2);
lcd.setCursor(4,0);

// 저장해 놓은 문자 출력("코코ㅇㅏ")
for (int i = 0 ; i < 4 ; i++) {
lcd.write(byte(i));
}

// 영문은 그냥 출력
lcd.print("FAB");

//저장해 놓은 문자 출력("♡")
lcd.write(byte(4));
}

void loop() {


위의 코드를 실행시키면 아래와 같은 화면이 출력되는 것을 볼 수 있다.

▲ 화면 출력 모습


사진을 자세히 보면 알겠지만 문자가 출력되는 각 공간은 또 다른 작은 사각형 여러 개로 이루어져 있다. 각 공간은 가로 5개, 세로 8개 총 40개의 사각형으로 이루어져 있는데 그 사각형 하나씩을 픽셀처럼 이용하면 한글 표현이 가능하다.

아래 사진을 보면 스마일을 표현하기 위해 각 픽셀을 2진화해 코드로 변환하는 예제를 이해할 수 있다. 불이 들어오는 공간을 1, 빈 공간을 0으로 표현해 5 x 8의 배열로 표현한다.

▲ 픽셀 변환 예제


간단한 배열은 머릿속으로 생각해 그릴 수 있지만 복잡하고 여러 개일 경우에는 하나하나 계산하기 어렵다. 그렇기 때문에 아래와 같이 내가 그린 픽셀을 2진수의 배열로 변환해주는 프로그램(혹은 웹페이지)이 존재한다.


▲ 5X8 Custom Character Set

▲  Liquid Crystal Display Custom Character Designer - mikeyancey.com

위의 2개의 프로그램 중 어떤 프로그램을 쓰더라도 결과값은 동일하게 출력된다.
아래의 프로그램은 ‘5X8 Custom Character Set’로 왼쪽 상단의 공간에 내가 원하는 그림을 그리고 포맷을 Arduino LiquidCrystal Lib으로 선택하면 아래에 코드가 나오도록 되어있다.(하지만 코드가 완전하지 않기 때문에 배열부분만 가져다 쓰는 것이 좋다.)

왼쪽에 있는 Char #을 조절해 여러 개의 Character Set을 만들 수 있다.

▲ 5X8 Custom Character Set를 활용한 예제


아래 프로그램은 http://mikeyancey.com/hamcalc/lcd_characters.php에 접속하면 볼 수 있다. 왼쪽 5x8픽셀에 그림을 그리면 오른쪽에서 그에 맞는 코드를 출력한다. 단 하나씩 그릴 수 없다는 단점이 있다.

▲ Liquid Crystal Display Custom Character Designer를 활용한 예제


마치며


아두이노를 사용하다 보면 종종 한글 출력에 관한 문제에 직면하게 된다. 한글만 출력되면 더 좋은 프로젝트를 만들 수 있으며 더욱 편리하게 사용할 수 있음에도 한글사용이 지원되지 않는 경우가 있다.

이 문제는 아두이노에 국한된 것이 아니라 C나 Java와 같은 다른 프로그래밍언어도 해당된다. 코드 내에서는 아스키코드와 같은 표준화 문제 때문에 한글 출력은 어려운게 사실이다. 그래도 LCD는 출력되는 화면을 제어함으로써 어느 정도 해결이 가능하다.

일반적인 방법은 아니기 때문에 계속적으로 이용하기는 힘들지만 한글이 출력되는 원리를 이해함으로써 LCD에서 문자가 어떻게 출력되는지 알 수 있다. 방법을 이해했다면 한글뿐만 아니라 이모티콘이나 특수문자를 직접 만들어 볼 수 있고 해외의 프로젝트처럼 픽셀 게임을 만들어 볼 수도 있다.

위 튜토리얼에 대한 글은 http://kocoafab.cc에도 확인할 수 있다.

저작권자 © 컴퓨터월드 무단전재 및 재배포 금지