아두이노 LCD 패널 연결 - adu-ino LCD paeneol yeongyeol

LCD는 액정 디스플레이 또는 액정 표시장치를 의미하며 뒷면에 빛을 내는 백라이트(backlight)를 배치하고 앞면에 액정을 두어 전기신호에 따라 빛을 차단하거나 통과시키는 방식으로 문자나 숫자 등을 표시하는 장치입니다. 아두이노 시뮬레이터에서 제공하는 LCD를 1602 LCD라고도 하는데, 가로로 16개의 문자를 출력할 수 있고 세로로 2줄을 표현할 수 있는 LCD라는 의미입니다.

아두이노 LCD 패널 연결 - adu-ino LCD paeneol yeongyeol



LCD에 문자와 숫자 출력하기

아두이노에서 LCD를 사용하려면 먼저, 관련 라이브러리를 사용해야 합니다. 1602 LCD의 경우 내장된 LiquidCrystal.h 라이브러리를 사용하면 됩니다. LCD를 통해 문자와 숫자를 출력하는 방법에 대해 살펴보겠습니다. LCD에 문자와 숫자를 출력하기 위해 LCD 구성요소와 가변저항, 저항이 필요합니다. 가변저항은 LCD의 V0 단자에 연결해 문자를 표시하는 영역의 밝기를 제어하며, 저항은 백라이트를 사용해 LCD에 표시되는 문자를 선명하게 볼 수 있도록 도와줍니다.

아두이노 LCD 패널 연결 - adu-ino LCD paeneol yeongyeol

LCD 구성요소는 기본 구성요소에 포함되지 않기 때문에 검색 기능을 통해 작업판에 배치해야 합니다. 구성요소 선택메뉴 아래 검색창에 “lcd”라는 키워드로 검색 후 드래그 앤 드롭을 통해 LCD 구성요소를 작업판에 이동하겠습니다.



LCD에 문자와 숫자 출력하기의 회로구성

아두이노 LCD 패널 연결 - adu-ino LCD paeneol yeongyeol

위 그림과 같이 LCD의 단자를 아두이노와 브레드보드에 연결합니다. LCD는 총 16개의 단자로 구성됩니다. LCD의 단자를 각각 살펴보면 VCC는 전원(5V)을 GND는 그라운드를 의미합니다. V0는 가변저항의 출력 값을 통해 LCD에 표시되는 문자의 밝기를 제어하는데 사용되며, RS(Resistor Select)는 데이터 또는 명령어를 선택할 수 있는 스위치가 됩니다. 예를 들어, RS단자에 LOW 값을 쓰면 데이터를 전송하는 통로인 데이터 버스를 통해 명령어를 전송하며, HIGH 값을 쓰면 데이터 버스로 데이터를 전송할 수 있습니다. RW(Read/Write) 단자는 LCD의 값을 읽을지 쓸지를 결정합니다. LOW 값으로 설정하면 LCD에 값을 써 문자를 출력할 수 있습니다. 항상 출력모드로 사용할 경우 그라운드에 연결하면 됩니다. E(Enable) 단자는 명령어를 실행하기 위한 시점을 결정합니다. 예를 들어, E단자의 값이 LOW에서 HIGH로 변경되는 시점에 LCD를 초기화하거나 문자의 출력 위치를 결정하는 커서(Cursor)를 변경하는 등 스케치 코드로 작성한 명령어가 LCD로 전송된 후 실행되는 시점을 결정합니다.

DB0부터 DB7은 데이터 또는 명령어를 전송하는 단자로 8개의 단자 전체를 사용할 수 있으며 DB0에서 DB3까지는 생략하고 DB4부터 DB7까지 4개의 단자만 사용할 수 있습니다. LCD의 데이터 단자를 모두 사용할 경우 아두이노의 디지털 핀이 부족할 수 있으므로 보통 4개의 단자만 사용합니다. 마지막 LED(A)와 LED(K)는 백라이트를 사용하기 위한 단자로 백라이트가 LED로 동작하기 때문에 애노드(Anode)와 캐소드(Cathode) 두 단자가 필요합니다. LCD 모듈에 따라서 애노드는 알파벳 A, 캐소드는 알파벳 K만으로 표시되는 것도 있으니 주의해서 사용합니다.



LCD에 문자와 숫자 출력하기의 스케치 코드

아두이노 LCD 패널 연결 - adu-ino LCD paeneol yeongyeol

LCD에 문자와 숫자를 출력하는 스케치 코드는 위와과 같습니다. 1번째 줄의 라이브러리를 추가하는 방법은 직접 타이핑하는 방법과 아래와 같이 시뮬레이터의 코드 입력 창에서 “LiquidCrystal.h” 라이브러리를 포함(Include)하는 방법이 있습니다.

아두이노 LCD 패널 연결 - adu-ino LCD paeneol yeongyeol

스케치 코드의 4번째 줄은 LCD를 초기화하는 코드입니다. 각 핀번호가 의미하는 바는 아래 표와 같습니다. 아두이노에 연결된 LCD 단자를 각각 1:1로 매핑해 초기화 함수를 선언해야 LCD가 정상적으로 동작합니다. RS(Resistor Select)는 데이터와 명령어를 선택할 수 있는 단자이며, E(Enable)은 명령어를 실행하는 시점을 결정하는 단자, DB4 ~ DB7은 데이터를 전송하기 위한 단자를 아두이노 디지털 핀 12, 11, 5, 4, 3, 2에 각각 연결합니다. 만약 해당하는 아두이노 디지털 핀이 다른 목적으로 사용하고 있다면 사용하지 않는 아두이노의 핀 번호에 LCD 단자를 연결하고 스케치 코드에 핀 번호를 동일하게 일치시켜주면 됩니다.

