본문 바로가기
Arduino(아두이노) 활용 강좌

Arduino Uno 로 I2C 1602/2004 캐릭터 LCD 를 사용해보고 I2C 주소 확인해 보기

by 오마이엔지니어 2018. 5. 1.
반응형

Arduino Uno 로 I2C 1602/2004 캐릭터 LCD 를 사용해보고 I2C 주소 (Address) 확인해 보는 프로젝트 입니다

I2C (Inter-Integrated Circuit) 통신 이란?

I2C 는 필리스에서 개발한 단 2개의 시그널 핀 (SDA, SCL)을 사용해서 간편하게 여러 장치들과
통신할수 있게 해주는 1:N 통신 방법입니다

클럭 시그널을 전송하는 SCL(Serial Clock) , 데이터 전송을 위한 SDA(Serial Data) 2개의 핀을 사용해서
통신할수 있기 때문에 연결이 간단한 반면 전송을 위해서 한번에 하나의 커넥션만을 사용할수 있기 때문에
통신 속도가 느리다는 단점이 있습니다

때문에 고속 데이터 통신이 필요하지 않은 LCD 또는 센서모듈 등을 연결할때 I2C 통신 방법을 주로 사용합니다

I2C 통신 방법을 사용하면 Arduino 가 마스터, LCD나 센서가 슬레이브가 됩니다

I2C 통신에서 SDA 는 데이터를 전송하기 위한 신호이고, SCL은 마스터와 슬레이브를 동기화 하는 역할을 합니다

두개의 핀 SDA 와 SCL의 조합으로 여러개의 디바이스를 제어하게 됩니다

I2C 통신을 위해서는 기본적으로 Software serial 과 마찬가지로 Wire.h 라이브러리를 사용해야 합니다
#include <Wire.h>


더 자세한 내용은 아두이노 "통신에 관하여" 포스팅을 참조하도록 합시다


테스트를 위해서 I2C 1602 & I2C 2004 캐릭터 LCD를 사용하였습니다


<I2C 1602 캐릭터LCD 이미지>

위 이미지 처럼 일반 캐릭터 LCD에 핀헤더 대신 I2C 어댑터를 납땜해서 장착했기 때문에 바닥면을 보면 I2C 어댑터를 확인할 수 있습니다
I2C 어댑터는 일반 캐릭터 LCD를 I2C 통신방식으로 사용할수 있게 하며 전원 LED, 백라이트 설정용 점퍼, 콘트라스트 조절용 가변저항등

으로 구성되어 있습니다

<I2C 어댑터 이미지>



<I2C 1602 LCD 상세사양>


<I2C 2004LCD 상세사양>



사용된 부품
아두이노 우노 (Italy)
I2C 1602 캐릭터 LCD
I2C 2004 캐릭터 LCD

점퍼케이블


구성 배선도-I2C 1602 LCD 출력해 보기




구성 배선도-I2C 2004 LCD 출력해 보기



사용된 예제파일

i2c_Scanner.ino

I2C 1602.txt

I2C 2004.txt


사용된 라이브러리
DM_G_I2C.zip

LiquidCrystal.zip


라이브러리 추가 방법은 Arduino IDE 설치하기 포스팅을 참조해 주세요

테스트방법
먼저 테스트에 앞서서 I2C 주소 (Address)를 확인해야 합니다
I2C 주소는 아두이노 I2C 통신시 사용하는 고유의 주소이지만 장착되는 모듈 (모듈에 소자를 장착해서 주소를 변경시켜 버리는 경우)

에 따라 변할수 있습니다

모듈또는 센서와 연결후에 I2C 스캐너 예제를 사용해서 시리얼 모니터로 I2C 주소를 확인해 줍니다
DM_G_I2C 라이브러리 파일을 설치해 주고, i2c_Scanner.ino 파일을 실행시켜 컴파일 스케치 업로드해 줍니다


Wire.h 와 DM_G_I2C.h 라이브러리를 사용하는것을 알수 있습니다
시리얼 모니터를 실행시켜주면



위 이미지 처럼 1개의 디바이스 0X27 I2C address 를 찾았다는 메세지를 확인할수 있습니다
기본 I2C 주소 0X27 을 사용하는것을 알수 있습니다
다만 1602 & 2004 LCD는 생산업체 또는 생산버전에 따라서 I2C 주소가 0X3F , 0X38 인 제품도 수입되어 유통되고 있으니 I2C 스캐너 예제로
잘 확인해서 테스트 해야 겠습니다

프로젝트 동영상-I2C Scanner 예제를 사용해 I2C 주소 확인해 보기


