[아두이노] LCD16x2 I2C(LiquidCrystal_I2C) 제어

IOT/아두이노|2019. 2. 25. 09:00

[아두이노] LCD16x2 I2C(LiquidCrystal_I2C) 제어



어제 가상시뮬레이터에서 LCD 16x2를 제어를 해보았는데 오늘은 실제 LCD 16x2 I2C을 이용해서 동일한 코딩 로직으로 결과를 출력하는 실험을 해보겠습니다. 사실 LCD 16x2를 가지고 있어 그것도 보여드리면 좋았겠지만 그냥 편하게 실험하기 위해서 LCD 16x2 I2C를 사용해서 실험 했네요.

1. LCD 16x2 I2C



LCD 16x2 I2C의 뒤면 검은색 모듈이 추가되어 있는데 I2C 통신을 하기 위한 모듈입니다. 간단히 4핀으로 구성되어 있으면 아두이노에 연결할때도 그리 어렵지 않게 연결할 수 있습니다.


제가 소유한 LCD 16x2와 LCD 16x2 I2C 인데 보는것 같이 핀 4개짜리를 사용하는게 훨 편하겠죠.

LCD 16x2 I2C 핀 4핀으로 구성

  • Gnd
  • Vcc(5V)
  • 데이터핀(A4)
  • 클럭핀(A5)

LCD 16x2 I2C의 뒷면에 보시면 적혀있기 때문에 쉽게 연결 할 수 있습니다.

LCD 16x2 I2C 주의사항

  • 부품마다 주소가 다를 수 있다. : 제가 사용한 부품의 주소는 LiquidCrystal_I2C 라이브러리 에서 이 클래스를 사용하기 위해서 사용하는 LCD 16x2 I2C의 주소값이 필요한데 처음에 작동을 안해서 불량품인 줄 알았어요. 구글링해서 주소가 따로 있고 다르면 출력이 안된다는 사실을 나중에 알게 되었죠.
  • 가변저항을 조설해야 한다. : 파란색 작은 사각모형에 십자나사 모양이 있는데 첨에는 한쪽으로 감겨져 있어서 이걸 돌릴 생각없이 LCD에 불이 안들어와서 불량품인 줄 알고 삽질을 한 기억이 있네요. 이걸 돌려서 밝기를 조절해야하는데 처음 만질때는 생각을 못했네요.

LCD 16x2 I2C 주소 확인법

아두이노에서 I2C에 잡혀있는 주소를 알아볼 수 있습니다. 예제가 있으니 그걸 복사하셔서 자신이 사용하는 부품의 주소를 확인하시면 됩니다.

LCD 16x2 I2C 데이터 시트

이곳에 가셔서 LCD 16x2 I2C의 데이터 시트를 확인하시면 됩니다. 아주 간단하게 소개되어 있어서 보기 편할꺼에요. 이곳에 가시면 이표가 있는데 LCD 16x2 I2C 주소가 어떻게 지정되는지 확인 할 수 있습니다.


위에 LCD 16x2 I2C 뒤면 사진에서 파란사각모양(가변저항) 밑에 3개의 작은 사격형 모양으로 모듈 회로에 표시되어 있을꺼에요 각각 A0, A1, A2로 납땝이 어떤식으로 되어 있느냐에 따라서 주소가 바뀌게 됩니다. 인두가 있는분들은 주소를 변경해 볼 수 있겠죠. 그런데 별로 추천드리지 않고요 그냥 만들어져 있는 형태로 실험하세요.

하지만 2개이상을 쓸때 같은 주소인데 2개가 다른 용도로 개별적으로 출력을 하고자 할때는 한개 주소를 변경해줘야 겠죠. 변경해주면 해당주소에 해당값만 출력되게 됨으로 여러개를 같은 라인에 연결하여 사용할 수 있겠죠.

2. 회로도 구성


  • 준비물 : LCD 16x2 I2C 1개, 아두이노우노
  • 내용 : LiquidCrystal_I2C 라이브러리를 사용하며 값을 출력하기 위해서 LCD 16x2 I2C 회로도를 표현을 하자.


상단에 표시한 아무것도 적혀있지 않는 핀 두개가 있습니다. 거기 핀은 A5, A4라고 참고로 알아두시면 돼요. 위로 연결을 하던 아래로 연결을 하던 동일하니깐 아무곳이나 연결하세요.

3. 코딩



LiquidCrystal 함수

