개발자/Arduino

아두이노 I2C LCD로 문자 출력하기

지구빵집 2022. 10. 25. 11:39
반응형

 

스마트하고 태도가 바른 아이들과 함께 하는 시간은 남자에게 더욱 즐거운 시간이다. 새로운 것을 배우는 아이들의 반짝이는 것만큼 남자의 가슴은 약간 흥분되고, 무슨 일이 일어나는지 눈을 크게 뜨고 지켜본다. 성장은 아이들과 남자 둘에게 동시에 일어나는 일이다. 

 

사물이나 현상, 아니면 사용법을 배울 때 처음부터 전체를 다 알아야 한다고 생각하고, 크게 볼 생각을 주고 하기 때문에 대부분 일찍 포기하고, 엄두가 안 나서 그만두고 힘들어서 중단하게 된다. 무엇인가를 설명할 때도 어디부터 어떻게 해야 할지 생각만 하다가 시간은 가고 시작도 못하고 생각에 몰두한다. 이것이 바로 실패의 전조다. 끝까지 가지도 못할 뿐만 아니라 시작도 못한다. 이것이 대대분 사람이 늘 반복하지만 뚜렷한 성과를 내지 못하는 이유다. 가장 작게 시작하라는 이야기는 질릴 정도로 많이 들었지만 그것을 실행으로 옮기고 몸으로 익히는 사람은 드물다. 남자는 적어도 이제는 몸으로 익혔다고 생각하지만 아직도 멀었다. 이렇게 더디게 배워서 언제 원하는 것들을 가질 수 있을까?

 

 

I²C(아이투씨, 아이 스퀘어드 시, Inter-Integrated Circuit)는 필립스에서 개발한 직렬 버스이다. 머더보드, 임베디드 시스템, 휴대전화 등에 저속의 주변 기기를 연결하기 위해 사용된다. 설계 I²C는 풀업 저항이 연결된 직렬 데이터(SDA)와 직렬 클럭(SCL)이라는 두 개의 양 방향 오픈 컬렉터 라인을 사용한다. 최대 전압은 +5V며, 일반적으로 +3.3 V 시스템이 사용되지만 다른 전압도 가능하다. 자세한 기술적 사양은 위키백과를 참고한다.

 

i2c는 각 슬레이브에게 할당된 주소를 가지고 제어하며, 최대 112개의 슬레이브 노드를 연결할 수 있다. 아래 이미지는 슬레이브로 다중 연결한 i2c 인터페이스를 보여준다.

 

i2c 인터페이스

 

오늘은 i2c 인터페이스를 가진 2줄 16글자 캐릭터 LCD에 문자를 나타내는 실습을 한다. I2C LCD란 아두이노 프로젝트 제작에 있어 가장 보편적으로 사용되는 디스플레이 장치다. LCD는 16*2 Character LCD로서 1줄에 16개의 문자씩 총 2줄에 문자를 표기할 수 있는 LCD입니다. 대부분의 16*2 LCD는 5V 전원을 통해 Backlight를 동작시킬 수 있으며, 가변 저항을 통해 문자의 명암(선명도)을 조절할 수 있습니다.  

 

 

16*2 Character LCD

 

위 그림과 같이 16*2 Character LCD를 사용하기 위해서는 총 12개의 배선이 필요하며, 문자의 선명도 제어를 위해 가변 저항을 추가적으로 연결해주어야 하기 때문에 사용하기 어렵습니다. 또한 아두이노와 연결하여 제어할 경우 총 6개의 digital Pin을 사용해야 하기 때문에 다양한 센서와 기타 부품을 사용할 경우에는 digital port 부족으로 사용에 한계가 있습니다. 이런 문제들을 개선하고자 개발된 모듈이 바로 I2C LCD 모듈입니다.  

 

 

I2C LCD 모듈(I2C Converter)의 경우 기존의 16*2 Character LCD에 결합하여 사용할 수 있는 breakout board 형태의 모듈입니다. 모듈 단일 제품으로 판매하는 경우는 거의 없으며, LCD와 납땜되어 판매되는 경우가 대부분입니다.

 

I2C LCD 모듈(I2C Converter)을 사용하면 I2C interface를 사용해 LCD 제어가 가능해지며, 총 4개의 배선으로 아두이노에 연결이 가능합니다. I2C interface를 사용하기 때문에 아두이노에 연결하여 제어할 경우 두 개의 AnalogPin(SDA, SCL)으로 제어가 가능합니다. 지니어스 키트에서 사용하는 I2C LCD(I2C Converter)의 사양은 아래와 같습니다.

 

- 1줄 16개 문자, 2줄 제어 가능.

- 동작 전압 : 5V

- i2C 주소(Address) : 0x20, 0x27, 0x3F