아두이노 LCD 패널 연결 - adu-ino LCD paeneol yeongyeol

스케치 코드 7번째 줄에서는 begin() 함수를 통해 어떤 LCD를 초기화할지 결정합니다. 매개변수는 열(Columns)과 행(Rows)으로 구성되며 1602 LCD는 16개의 열과 2개의 행을 의미하기 때문에 lcd.begin(16, 2)와 같이 초기화 합니다. begin() 함수 앞에 lcd는 스케치 코드 4번째 줄에서 선언한 LCD의 변수 명이며 LCD와 관련한 함수는 항상 LCD를 초기화한 변수명을 접두어로 사용해야 합니다. 따라서 8번째 줄에 문자를 출력하는 print() 함수도 lcd.print()와 같이 사용되었습니다. LCD의 변수명으로 사용된 lcd를 변경하려면 4번째 줄에서 LCD를 초기화할 때 다른 이름으로 바꾸고, 그 뒤에 사용되는 LCD와 관련된 함수 앞에 접두어를 변경된 이름으로 모두 바꾸면 됩니다. 커서(Cursor)는 문자의 출력 위치이며 초기값은 0번째 열과 0번째 행을 의미합니다. 따라서 print() 함수로 “Hello, Arduino!!”라는 문자열을 출력할 때 LCD의 첫 번째 줄 왼쪽부터 출력됩니다. 프로그램에서 첫 번째 위치는 1이 아닌 0부터 시작함을 주의합니다. 예를 들어, 16개의 열을 표현할 수 있는 LCD는 0번째 열부터 15번째 열까지 출력할 수 있습니다. 12번째 줄에서 사용한 setCursor() 함수는 커서의 위치를 임의로 변경해 출력할 문자의 시작위치를 조절할 수 있습니다. 매개변수는 begin() 함수와 동일하게 열과 행으로 구성되며 setCursor(0, 1)은 0번째 열과 1번째 행을 의미합니다. 즉, 두번째 줄 왼쪽으로 커서를 이동시킨 후 스케치 코드 13번째 줄의 print() 함수를 통해 숫자 “1234567890”을 출력하면 아래와 같이 출력되는 것을 확인할 수 있습니다.

아두이노 예제 12강에서 진행했던 LCD에 글자 쓰기는 실습을 해보기에는 좋은 예제이다. 하지만 디지털 포트를 많이 차지하기 때문에 여러가지 부품을 사용해야 한다거나 프로젝트를 진행할 시에는 효율적이지 못 하다. 그러므로 이번 시간에는 I2C LCD 모듈을 사용하여 글자를 써보도록 하겠다.

 

I2C LCD 모듈


아두이노 LCD 패널 연결 - adu-ino LCD paeneol yeongyeol

기존 LCD에 모듈만 결합한 형태로 GND, VCC, SDA(Serial Data Line), SCL(Serial Clock) 등 총 4개의 핀으로 이루어져 있다. 총 12개의 배선을 단 4개의 배선으로 동작이 가능하기 때문에 여러 부품들을 함께 사용하기에 유용하다. 또한 I2C Converter에 가변 저항도 내장되어 있기 때문에 선명도 조절을 위한 가변 저항을 따로 달아줄 필요가 없다.

 

아두이노 LCD 패널 연결 - adu-ino LCD paeneol yeongyeol
Arduino-LiquidCrystal-I2C-library-master.zip

http://codingrun.com/100

라이브러리 추가 방법은 위 링크를 참고하기 바란다.

 

사용 함수


아두이노 LCD 패널 연결 - adu-ino LCD paeneol yeongyeol

 

함수를 사용하는 방법은 객체이름.함수();와 같이 사용한다. lcd 예제이기 때문에 보통 객체 이름을 lcd로 선언하며, lcd.print("Codingrun");과 같이 사용하면 된다.

 

실습 내용


LCD에 원하는 문자를 출력해 보자.

 

준비물


아두이노 보드, I2C LCD, 암수 점퍼선 4개

 

회로도


 

아두이노 LCD 패널 연결 - adu-ino LCD paeneol yeongyeol

 

아두이노 LCD 패널 연결 - adu-ino LCD paeneol yeongyeol

 

 

소스 코드


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#include <LiquidCrystal_I2C.h>     //LiquidCrystal 라이브러리 추가 

LiquidCrystal_I2C lcd(0x3F162);  //lcd 객체 선언

 

void setup()

{

  lcd.begin(); //LCD 사용 시작

}

 

void loop()

{

  lcd.setCursor(50);    // 커서를 5, 0에 가져다 놓아라. (열, 행)

  lcd.print("Hi ^^");     // 5, 0에 Hi ^^를 출력해라.

  delay(1000);            // 1초 대기

  lcd.setCursor(31);    // 커서를 3, 1로 가져다 놓아라. (열, 행)

  lcd.print("Codingrun"); // Codingrun을 입력해라.

  delay(1000);            // 1초 대기 

  lcd.clear();            // 글자를 모두 지워라.

  delay(1000);            // 1초 대기

}

Colored by Color Scripter

cs

아두이노 LCD 패널 연결 - adu-ino LCD paeneol yeongyeol
EX15_I2CLCD.ino

 

 

 

글씨 출력이 안 되는 경우 (해결 방법)


LCD 관련 실습을 하다 보면, 네모만 나온다던가, 글씨가 출력이 안 되던가 하는 오류가 종종 일어난다. 가장 흔한 이유 중 하나는 I2C LCD 부품의 주소값이 다르기 때문이다. 이럴땐 i2c_scanner를 통해 주소값을 알아낸 다음, 객체 선언에서 주소값을 바꿔주면 된다.