LiquidCrystal_I2C lcd(0x3F,16,2);  // 0x27 or 0x3F
  • LiquidCrystal_I2C lcd(주소,가로,세로) : LCD 16x2 I2C 부품의 주소와 출력사이즈값을 지정합니다.

이전 실험해서는 LiquidCrystal(rs, enable, d4, d5, d6, d7) 함수만 사용하였지만 LiquidCrystal_I2C클래스에는 생성자 함수 인자가 주소랑 가로x세로 값을 던져 줍니다. LiquidCrystal 클래스처럼 함수 선택장애는 없겠죠. 그외 함수들은 대충 비슷함으로 생략합니다.

설계는 이전 LCD16x2 (LiquidCrystal) 제어(아두이노) 소스랑 동일합니다. 동일한 형태로 진행했습니다.

혹시 함수를 자세히 보고 싶으시다면https://github.com/marcoschwartz/LiquidCrystal_I2C 가셔서 LiquidCrystal_I2C.h 파일을 살펴보세요. 그리고 함수 내부동작을 자세히 보기 위해서는 LiquidCrystal_I2C.cpp 파일을 열어보시면 됩니다.

코딩을 전체적으로 하면

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x3F,16,2);  // 0x27 or 0x3F

void setup()
{
  lcd.init(); //초기화
  lcd.backlight(); //배경불켜기
  lcd.setCursor(0, 0);
  lcd.print("Hello World");
  delay(1000);
  lcd.clear();
}

void loop() {
  lcd.setCursor(0, 1);
  lcd.print("COUNT : ");
  for(int i=0;i<10;i++){ 
    lcd.setCursor(9, 1);
    lcd.print(i);    
    delay(1000);    
  }    
}

4. 라이브러리 추가하기


우선 LiquidCrystal_I2C 라이브러리를 사용하기 위해서는 아두이노 IDE에 라이브러리로 등록해 줘야 합니다. 나중에 다른 부품을 사용할때도 이 과정을 계속 수행해야 하기 때문에 잘 알아 두세요.

  • PC에 아두이노 IED 설치된 경우


라이브러리 관리를 누르고 검색어로 LiquidCrystal_I2C를 치시면 설치가능한 라이브러리 파일들이 나타납니다. 이렇게 설치해도 되고요 구글링하셔서 해당 라이브러리파일을 다운 받은 후 .zip 라이브러리추가하시면 됩니다. 그러면 파일->예제 열기가 있는데 추가되어 있을꺼에요. 그 예제로 실험하셔도 됩니다.

  • RaspberryPi3에다 아두이노 IED를 설치된 경우

제가 RaspberryPi3에 아두이노 IED를 설치해서 아두이노를 원격으로 실험하고 있는데요. 문제는 라이브러리 관리 항목이 없어서 일일히 다운 받아야 하는게 귀찮더군요.

구글 검색을 통해 해당 라이브러리 파일이 있는 GitHub 경로를 찾아야 합니다.


이렇게 페이지에 들어가면 Clone or download를 클릭하시면 경로가 나오고 그걸 복사를 합니다. 그리고 라이브러리파일을 저장할 디렉토리를 만든 후 그 위치에서 다운받습니다.

git clone https://github.com/marcoschwartz/LiquidCrystal_I2C.git

그리고 나서 아두이노 IED에서 Add Libray... 를 눌러 다운받았던 경로의 라이브러리파일을 등록해야 사용할 수 있습니다.


파일->예제 누르니 3개의 샘풀 예제가 등록되어 있네요. HelloWorld 예제로 실험하시거나 아니면 위 코딩으로 정상적으로 출력되는지 복사하셔서 실험하시면 됩니다.

5. 결과


동영상 결과는 간단히 실제 결과만 출력되는 걸 보여줍니다. 여기에 코딩된 것은 실행 시키고 달려가서 아두이노우노가 있는 위치까지 가서 촬영을 해야 했기 때문에 "Hellow World"의 출력 메시지를 최대한 딜레이 시간을 준 코딩으로 촬영 했네요.

마무리


오늘은 가상시뮬레이터에서는 실험 할 수 없습니다. 어제 LCD 16x2 로 출력은 가능했지만 실제 LCD 16x2 I2C가 가상시뮬레이터에는 없기 때문에 아쉽게도 오늘 실험은 실제 아두이노 부품이 있는분만 가능할 듯 싶네요.

대충 이런식으로 제어를 한다는 것만 보여 드렸으며 자세한 함수 설명은 생략했습니다. 계속 가상시뮬레이터 실험을 주된 실험으로 이루어지기 때문에 가상시뮬레이터에만 초점을 두겠습니다.

