LCD(액정 디스플레이) 문자 디스플레이는 고정된 크기의 개별 ASCII 문자만 출력할 수 있는 특수한 유형의 디스플레이입니다. 이 개별 문자들을 조합하여 텍스트를 형성합니다.
디스플레이를 자세히 보면 5×8 픽셀 그리드로 구성된 작은 직사각형 영역들이 있습니다. 각 픽셀은 개별적으로 켤 수 있으며, 이를 통해 각 그리드 내에서 문자를 생성할 수 있습니다.
이 직사각형 영역의 개수가 LCD의 크기를 결정합니다. 가장 인기 있는 LCD는 16×2로, 16개의 문자 영역(캐릭터)이 있는 두 행을 가지고 있습니다. 물론 16×1, 16×4, 20×4 등 다른 크기도 있지만 모두 동일한 원리로 작동합니다. 또한 이 LCD들은 배경색과 텍스트 색상이 다를 수 있습니다.
16×2 LCD 핀아웃
왼쪽에서 오른쪽으로 16개의 핀이 있으며, 첫 번째는 그라운드(GND) 핀입니다. 두 번째 핀은 VCC로 아두이노 보드의 5V 핀에 연결합니다. 세 번째는 Vo 핀으로, 여기에 가변저항(포텐셔미터)을 연결하여 디스플레이의 대비(Contrast)를 조절합니다.
다음은 RS 핀(레지스터 선택 핀)으로, 명령어를 보낼지 데이터를 보낼지 선택하는 데 사용됩니다. 예를 들어 RS 핀이 로우 상태(0V)면 LCD에 명령어를 보냅니다: 커서 위치 설정, 디스플레이 지우기, 디스플레이 끄기 등. RS 핀이 하이 상태(5V)면 LCD에 데이터나 문자를 보냅니다.
다음은 R/W 핀으로 읽기/쓰기 모드를 선택합니다. 쓰기 모드는 명령어와 데이터를 LCD로 보내는 데 사용되며, 읽기 모드는 LCD 자체가 프로그램을 실행할 때 사용하므로 이 튜토리얼에서는 다루지 않습니다.
다음은 E 핀(인에이블 핀)으로, 레지스터 쓰기를 활성화하거나 그 다음 8개의 데이터 핀(D0~D7)을 활성화합니다. 이 핀들을 통해 레지스터에 쓸 때 8비트 데이터를 보냅니다. 예를 들어 대문자 'A'를 표시하려면 ASCII 표에 따라 0100 0001을 레지스터에 보냅니다. 마지막 두 핀 A와 K(애노드와 캐소드)는 LED 백라이트용입니다.
다행히 LiquidCrystal 라이브러리가 거의 모든 것을 처리해 주므로 LCD 작동 원리에 대해 크게 걱정할 필요가 없습니다. 아두이노 공식 웹사이트에서 라이브러리 함수를 확인할 수 있으며, 이를 통해 LCD를 쉽게 사용할 수 있습니다. 라이브러리는 4비트 또는 8비트 모드로 사용할 수 있는데, 이 튜토리얼에서는 4비트 모드(8개 데이터 핀 중 4개만 사용)를 사용합니다.
아두이노와 LCD 연결하기 – 배선도
16×2 LCD 디스플레이를 아두이노 보드에 연결하는 방법은 다음과 같습니다.
아두이노 보드에서 6개의 디지털 입력 핀만 사용합니다. LCD의 레지스터 D4~D7은 아두이노 디지털 핀 4~7에 연결합니다. Enable 핀은 2번 핀, RS 핀은 1번 핀에 연결합니다. R/W 핀은 그라운드에 연결하고 Vo 핀은 가변저항의 중간 핀에 연결합니다.
필요한 부품
16×2 캐릭터 LCD
가변저항(포텐셔미터) 10kΩ
아두이노 보드 (Uno, Nano 등)
브레드보드와 점퍼 와이어
LCD 대비 조절하기
Vo 핀의 입력 전압을 조절하여 LCD 대비를 조정할 수 있습니다. 가변저항을 사용하면 0~5V 사이의 입력 전압을 미세하게 조절하여 쉽게 대비를 맞출 수 있습니다.
가변저항 없이 LCD 사용 가능한가요?
네, 가변저항이 없는 경우 두 개의 저항으로 전압 분배기를 만들어 LCD 대비를 조절할 수 있습니다. 전압 분배기를 사용하여 0~5V 사이의 전압 값을 설정하면 디스플레이에서 좋은 대비를 얻을 수 있습니다. 제 LCD의 경우 약 1V 전압이 잘 작동했습니다. 1kΩ와 220Ω 저항을 사용하여 적절한 대비를 맞췄습니다.
또 다른 방법은 아두이노에서 PWM 신호를 LCD의 Vo 핀으로 공급하는 것입니다. Vo 핀을 아두이노의 PWM 지원 핀에 연결하고 setup 섹션에서 다음 코드를 사용합니다:
D11 핀에서 255 중 100 값의 PWM 신호를 생성하며, 이는 0~5V 전압으로 환산 시 약 2V가 LCD의 Vo 핀에 입력됩니다.
LCD 아두이노 코드
LiquidCrystal 라이브러리의 작동 원리를 설명하는 간단한 코드입니다. 영상의 첫 번째 예제 코드입니다:
/*
* 아두이노 LCD 튜토리얼
* 작성자: Dejan Nedelkovski
* www.HowToMechatronics.com
*/
#include <LiquidCrystal.h> // LiquidCrystal 라이브러리 포함
LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // LCD 객체 생성. 매개변수: (rs, enable, d4, d5, d6, d7)
void setup() {
lcd.begin(16, 2); // LCD 인터페이스 초기화, 디스플레이 크기(가로, 세로) 지정
}
void loop() {
lcd.print("Arduino"); // LCD에 "Arduino" 출력
delay(3000); // 3초 대기
lcd.setCursor(2, 1); // 이후 텍스트가 표시될 위치 설정
lcd.print("LCD Tutorial");
delay(3000);
lcd.clear(); // 디스플레이 지우기
lcd.blink(); // 깜빡이는 LCD 커서 표시
delay(4000);
lcd.setCursor(7, 1);
delay(3000);
lcd.noBlink(); // 깜빡이는 LCD 커서 끄기
lcd.cursor(); // 다음 문자가 쓰일 위치에 밑줄 커서 표시
delay(4000);
lcd.noCursor(); // LCD 커서 숨기기
lcd.clear(); // LCD 화면 지우기
}
코드 설명
가장 먼저 LiquidCrystal 라이브러리를 포함해야 합니다. 스케치 → 라이브러리 포함 → LiquidCrystal 순으로 선택하면 됩니다. 그런 다음 LC 객체를 생성합니다. 이 객체의 매개변수는 아두이노 보드의 디지털 입력 핀 번호로, LCD 핀에 각각 대응됩니다: (RS, Enable, D4, D5, D6, D7). setup에서 begin() 함수를 사용하여 LCD 인터페이스를 초기화하고 디스플레이 크기를 지정합니다.
loop에서는 메인 프로그램을 작성합니다. print() 함수를 사용하여 LCD에 출력합니다.
lcd.print("Arduino"); // LCD에 "Arduino" 출력
setCursor() 함수는 이후 텍스트가 표시될 위치를 설정하는 데 사용합니다.
lcd.setCursor(2, 1); // 이후 텍스트가 표시될 위치 설정
blink() 함수는 깜빡이는 커서를 표시하고 noBlink() 함수로 끕니다.
lcd.blink(); // 깜빡이는 LCD 커서 표시
cursor() 함수는 밑줄 커서를 표시하고 noCursor() 함수로 끕니다. clear() 함수로 LCD 화면을 지울 수 있습니다.
lcd.clear(); // LCD 화면 지우기
16×2 LCD와 아두이노로 텍스트 스크롤하기
텍스트 길이가 16자를 초과하는 경우 LiquidCrystal 라이브러리의 scrollDisplayLeft() 또는 scrollDisplayRight() 함수를 사용하여 텍스트를 스크롤할 수 있습니다.