I2C 주소 확인이 끝났으면 위 첨부된 배선도를 참조해서 1602 또는 2004 LCD를 배선 합니다
최신 버전의 아두이노 우노 이태리 정품이나 호환보드를 사용한다면 A4, A5 대신에 오른쪽 제일위에 추가된 두개의 핀

SDA, SCL 핀에 연결해 주어도 무방합니다

배선후 첨부된 I2C 1602 또는 I2C 2004 예제를 스케치 업로드 해 줍니다

만약 위 첨부된 라이브러리 말고 기존에 본인의 컴퓨터에 설치되어 있던 구버전의 "LiquidCrystal_I2C" 라이브러리를 그대로 사용한다면
아두이노 IDE 버전에 따라
C:\Users\sam\Desktop\Arduino\libraries\LiquidCrystal\I2CIO.cpp:35:26: fatal error: ../Wire/Wire.h: No such file or directory

 #include <../Wire/Wire.h>
위와 같은 컴파일 에러 메세지를 확인할수 있을 것 입니다
이 경우 I2CIO.cpp 파일을 열어서 #include <../Wire/Wire.h> 을 삭제하고 #include <Wire.h> 로 수정을 해주어야 합니다

본 포스팅에 첨부된  "LiquidCrystal" 라이브러리는 위 부분 수정이 되어있고 아두이노 IDE 1.8.5 버전에서
정상적으로 컴파일 되었습니다

더 자세한 내용은 아래 아두이노 포럼 링크를 확인해 주세요
https://forum.arduino.cc/index.php?topic=385496.0


I2C 1602 예제코드를 살펴보면
--------------------------------------------------------------------------------------------------------------------------------
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// initializes display no address 0x27
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);

--------------------------------------------------------------------------------------------------------------------------------
Wire.hLiquidCrystal_I2C.h 라이브러리를 사용합니다
만약 I2C 주소가 0X3F 라면
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); 이 부분을
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7,3, POSITIVE); 로 바꾸어 줍니다


--------------------------------------------------------------------------------------------------------------------------------
void loop()
{
  lcd.setBacklight(HIGH);
  lcd.setCursor(0,0);
  lcd.print("RJ Technology !!");
  lcd.setCursor(0,1);
  lcd.print("LCD module I2C");
  delay(1000);
  lcd.setBacklight(LOW);
  delay(1000);
}
--------------------------------------------------------------------------------------------------------------------------------
lcd.print("RJ Technology !!");
lcd.print("LCD module I2C");

LCD에 출력되는 문자를 수정할수 있습니다, 이부분을 원하는 대로 수정해서 LCD에 출력해 봅시다


I2C 2004 예제코드를 살펴보면 1602 LCD 예제와 마찬가지로 Wire.hLiquidCrystal_I2C.h 라이브러리를 사용합니다
--------------------------------------------------------------------------------------------------------------------------------
// set the LCD address to 0x27 for a 20 chars 4 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
--------------------------------------------------------------------------------------------------------------------------------
만약 I2C 주소가 0X3F 라면
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 이부분을
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 로 바꾸어 줍니다

--------------------------------------------------------------------------------------------------------------------------------
  // NOTE: Cursor Position: Lines and Characters start at 0 
  lcd.setCursor(3,0); //Start at character 4 on line 0
  lcd.print("Hello, world!");
  delay(1000);
  lcd.setCursor(2,1);
  lcd.print(" From Arduino!");
  delay(1000); 
  lcd.setCursor(0,2);
  lcd.print("20 by 4 Line Display");
  lcd.setCursor(0,3);
  delay(2000);  
  lcd.print("  by RJ Technology");
  delay(8000);
  // Wait and then tell user they can start the Serial Monitor and type in characters to
  // Display. (Set Serial Monitor option to "No Line Ending")
  lcd.setCursor(0,0); //Start at character 0 on line 0
  lcd.print("Start Serial Monitor");
  lcd.setCursor(0,1);
  lcd.print("Type chars 2 display"); 
--------------------------------------------------------------------------------------------------------------------------------

lcd.print("Hello, world!");
lcd.print(" From Arduino!");
lcd.print("20 by 4 Line Display");
lcd.print("  by RJ Technology");
lcd.print("Start Serial Monitor");
lcd.print("Type chars 2 display"); 

LCD에 출력되는 문자를 수정할수 있습니다, 이부분을 원하는 대로 수정해서 LCD에 출력해 봅시다

프로젝트 동영상-I2C 1602 LCD 출력해 보기


프로젝트 동영상-I2C 2004 LCD 출력해 보기


i2c_Scanner.ino
0.0MB
DM_G_I2C.zip
0.0MB
I2C 2004.txt
0.0MB
LiquidCrystal.zip
0.44MB
I2C 1602.txt
0.0MB
반응형

댓글