hello, world!
앞서 아두이노를 이용해서 LED를 동작시켜 보았다. LED를 껐다 켰다 하는 것은 정보를 표현하는 방법이라고 볼 수 있다. 그런데 LED 두어 개 정도로는 표현할 수 있는 정보가 너무 적다. 문자를 이용해서 정보를 표현한다면 좀 더 인간이 알아보기 좋을 것이다. 컴퓨터에서 정보를 표현하는 주요 장치로 LCD 모니터가 있다. 아두이노에서는 보통 전자계산기에서 사용하는 사이즈의 LCD 장치를 이용해서 정보를 표현한다. 이번장에서는 LCD에 대해서 알아보고 LCD 에 글자를 띄워보는 실습을 해 볼 것이다.
이번장에서는 LCD1602라는 부품이 필요하다. 쇼핑몰에서 검색해 보면 몇천 원 정도에 구입할 수 있다. 추가로 10k 가변저항도 필요하다.
LCD는 Liquid Crystal Display 의 약자이다. 액정 디스플레이라고도 불리는데, Liquid Crystal 이 액정(液晶 진액, 밝을 정) 임을 알 수 있다. 여기서 Liquid라는 영어 단어는 액체라는 의미를 가지는 것을 알 수 있다. 액체와 관련이 있다는 것을 알 수 있다. 액정은 액체와 고체의 중간 상태는 띠는 물질이다. 이 물질의 특성을 이용하여 빛이 통과되는 양을 조절하게 된다. 빛이 통과되는 양의 조절을 통해 화면에 정보를 표현하게 된다.
노트북 컴퓨터나 텔레비전 디스플레이, 전자시계나 계산기의 화면, OTP 숫자 표시부 등 LCD는 우리 주변의 많은 부분에서 사용하고 있다.
이번 실습에서 사용할 LCD 의 모델명은 LCD1602이다. LCD 뒤에 1602라는 숫자가 붙어 있다. 1602 에는 LCD 의 중요한 스펙을 표현하고 있다. 한 줄에 16개의 글자를 출력할 수 있고 두줄을 출력한다고 해서 1602이다. LCD1604, LCD2004라는 모델도 있는데 이름에서 짐작할 수 있듯이 1604는 16칸 4줄, 2004는 20칸 4줄을 출력할 수 있는 LCD 들이다.
LCD1602를 이용해서 실습해 볼 것이다. LCD1604 나 LCD2004를 사용해도 좋다. LCD1602는 총 16개의 핀을 가지고 있다. 각 핀의 명칭과 간단한 설명은 아래 그림을 참고하길 바란다.
모든 핀에 대해 자세히 알 필요는 없다. 우리가 컴퓨터의 모니터를 사용할 때 HDMI 나 DisplayPort 등의 단자의 모든 핀에 대해 숙지하고 사용하는 것이 아니듯 LCD1602 도 모든 핀을 이해하고 사용할 필요는 없다. 아두이노에 연결만 잘 해주고 코드만 잘 입력하면 LCD 가 잘 동작할 것이다. 위에서 보듯 LCD1602는 16개의 핀을 가지고 있기 때문에 연결이 쉽지는 않을 것이다. 다만 LCD1602 연결 연습을 하고 나면 다른 것들은 크게 어렵게 느끼지 않게 될 것이다.
아래의 회로도를 참고해서 선을 연결해 보도록 하자.
LCD 핀의 왼쪽부터 1번부터 16번이라고 했을 때 다음과 같은 순서로 연결하면 된다.
1번 - GND
2번 - 5V
3번 - 10k 옴 가변저항의 가운데
4번 - 아두이노 12번
5번 - GND
6번 - 아두이노 11번
7,8,9,10번 - 생략
11,12,13,14번 - 아두이노 5,4,3,2번 순서대로 연결
15번 - 5V를 220옴 저항 거쳐서 연결
16번 - GND
실제 연결된 모습은 다음과 같다.
선이 많아서 연결하기 힘들다면 15,16번은 연결하지 않아도 좋다. LCD 의 백라이트를 켜기 위한 전원인데 LCD 에 백라이트가 켜지지 않아도 글자는 볼 수 있다.
가변저항은 처음 접한 부품이다. 일반적인 저항은 일정한 저항값을 갖는데 가변저항은 손잡이를 돌리면 저항값이 변하게 된다. 10k 옴 가변저항은 0~10k 옴으로 변화하게 된다. 이러한 원리를 이용해서 스피커의 볼륨을 조절한다거나, 전등의 밝기를 조절한다거나 하는 데 사용되곤 한다. LCD1602에서는 글자의 대비 값을 조정하는 데 사용되는데 글자의 진하기를 조절한다고 보면 된다.
회로도를 다 연결했다면 이제 코드를 업로드해서 잘 동작하는지 확인해 볼 차례다.
Examples -> LiquidCrystal -> HelloWorld 예제를 불러와 보자.
참고로 프로그래밍 언어를 배울 때 보통 처음에 만들어 보는 예제가 바로 HelloWorld라는 예제이다. 화면에 Hello World라는 글자를 출력해 보는 코드이다.
상단의 주석 코드를 제외하고 한글 주석으로 풀이해 보면 다음과 같다.
#include <LiquidCrystal.h> // LCD 라이브러리 사용
// LCD 라이브러리 초기화. 각 숫자는 아두이노에 연결된 핀 번호를 의미한다.
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
lcd.begin(16, 2); // 16칸 2줄 LCD로 초기화
lcd.print("hello, world!"); // LCD 에 "hello, world!"를 출력한다.
}
void loop() {
lcd.setCursor(0, 1); // 커서를 첫 번째 칸(0), 두 번째 줄(1)로 이동시킨다.
lcd.print(millis() / 1000); // 아두이노가 구동된 이후 경과된 시간(초)을 출력한다.
}
프로그램을 업로드하고 나서 다음과 같이 나오면 성공한 것이다.
LCD1602 에 대한 부연 설명이다. 건너뛰어도 무방하다. 아두이노에서 제공하는 LCD 라이브러리는 Hitachi HD44780 드라이버로 구현되어 있다. 이 드라이버에서 구동되도록 만들어진 LCD는 모두 동작이 가능하다. 앞서 LCD1604, LCD2004 가 언급되었었는데 이 LCD 들 모두 Hitachi HD44780 드라이버로 구동되는 LCD 들이다. 이 외에도 해당 드라이버로 구동되도록 만들어진 LCD 라면 구동이 가능하다고 보면 된다.
기본적으로 한글이 지원되지 않는다. 앞서 예제에서는 영어로 된 문장 "hello, world!"와 숫자 값만 출력했었다. 호기심 많은 독자라면 한글도 입력해 보았을 수도 있지만 한글은 제대로 표시가 되지 않고 깨져서 나오는 것을 볼 수 있다. LCD1602는 자체적으로 폰트를 내장하고 있는데 한글 폰트가 없기 때문이다. LCD 자체에 폰트를 가지고 있고 아두이노를 통해 입력된 문자를 LCD의 폰트로 출력해 주는 방식이기 때문에 LCD 자체에서 가지고 있는 폰트로만 표현이 가능하다.
한글을 표현하고자 한다면 방법이 전혀 없는 건 아니지만 쉽지 않다. 다음장에서 다뤄볼 CustomCharacter 예제를 이용하면 한글도 어느 정도 표현해 볼 수 있다. 자세한 내용은 다음장에서 다뤄보도록 하겠다. 참고로 일본어는 출력이 가능하다. 일본어도 모든 문자를 표현하는 것은 아니고 가타카나만 표현 가능하다. 유럽버전으로 출시된 버전은 일본어 대신 유럽에서 사용하는 특수 알파벳의 표현이 가능하다.
LCD1602에 대해 더 자세히 알고 싶다면 다음 문서를 참고한다.
https://www.sparkfun.com/datasheets/LCD/GDM1602K-Extended.pdf
하드웨어 부품들은 저마다의 Specification 문서가 있다. 이러한 문서들에 자세한 정보들이 있다. 다만 전자공학에 대한 지식이 없다면 다소 어려울 수 있다. 잘 모르겠으면 이런게 있구나 하고 넘어 가도 된다.