- 문자 선명도 : 가변 저항을 통해 문자의 선명도 조절 가능

- backlight : 점퍼 스위치를 통해 backlight On / Off

- 크기 : 41.5mm * 19mm * 15.3mm(L * W * H) 

 

아래는 아두이노 보드와 연결도입니다.

 

 

아래 이미지를 참조하여 아두이노 IDE 환경에서 라이브러리를 설치합니다. 어떠한 센서나 액츄에이터를 사용할 때 필요한 라이브러리는 아래 방식으로 설치합니다. 같은 기능을 하는 다양한 라이브러리가 존재하지만 실습에는 반드시 표기된 이름으로 검색을 하여 동일한 라이브러리를 설치해야 합니다.

 

 

설치를 하였다면 i2c 인터페이스를 사용하는 부품의 주소를 알아야 합니다. 아래는 i2c LCD의 주소를 알려주는 코드이고 다른 i2c 인터페이스를 가진 센서를 연결할 경우 동일한 방식으로 주소를 알려줍니다. 그래야 프로그램이 제대로 동작합니다.

#include <Wire.h>

void setup()
{
  Wire.begin();

  Serial.begin(9600);
  while (!Serial);           
  Serial.println("\nI2C Scanner");
}

void loop()
{
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknow error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }

  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
  delay(5000);
}

 

아래는 출력 결과입니다.

 

i2c LCD 주소 확인

 

그럼 이제 샘플 문자를 출력하는 소스코드입니다. 주의할 점은

 

* 코드 윗부분에 LiquidCrystal_I2C lcd(0x3F, 16, 2); 이 코드에서 0x3F를 위에서 찾은 자신의 I2C_LCD 주소로 바꿔 주셔야 LCD가 정상 동작합니다!!

 

* 코드에 I2C주소를 제대로 입력한 후에도 I2C_LCD에 글자가 출력되지 않으면 뒤에 가변저항을 돌려 LCD 문자 선명도를 조절해 보세요!

 

 

/*
 제목		: I2C LCD에 문자 출력하기
 내용		: I2C LCD에 원하는 문자를 표시해 봅니다.  
 */

// LCD를 쉽게 제어하기 위한 라이브러리를 추가합니다.
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

// 0x3F I2C 주소를 가지고 있는 16x2 LCD객체를 생성합니다.(I2C 주소는 LCD에 맞게 수정해야 합니다.)
LiquidCrystal_I2C lcd(0x3F, 16, 2);

// 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
// 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
void setup() {
	// I2C LCD를 초기화 합니다..
	lcd.init();
	// I2C LCD의 백라이트를 켜줍니다.
	lcd.backlight();
}

// setup() 함수가 호출된 이후, loop() 함수가 호출되며,
// 블록 안의 코드를 무한히 반복 실행됩니다.
void loop() { 
	// random 함수를 사용하여 0부터 2까지의 숫자중 랜덤하게 값을 받습니다.
	int value = random(0, 3);
	// 랜덤 값이 0이라면 아래의 조건을 실행합니다.
	if (value == 0) {
		// 0번째 줄 0번째 셀부터 입력하게 합니다.
		lcd.setCursor(0,0);		    		// 0번째 줄 0번째 셀부터 입력하게 합니다.
		lcd.print("  KocoaFab.cc  ");     	// 문구를 출력합니다.
	}
	// 랜덤 값이 1이라면 아래의 조건을 실행합니다.
	else if (value == 1) {
		lcd.setCursor(0,1);		    		// 1번째 줄 0번째 셀부터 입력하게 합니다.
		lcd.print("  Hello World!!  ");   	// 문구를 출력합니다.
	}
	// 랜덤 값이 2이라면 아래의 조건을 실행합니다.
	else if (value == 2) {
		// 0번째 줄 0번째 셀부터 입력하게 합니다.
		lcd.setCursor(0,0);
		// 아래의 문장을 출력합니다.
		lcd.print("  KocoaFab.cc  ");
		// 1번째 줄 0번째 셀부터 입력하게 합니다.
		lcd.setCursor(0,1);
		// 아래의 문장을 출력합니다.
		lcd.print("  Hello World!!  ");
	}
	// 1초간 대기합니다.
	delay(1000);
	// LCD의 모든 내용을 삭제합니다.
	lcd.clear();
}

 

여기까지 고생하셨습니다. 수고한다는 말은 윗사람이 아랫사람에게 하는 말이고 예의를 갖춘 표현은 고생한다는 말이라고 합니다. 오늘 가장 못생기고 어렵고 반드시 해야만 하는 개구리를 막 삼켰습니다. 이젠 놀아야죠? ^^

 

참고

i2c LCD 문자 출력 - 코코아 팹

 

 

 

반응형