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

in #kr-newbie7 years ago (edited)

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를 사용하실 수 있을꺼에요.

Sort:  

스스로 홍보하는 프로젝트에서 나왔습니다.
오늘도 좋은글 잘 읽었습니다.
오늘도 여러분들의 꾸준한 포스팅을 응원합니다.

오늘도 방문해주셔서 감사합니다.

아이와 같이 해보고 싶은데..겁부터 나는군요..
좋은 포스트 감사하고 주말에 님의 포스트 쭉 정독예정입니다..

쉬운것부터 LED 제어랑 센서 같은것 부터 시작하세요.
LCD 16x2는 아직 볼 필요 없고요. 아두이노 IDE에 시리얼 모니터로 결과를 출력하시면 돼요.

그리고 스크래치를 이용한 아두이노를 한번 검색하시면 프로그램언어가 너무 힘들면 블록으로 하셔도 되고요. 그걸 보시다가 가상시뮬레이터에 블록을 사용하여 실험하셔도 돼요.

블록을 사용하여 제어하는 걸 보여 드릴 수 있는데 내용이 그러면 너무 길어지고 블록으로 아두이노제어하는게 좀 표현의 제약이 있어서 아예 처음부터 c언어 기반으로 포스팅을 하네요.

c언어라 해봤자 기본 문법 변수선언 if, for문이 주로 이뤄지고요 while문은 쓰긴 하는데 잘 안쓰고요 이것만 알고 엑셀을 혹시 사용하실 수 있으면 엑셀에서 함수 쓰듯이 함수의 의미만 잘 이해하시고 접근하시면 함수로 하고자 하는 명령을 표현하시면 돼요.

헐,,,제가 기름쟁이 계통이라,, 마구 어렵습니다. 주말에 코딩맨님의 포스트부터 보고,,
아이가 로봇에 관심이 많아 같이 하고 싶은데,,제가 너무 부족하네요.

아니네요. 아두이노는 프로그래언어쪽 사람보다는 전혀 상관없는 분들이 많이 다루는 거라서 첨에 접근만 좀 어려워 보일뿐 해당 부품에 사용되는 함수가 정해져 있어서 반복하시면 해당 부품을 제어하는데 어려움이 없을꺼에요.
아이가와 LED(발광다이오드) 켜고 끄는것이나 3색 LED를 다루는 것만 해도 표현할 수 있는게 무궁무진하고 시각적 효과도 높고 재밌을거에요.
구글 검색어 : 3x3x3 큐브 아두이노
이렇게 쳐보세요. led의 응용편이거든요. 아직 포스팅 안했지만 이런걸로 업그레이드 되고요
다시 검색어 : 네오픽셀 아두이노
검색해보세요 동영상들을 보면 진짜 화려하고 시각적 효과가 크고 제어해서 만들어보고 싶은 충동이 느껴질꺼에요.
LED 하나만 제어가 가능하면 3색 LED를 제어할 수 있고 큐브라 나중에 네오픽셀의 응용으로 넘어갈때에 다양한 시각적 작품을 만들어 낼 수 있게 되거든요.

아이들 같은경우는 RC카 아두이노를 검색하시면 동영상으로 30분짜리 제작 과정을 만들어 높은 분들이 많거든요. 만드는 건 별로 어렵지 않고 소스도 오픈소스고 스마트폰 조정어플은 이미 만들어진거 다운받으면 되고요. 제작은 어렵지 않고 아이에게 호기심 유발시키기에는 안성맞춤일꺼에요. 제작비도 얼마 안들고요. RC카는 부품별로 따로 구매하셔서 만드시는게 추천드려요. 키트는 너무 비싸요.

로봇은 모터제어라 로봇키트는 비싸고요.

스크래치를 이용한 아두이노를 검색해보셔서 좀 더 쉬운 방법이 없는지 한번 찾아보세요. 아이의 연령대가 낮으면 스크래치가 좋을 듯 싶네요.
내년 5~6학년부터 코딩의무화 교육이잖아요. 스크래치 vs 엔트리인데 국내니 엔트리를 밀꺼라 생각되네요. 개인적으로는 스크래치를 선호하지만요.
암튼 스크래치를 아이랑 배워보시면 어때요. 레고 블록 쌓기 처럼요 코딩을 블록으로 쉽게 배치만 하면 성인의 이해도면 반나절이면 대충 사용할 수 있을 듯 싶네요.

예전에 어서 본것같은데 구글검색해보니 생활코딩 스크래치 누르시면 이분이 강좌로 만들어 놨는데 초보분들이 보고 따라하시기 좋을 듯 싶네요.
이걸 아이와 같이 해보시는 것을 추천드려요

어디 사세요? ㅋㅋ 너무 감사해요. 종종 help요청드릴께요.

저도 전문적으로 하는게 아니라 재미로 노는 수준이고요 궁금한 것이 있으면 제가 모르면 관련 자료같은거 찾아드릴게요.
진짜 아두이노를 알면 신세계이고 아이 어른할 것 없이 그 응용할 수 있는 영역을 보더라도 실생활의 전부를 응용할 수 있어서 매리트가 있더군요.

오랜만에 들렸습니다. 코딩맨님!! 포스팅의 퀄리티가 점점더 좋아지는군요!! 멋집니다.

오랫만이네요! 가끔 블로그 방문하는데 요새 활동이 뜸하시더군요. 많이 바쁘신가보네요

Coin Marketplace

STEEM 0.16
TRX 0.16
JST 0.029
BTC 68462.20
ETH 2502.02
USDT 1.00
SBD 2.52