이제 LCD 16x2 로 출력을 할 수 있게 되면은 측정센서 부품을 사용할때 그 결과를 LCD 16x2로 출력시키면 좀 더 재미 있겠죠.


댓글()

[아두이노] LCD16x2 (LiquidCrystal) 제어

IOT/아두이노|2019. 2. 24. 17:07

[아두이노] LCD16x2 (LiquidCrystal) 제어



오늘은 LCD 16x2 에 값을 출력하는 실험입니다. 회로도는 arduino.cc에서 제공되는 샘플을 그대로 따라 실험을 하였습니다. 저도 LCD 16x2 부품을 사용할때마다 이전에 실험했던 디자인을 찾아서 보고 회로도를 표현만드네요. 우선 사용하는 핀이 많아서 좀 햇갈리고 잘못 표현할 수 있어서 그냥 예제의 표현을 기반으로 가상시뮬레이터로 정상적으로 결과가 나오는지 실험해 보는걸로 하겠습니다.

1. LCD 16x2



15, 16핀은 백그라운드 밝기라서 220옴을 달았더군요. 1번 Gnd, 2번 Vcc, 3번 Vo로 여기에 출력 글자의 밝기가 결정되더군요.
DB0~7까지 데이터 핀이고, 나머지 RS, R/W, Enable핀으로 구성되어 있습니다.

2. 회로도 구성


  • 준비물 : LCD 16x2 1개, 저항 220옴 1개, 10k 가변저항기 1개, 아두이노우노, 뻥판
  • 내용 : LiquidCrystal(rs, enable, d4, d5, d6, d7) 을 사용하여 값을 출력하기 위해서 16x2 회로도를 표현을 하자.
  • 인용자료 : https://www.arduino.cc/en/Reference/LiquidCrystal(아무 예제나 클릭해도 됨)

//LiquidCrystal(rs, enable, d4, d5, d6, d7) 
LiquidCrystal lcd(3, 4, 9, 10, 11, 12);

우선 이 함수를 사용하기 위해서 rs, enable핀과 데이터 데이터 4,5,6,7번 핀을 사용을 해야합니다. 회로도 디자인은 적당한 핀으로 디자인이 깔끔하게 보이게 하기 위해서 3, 4, 9, 10, 11, 12핀에 연결했습니다. 그리고 15(Vcc)번과 16(Gnd)핀이 있는데 15번에 220옴을 붙여서 적당히 백그라운의 밝기를 고정시켰습니다. 그리고 전원으로 1번은 Gnd 2번 Vcc로 연결하는데 3번에 10k 가변저항을 붙여서 글자의 밝기를 조절하도록 배치된 회로도 만들어 보도록 하겠습니다.


우선 가장 심풀하게 표현된건데 사실 실제로 LCD 16x2를 구매하실때 이 부품을 잘 안사고 LCD 16x2 I2C 를 이용합니다. LCD 16x2 뒷면에 I2C모듈이 붙어 있어서 아두이노에서 필요한 핀이 2개뿐이 안필요해서 여러개의 부품 제어때 LCD 16x2 I2C를 주로 사용합니다. 기본 제어 부품들이 LCD 16x2 뒷면에 모듈로 다 붙어 있어서 따로 복잡하게 회로도를 만들 필요가 없어서 많이 사용합니다.


총 4핀에서 전원핀 2개를 제외하면 아두이노에서 사용할 2핀만 연결하시면 됩니다. 힘들데 선을 연결할 필요없이 4개의 핀만 연결하니 실제로 실험할 경우 저 부품을 사서 실험하겠죠. 문제는 가상시뮬레이터에서는 힘들게 선을 다 배치해야 합니다. 하지만 선을 배치함으로 LCD 16x2의 부품에 대해서 보다 자세히 이해할 수 있기 때문에 귀찮아 하지 마시고 한번 디자인 해보세요.

3. 코딩



LiquidCrystal 함수

LiquidCrystal(rs, enable, d4, d5, d6, d7) 
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) 
LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) 
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)

아두이노의 핀 회로도 배치가 달라지겠죠. 실험해서는 LiquidCrystal(rs, enable, d4, d5, d6, d7) 함수만 사용합니다.

그외 함수들

제블러그에서 대충 함수를 요약한 건데 가져왔네요.https://www.arduino.cc/en/Reference/LiquidCrystal 보시면 오른쪽에 함수목록들이 있는데 가서 함수들을 읽어보시면 됩니다. 간단히 요약하면은

