메이킹/메이킹 준비

아두이노 I2C LCD 모듈 사용하기

트리맨스 2021. 5. 3. 00:01
반응형

 

아두이노 부품 중에 LCD 패널 모듈이 있다. 이 패널은 16*2의 문자 표현이 가능하며, 데이터 입출력 핀 8개와 기타 핀의 개수를 모두 합하면 총 16개의 핀이 있다. 실제 사용 배선은 12개의 핀이 필요하며, 아두이노를 이용할 경우에는 6개의 배선이 필요하다. 하지만 이 방법은 핀을 많이 잡아먹고 배선이 복잡하다는 단점이 있다. 그래서 대부분의 LCD모듈에는 I2C 컨버터가 필요하다. 

 

 

 

 

따로 구매를 할 필요는 거의 없다. 대부분 LCD를 판매할 때 납땜이 되어서 오기 때문이다. 이 부품의 스펙은 다음과 같다.

 

동작전압 : 5V

I2C 주소 : 0x27, 0x3F

 

이것을 이용해 LCD를 손쉽게 제어할 수 있다. 그 전에 이 모듈을 사용하기 위해서는 I2C 주소를 알아야 한다. 아두이노 wire 라이브러리에 있는 예제를 불러오자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    https://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// Version 6, November 27, 2015.
//    Added waiting for the Leonardo serial communication.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//
 
#include <Wire.h>
 
void setup() {
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial); // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
void loop() {
  int nDevices = 0;
 
  Serial.println("Scanning...");
 
  for (byte address = 1; address < 127++address) {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    byte 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
}
cs

 

아두이노 우노 기준으로 A4, A5 와 (확인해봅시다) 에 연결한다. 각 보드마다 I2C 통신을 위한 포트가 따로 준비되어 있다. 자신이 사용하는 보드의 SCL, SDA를 확인한 다음 위에 있는 코드를 실행하면 I2C 주소가 보여질 것이다. (코드 첨부) I2C의 주소가 맞게 입력되었다면, 정상적으로 문구가 보일 것이다.

 

 

LCD 2개 이상 사용하기


만약 2개 이상의 I2C 기기를 사용하고 싶은데, 주소가 겹치게 된다면 어떻게 해야 할까? 답은 I2C의 주소를 바꾸어 주어 I2C 통신을 지원하는 2개 이상의 기기가 동작하게 하는 것이다. 뒷면에 A0, A1, A2가 쓰여 있는 곳을 보면 주소를 바꿀수 있는 핀이 있다. 이 곳의 양단을 이어주게 되면 주소가 변경된다. 바뀐 주소값은 아래의 표로 나타내었다.

 

주소A0A1A2
0x20 , 0x38000
0x21 , 0x39100
0x22 , 0x3A010
0x23 , 0x3B110
0x24 , 0x3C001
0x25 , 0x3D101
0x26 , 0x3E011
0x27 , 0x3F111

1은 점퍼x, 0은 점퍼o 의 경우이다.

 

이를 이용하여 void setup 안에서 LCD를 정의하는 코드에 약간 수정을 하면 따로 출력이 가능하게 할 수 있다. 하지만 I2C의 특성상 아두이노 및 NodeMcu에서 동작하는 경우에는 속도가 느리다는 느낌이 들 수 있다.

반응형