본문 바로가기
  • 경제적 자유를 얻는 그날까지
엔지니어링/임베디드

[아두이노 기초교육] I2C 통신을 이용한 LCD 제어

by 베니스상인 2020. 2. 2.

LCD 모듈에  대한 기초 전자회로와 아두이노와 주변기기의 연결방법으로 많이 사용하는 I2C(Inter Integrated Circuit) 통신에 대해 알아보고 I2C를 이용하여 LCD 모듈을 제어해본다.

 

1. 회로도 구성

 

 

- I2C 인터페이스가 지원되는 LCD 모듈을 사용한다.

- 전원은 5V, GND를 각각 연결해주고, I2C의 SCL은 아날로그 포트 A4, SDA는 A5에 각각 연결한다.

 

fritzing으로 작성한 브레드보드 구성

 

 

 

2. 회로설명

1) LCD(Liquid Cristal Display)

- 액정(Liquid Crystal)이라는 유체이면서 고체와 같은 광학적 성질을 가지는 물질

- 고체 표면에 전기적 신호를 보내어 액정이 특정방향으로 정렬되면 빛을 차단하거나 투과할 수 있음

 

< 사진 출처 : 삼성 디스플레이 블로그>   

 

 

 

2) 16X2 LCD 모듈

- 16개 문자를 2열로 출력할 수 있는 모듈

- 8bit 데이터버스와 8개의 제어 신호로 구성되어 있어서 총 16개의 핀이  필요함 (I2C 모듈을 이용시 2개핀만 필요)

 

16*2 LCD  / 사진 출처 :   Programming Electronics Academy  

 

16X2 LCD 신호 인터페이스

 

-  

 

3) I2C(Inter Integrated Circuit) 

- 주변장치를 연결하기 위해 필립스사에서 개발한 직렬버스 통신방식이며, SCL,SDA 두 개의 신호로 통신이 가능

- 마스터(아두이노) - 슬레이브간 1:N 방식 연결이 가능함(Address로 구분)

- SPI나 Serial 통신에 비해 속도가 느린편임

- I2C버스는 반드시 Pull-up으로 연결해주어야 함(http://blog.naver.com/PostView.nhn?blogId=cubloc&logNo=220071045671)

 

 

 

4) I2C의 통신구조

- I2C 버스는 기본적으로 Pull-up되어 있으므로 SDA만 Low로 되면 Start가 되고, High가 되면 Stop이 됨

- Start 이후 클럭이 High일때 데이터 값이 결정되어 전송됨

- 데이터는 7bit, 즉, 128개 데이터를 보낼 수 있고 나머지 1bit는 다른 용도(R/W로 사용하고 다음에 Ack 받음

- R/W는 마스터에서 결정

- Ack는 슬레이브 디바이스에서 보냄(슬레이브가 수신했으면  Low)

 

- 마스터에서 쓰기 : Slave Address(W) -> Register Address -> Slave Address(W) -> Data(마스터 씀)

- 마스터에서 읽기 : Slave Address(W) -> Register Address -> Slave Address(R) ->  Data(슬레이브에서 씀)

 

- 디바이스 Address(0x1D)의 레지스터 0x00의 값을 읽은 예제

 

 

 

3. 소스코드

 

I2C 라이브러리를 사용하기 위해 아두이노 스케치에서 라이브러리를 추가한다.

LCD I2C라고 검색하면 아래와 같이 Frank de Brabander의  라이브러리가 검색되면 선택하여 설치한다.

 

 

 

I2C 모듈을 사용하기 위해서는 디바이스의 어드레스를 알아야하는데 아래 소스 코드를 스케치에서 실행하면 어드레스를 찾을 수 있다. 

 

AUNO_Basic_Check_I2C_Address.ino
0.00MB

 

이 소스 코드를 실행하며 I2C 어드레스를 1~128번까지 증가시키면서 드라이버를 찾고, 그 결과를 Serial 통신으로 보내준다. 결과는 스케치의 툴에보면 시리얼 모니터에서 확인할 수 있다. 

 

 

실행 결과를 보면 이 LCD 모듈의 I2C 주소는 0x27인 것을 확인할 수 있다.

 

 

 

AUNO_Basic_05_I2C_LCD.ino
0.00MB

/*****************************************************/
/*  Project   : Arduino Basic Training Course
/*  Title     : 05_I2C_LCD
/*  Descript  : LCD module control using I2C communication example
/*  Platform  : Arduion UNO
/*  IDE: Arduino Sketch 1.6/1.8 or vMicro
/*  Author    : shlee853
/*  History   : Rev 1.0  2020.01.31  - Initial release 
/*
/*****************************************************/

// please include library in arduino scketch before including  
#include  <LiquidCrystal_I2C.h>
#include  <Wire.h>

// modify I2C address after finding your I2C address
LiquidCrystal_I2C lcd(0x27, 16, 2);

int cnt = 0;

void setup() {

  lcd.init();
  lcd.backlight();
}

void loop() { 
  
  if (cnt == 0) {
    lcd.setCursor(0,0);           
    lcd.print("    Hello!!     ");       
    lcd.setCursor(0,1);           
    lcd.print(" -- VoraSky --  ");       
  }
  else if (cnt == 1) {
    lcd.setCursor(0,0);           
    lcd.print("   AUNO Basic   ");       
    lcd.setCursor(0,1);           
    lcd.print("LCD I2C Example!");       
  }
  else if (cnt == 2) {
    lcd.setCursor(0,0);           
    lcd.print("1234567890ABCDEF");       
    lcd.setCursor(0,1);           
    lcd.print("!@#$%^&*()<>?:{}");       
  }
  
  delay(2000);
  lcd.clear();

  cnt++;
  if (cnt>3) cnt = 0;
}

728x90

댓글