begin(가로,세로) => 화면나누기
setCursor(가로,세로) => 커서의 위치
print(출력문자열) => 출력
write(출력문자) => 출력
clear() => 화면지우기
noDisplay() => 끄기
display() => 켜기
scrollDisplayRight() => 오른쪽으로 한칸이동
scrollDisplayLeft() => 왼쪽으로 한칸이동
autoscroll() => 자동으로 왼쪽이동
lcd.createChar(0, 문자배열값) => 직접 문자를 만듬(write(byte(0))출력)

외우지 마시고 대충 정리했다가 LCD 16x2를 사용하실때 이 함수들을 적어놨다가 사용하시면 됩니다.

설계

제 블로그에서 간단히 실험한 예제을 그대로 사용했네요. LCD 16x2에 "Hello World"를 출력해보고 "COUNT : 숫자"로 출력되게해서 카운터를 세보자.

  1. LiquidCrystal를 사용하기 위해서 객체를 선언해야지. 그런데 클래스 보니깐 선언때 생성자함수이네! 사용할 핀을 넘겨줘야 하는군!
  2. 초기작업이 끝났으니 이제 lcd 객체변수로 화면을 16x2로 세팅해야지
  3. 이제 LCD 16x2의 값을 출력할 커서의 위치는 잡아야 줘야지.
  4. "Hello World" 출력해야지
  5. 다음 "COUNT: 숫자"로 카운트를 세면서 값을 출력해야지. 그런데 그냥 출력하면 기존의 쓰여진 값에 덮어씌워지니깐 clear()함수로 화면을 지워야지
  6. "COUNT: 숫자" 숫자를 매번 clear하고 지우기 그러니깐 "COUNT : "한번만 하고 숫자만 갱신하는게 실속 있겠다. 그러면 바로 카운터 숫자가 나오는 위치만 갱신하면 되겠죠. 아까 글자가 출력할 커서의 위치를 지정하는 함수가 있었죠. 그 함수로 숫자의 위치 "COUNT : "은 공백포함 8자리니깐 setCursor(9, 1)를 이용해서 갱신하면 쉽게 표현되겠군.

코딩을 전체적으로 하면

#include <LiquidCrystal.h>

//LiquidCrystal(rs, enable, d4, d5, d6, d7) 
LiquidCrystal lcd(3, 4, 9, 10, 11, 12);

void setup()
{
  lcd.begin(16,2);
  lcd.setCursor(0, 0);
  lcd.print("Hello World");
  delay(1000);
  lcd.clear();
}
void loop() {
  lcd.setCursor(0, 1);
  lcd.print("COUNT : ");
  for(int i=0;i<10;i++){ 
    lcd.setCursor(9, 1);
    lcd.print(i);    
    delay(1000);    
  }    
}

for문을 이용해서 0~9까지 i의 값이 1씩 증가하고 그 값이 커서(setCursor(9,1)로 두번째 줄의 9번째칸에 i값을 출력이 됩니다.
0~9까지 아니는 1초 단위로 그 값을 찍게되는 것이죠. 자세히 보시면 위에서 함수에 대한 요약된거랑 매칭해서 이해하세요.
대충 이런식으로 값들을 찍어낼 수 있습니다. 나중에 센서값을 측정하면 바로 LCD 16x2로 출력할 수 있겠죠.

4. 결과


동영상 결과를 회로도를 최대한 보기 편하게 배치하다 보니깐 LCD 16x2가 거꾸로 배치했네요. 그래서 글자가 거꾸로 나오는 것처럼 되었네요.

마무리


LCD 16x2 만 잘 사용하시면 이제 다양한 실험을 작은 LCD 모니터로 그 값을 출력할 수 있어서 보기 편하실꺼에요. 이걸 모니터 대용으로 아두이노상에서 모든걸 해결 할 수 있게 되겠죠. 한번 초음파센서와 결합해서 거리값을 출력시켜보세요. 다음편에 이 두 부품을 결합한 에제로 복습 실험을 할지 아니면 실제로 LCD 16x2 I2C 를 이용해서 2핀으로만 제어하는 걸 보여드릴때 고민해봐야 겠네요.
암튼 LCD 16x2를 연습을 하시고 다 소개하지 못했지만 참고자료에 링크한 곳에 가셔서 함수들을 한번 읽어보시면 표현을 해보세요.

오늘은 LiquidCrystal 에서 사용함수들만 이해만 해주세요. 그리고 예제가 어떻게 출력되는지만 잘 살펴보시면 그냥 무난히 LCD 16x2를 사용하실 수 있을꺼에요.


댓글()