아두이노의 입출력(I/O) 핀을 보다 효율적으로 활용하고 싶다면 I2C에 주목해보시죠~
앱스킷(APPSKIT)은 I2C 통신을 많이 사용합니다.
I2C는 두 개의 신호선(SDA, SCL)으로 다수의 I2C 통신을 지원하는 디바이스와 데이터를 송/수신할 수 있는 통신방식입니다.
![](https://static.wixstatic.com/media/7eaed3_85ffa7bca2ee4669bd6f7582a1e6e84d~mv2.png/v1/fill/w_49,h_17,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/7eaed3_85ffa7bca2ee4669bd6f7582a1e6e84d~mv2.png)
하나의 마스터와 다수의 슬레이브로 연결이 구성되며, 마스터에서 기준클럭(SCL)을 생성하고, 이 클럭에 맞춰 데이터(SDA)를 전송 및 수신합니다.
각 송신과 수신은 구분(송신과 수신이 동시에 이루어지지 않음)되어 있는 반이중(Half-Duplex) 방식입니다.
각 슬레이브는 개별 주소(어드레스)를 가지고 있으며, 이 주소를 통해 식별이 가능합니다.
즉, 기준클럭과 데이터는 I2C 네트워크의 모든 디바이스에게 전달되고, 해당 주소를 가진 디바이스만 응답하는 방식으로 서로 데이터를 주고 받습니다.
마스터에서 슬레이브로 1바이트 데이터를 쓸 때 데이터 규격은 다음과 같습니다.
(주황색: 마스터, 흰색: 슬레이브)
![](https://static.wixstatic.com/media/7eaed3_6b16f4788cb6464cad32eac3362e80e5~mv2.png/v1/fill/w_49,h_3,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/7eaed3_6b16f4788cb6464cad32eac3362e80e5~mv2.png)
마스터에서 슬레이브로 1바이트 데이터를 읽을 때 데이터 규격은 다음과 같습니다.
![](https://static.wixstatic.com/media/7eaed3_43359be866ee4816a310679eb1a7bf6d~mv2.png/v1/fill/w_49,h_3,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/7eaed3_43359be866ee4816a310679eb1a7bf6d~mv2.png)
START BIT는 SCL이 HIGH를 유지하고 있을 때, SDA가 HIGH에서 LOW로 변화하면 START로 인식합니다.
![](https://static.wixstatic.com/media/7eaed3_04083499d23542b38efbee3c46264c96~mv2.png/v1/fill/w_107,h_67,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/7eaed3_04083499d23542b38efbee3c46264c96~mv2.png)
ADDRESS필드는 SCL이 LOW일 때 데이터를 바꾸고, SCL이 HIGH일 때 데이터를 확정합니다.
![](https://static.wixstatic.com/media/7eaed3_4f0ad6f905704bb6b8d0426af65bee31~mv2.png/v1/fill/w_81,h_41,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/7eaed3_4f0ad6f905704bb6b8d0426af65bee31~mv2.png)
WRITE 필드는 "LOW", READ는 "HIGH" 입니다.
ACK 필드는 "LOW", NACK는 "HIGH"입니다.
위에서 설명한 내용을 요약하면 I2C의 데이터 규격은 다음과 같습니다.
![](https://static.wixstatic.com/media/7eaed3_6b464188f4dc4a669dda51fc91b6054d~mv2.png/v1/fill/w_49,h_11,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/7eaed3_6b464188f4dc4a669dda51fc91b6054d~mv2.png)
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 통신에 대해 살펴보았습니다.
감사합니다.