【 아두이노 센서#6】 I2C (Inter Integrated Circuit) 통신
지난 시간 TMP36 온도센서를 가지고 LCD 디스플레이 장치에 온도를 표시 해보았다. (☞ 온도센서 tmp36 LCD 편), 이때 단 하나 아쉬운 것은 LCD가 패러럴로 아두이노 포트에 연결되고 병렬로 직접 제어를 하다보면 복잡하기도 하고 아두이노 제어포트가 부족한 상황이 발생 한다.
이런 문제는 I2C 통신 모듈이 달려있는 LCD를 연결함으로서 간단히 해결되는데, 오늘은 이런 I2C 통신에 대해 알아보는 시간을 갖도록 하겠다.
▶ I2C 통신
(SDA: Serial DAta, SCL: Serial CLock)
때문에 각 장치마다 고유주소가 필요하고, 주소저장을 위한 레지스터가 존재한다
- 4.7KΩ 권장-빠른 속도의 통신에서는 약 2.2KΩ
- 오픈 드레인의 특성상 오픈 상태에서는 플업 저항 이 없으면 그라운드 상태가 되기 때문이다.
▶ SPI(Serial Peripheral Interface) 통신과의 비교 :
▶ I2C 통신 절차 :
(이미지 클릭하면 확대 가능)
《 I2C 통신 방법 》
《 Read 절차 》
위 LCD 이미지의 뒷 면에 부착된 모듈이 바로 I2C통신을 가능하게 해주는 모듈이다. 최근에는 대부분의 기기에서 I2C 통신 혹은 SPI통신용 모듈이 부착되거나 내장되어 출시되고 있다. 따라서 향후에는 I2C(모듈)를 적극 이용해서 실습을 진행할 예정이다.
▶ 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)
{
if (address<16)
Serial.print("0");
Serial.print("I2C device found at address 0x");
Serial.print(address,HEX);
Serial.println(" ←");
Serial.print("I2C device Dec Number is: ");
Serial.print(address,DEC);
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 스캐너 실행 결과 :
(영상은 고화질로 설정하고 전체화면으로 보세요)
※ 위 시리얼 모티터 상에서 0x48(16진) 혹은 72(10진) 값이 해당 부품의 고유주소가 되며, 이는 부품마다 다를 수 있다.
'아두이노 > 2. 아두이노센서' 카테고리의 다른 글
【 아두이노 센서#8】 시프트 레지스터 이해하기 (Shift Register) (0) | 2018.12.12 |
---|---|
【 아두이노 센서#7】 I2C LCD로 TMP36 온도센서값 출력하기 #3 (0) | 2018.12.11 |
【 아두이노 센서#5】 TMP36 온도센서 #3 with LCD (0) | 2018.12.07 |
【 아두이노 센서#4】 TMP36 온도센서 #2 ( 시리얼 모니터) (0) | 2018.12.06 |
【 아두이노 센서#3】 TMP36 온도센서 #1 (0) | 2018.12.05 |