아두이노의 입출력(I/O) 핀을 보다 효율적으로 활용하고 싶다면 I2C에 주목해보시죠~
앱스킷(APPSKIT)은 I2C 통신을 많이 사용합니다.
I2C는 두 개의 신호선(SDA, SCL)으로 다수의 I2C 통신을 지원하는 디바이스와 데이터를 송/수신할 수 있는 통신방식입니다.
하나의 마스터와 다수의 슬레이브로 연결이 구성되며, 마스터에서 기준클럭(SCL)을 생성하고, 이 클럭에 맞춰 데이터(SDA)를 전송 및 수신합니다.
각 송신과 수신은 구분(송신과 수신이 동시에 이루어지지 않음)되어 있는 반이중(Half-Duplex) 방식입니다.
각 슬레이브는 개별 주소(어드레스)를 가지고 있으며, 이 주소를 통해 식별이 가능합니다.
즉, 기준클럭과 데이터는 I2C 네트워크의 모든 디바이스에게 전달되고, 해당 주소를 가진 디바이스만 응답하는 방식으로 서로 데이터를 주고 받습니다.
마스터에서 슬레이브로 1바이트 데이터를 쓸 때 데이터 규격은 다음과 같습니다.
(주황색: 마스터, 흰색: 슬레이브)
마스터에서 슬레이브로 1바이트 데이터를 읽을 때 데이터 규격은 다음과 같습니다.
START BIT는 SCL이 HIGH를 유지하고 있을 때, SDA가 HIGH에서 LOW로 변화하면 START로 인식합니다.
ADDRESS필드는 SCL이 LOW일 때 데이터를 바꾸고, SCL이 HIGH일 때 데이터를 확정합니다.
WRITE 필드는 "LOW", READ는 "HIGH" 입니다.
ACK 필드는 "LOW", NACK는 "HIGH"입니다.
위에서 설명한 내용을 요약하면 I2C의 데이터 규격은 다음과 같습니다.
ATmega328P MCU가 내장된 아두이노(아두이노 우노 외)는 I2C 통신기능을 내장하고 있습니다,
참고로 SDA 핀은 A4(아날로그 4번핀), SCL 핀은 A5(아날로그 5번핀)입니다.
I2C의 기준클럭은 100[kHz]로 설정되어 있습니다.
아두이노 IDE에서 Wire 라이브러리를 사용하면 I2C를 편리하게 사용할 수 있습니다.
관련 주요 라이브러리 함수는 다음과 같습니다.
begin()
beginTransmission(address)
write(value)
read()
requestFrom(address, byte num)
available()
onReceive()
onRequest()
endTransmission()
이상으로 I2C 통신에 대해 살펴보았습니다.
감사합니다.