아두이노프로세싱 프로그래밍

백팩(backpack)PCB 회로를 부착한 I2C인터페이스 1602 lcd 출력

coding art 2017. 12. 15. 18:59
728x90

                                           

 

 

 

16핀을 가지는 1602 lcd 디스플레이는 사용법이 그다지 복잡하지는 않으나 핀 수로 인해 점퍼 선 와이어링 작업이 과한 편이다. 이러한 점퍼 선 작업을 줄이기 위해서 1602 lcd PCB의 뒷면에 백팩(backpack)으로 부착하여 I2C 인터페이스를 사용하는 lcd 로 개조해 보기로 한다. 백팩 PCB는 시중에서 660원의 저렴한 가격으로 구입할 수 있다. 한편 아예 백팩이 부착된 I2C lcd를 구매하는 것도 방법이다.

 

 

I2C 인터페이스의 장점으로는 와이어링에 필요한 전기 배선이 전원선 GND 와 5V, SCL 과 SDA 4개의 점퍼선이면 충분하다. 반면에 아두이노에서 응용 시에 LiquidCrystal_I2C.h  및 Wire.h 라이브러리 사용이 필요하다.

 

 

아래는 16핀 백팩 PCB회로가 납땜되어 있는 lcd의 뒤태이다. 우측 상단에 가변 저항이 1개 부착되어 있는데 이는 lcd의 백라이트 밝기를 조절하기 위함이다.

 

 

아두이노 편집기의 스케치 탭 메뉴의 라이브러리포함하기에서 ZIP  라이브러리 추가를 실행하여 라이브러리 LiquidCrystal_I2C.h 를 설치한다.

 

 

 

i2c 방식으로 lcd를 사용하기 위해서는 Wire.h 라이브러리도 필요한데 이 라이브러리는 아두이노에 디폴트로 설치되어 있으므로 코드 전반부에 그냥 헤더파일을 불러 쓰면 된다.

라이브러리 바로 밑에서 클라스 명령 LiquidCrystal_I2C lcd(0x3F,16,2)을 실행한다.

setup() 문에서 초기화 및 백라이트 제어 명령을 실행한다. 주의할 점은 I2C  인터페이스를 쓸 경우와 쓰지 않을 경우의 중요한 차이점은 초기화 명령이 서로 다르다는 점이다. I2C 인터페이스의 초기화는 lcd.init() 이며 반면에 I2C를 쓰지 않는 경우에는 lcd.begin() 명령을 사용한다.

준비가 되었으면 위 그림의 간단한 코드를 실행보기 바란다. 아울러 코드가 대단히 간단해도 실패할 수 있는데 백팩회로를 부가함에 따라 하드웨어적으로 I2C 주소가 0x27로 변경되어 버린 경우가 있다.

 

 

실제 I2C 인터페이스의 주소 값이 얼마인지 첨부된 i2cscanner 코드를 사용하여 시리얼 모니터에서 확인하도록 하자.

 

i2cscanner

#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("Unknown 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);           // wait 5 seconds for next scan


}//끝