본문 바로가기

Programming/Arduino 아두이노

04. 아두이노 심화 _ 통신 (Communication) / UART, I2C, SPI 통신 예제

이 포스팅은 UNIST Prototyping 동아리 DINO의 이도영님의 아두이노 코딩강좌 내용을 바탕으로 정리하였습니다.

저번 포스팅까지해서 아두이노에 있어서 기초적인 micro-controller와 각종 pin들 그리고 input과 ounput의 작동원리까지 알아보았다.
이번에는 조금 더 나아가서 아두이노는 센서나 actuator 혹은 컴퓨터나 각종 device들과 어떻게 통신하는 지 알아보자.
그러기 위해서 먼저 통신 핀들(communication pin)에 대해서 살펴보면 아래와 같다.

Communication pins (통신 핀들)

UART, I2C, SPI와 같이 다양한 통신 방법들이 있는데 이를 본격적으로 시작하기 전에 먼저 통신 방법에 대해서 알아보자.

이는 크게 parallel 통신과 serial 통신으로 나눌 수 있다.

이름에서도 느껴지다시피, serial 통신은 1:1로 bit단위로 차례로 보내는 통신을 말한다.
반면에, parallel 통신은 8개의 bit를 동시에 주고 받으며 통신하게 된다. 

또한 clock에 맞춰서 데이터를 전송하는 동기식이냐 아니면 따로 속도를 지정해주어야하는 비동기식이냐에 따라 나뉘기도 한다.


위의 통신방법들 중 UART가 대표적인 serial 통신 중 하나이며 동시에 비동기식이다.
앞서 언급했듯이, UART는 비동기식이기 때문에 clock pin이 존재하지 않는다.
따라서 baudrate을 통해서 bit의 전송 속도를 지정해주어야 한다.
9600 baudrate은 1초에 9600개의 bit를 전송한다는 의미이다.

또한 pin을 연결할 때, TX는 transmitter로 전송용 / RX는 receiver로 수신 용으로 TX-RX끼리 연결하여 데이터를 주고 받기가 가능하며 이에 따라 2개의 wire 선이 필요하다.

하지만 이는 생각지 못한 불편함을 초래한다. 바로 이미 통신중인 기기가 있다면 다른 추가적인 통신을 위해 사용가능한 TX RX 핀이 부족하게 되는데, software serial이라는 라이브러리를 활용하여 일반핀을 시리얼 핀으로 사용 가능하게 된다!


또 다른 통신 방법 중 하나는 I2C 통신이다.
이는 inter-integrated-circuit의 약자인데 i가 두개라서 i^2해서  I2C이다. 이름 참 대충 지었다.

I2C는 동기식 통신으로 clock에 맞추어서 데이터를 전송한다.

SCL pin이 Serial Clock을 의미하며, SDA pin이 Serial Data를 의미한다. 

느꼈겠지만, SCL로 Clock끼리 연결해주고 SDA끼리 연결해 서로 data를 주고 받는다.
UART와 달리 1개의 선으로 데이터를 주고 받기 때문에 주고 받는 데이터 사이의 순서가 필요하다.

이 때, 주고받는 메세지에 기기의 address를 할당하여  1:N의 통신이 가능하다.
메세지는 아래처럼 생겼는데 메시지 처음에 address를 할당해주는구나.. 정도만 느끼고 넘어가자.

이제 하나 남은 것은 spi통신이다.  serial peripheral interface의 약자로 역시 동기식이다.

MISO (Master in Slave out)
MOSI (Master out Slave in)
SCK (Serial Clock)
SS (Slave Select)
로 4가지 pin이 존재하며 1:N 통신에서 1개의 master와 N개의 slave들 간의 통신을 설정해준다고 생각하면 된다. 따라서 4개의 wire 선이 필요하며, 연결하긴 다른 것들에 비해 꽤나 까다롭지만 그만큼 빠르다고 생각하면 된다.

연결은 아래의 그림을 참고하자.


저번 포스팅과 마찬가지로 몇가지 예제 코드와 예시들을 보여주며 끝으로 포스팅을 마치겠다.

I2C sensor 예제 코드
SPI sensor 예제 코드
I2C, SPI 센서 예시
 I2C actuator 예시
SPI Actuator 예시