아두이노 통신방법 정리 (Serial / UART / Software Serial / SPI / I2C)

2018. 6. 7. 12:50HARDWARE/Arduino

아두이노의 통신 방법과 예약된 핀을 정리했습니다. 특별히 보드를 명시하지 않은 경우 핀 번호는 UNO 보드를 기준으로 합니다.

 

1. Serial(UART, Universal Asyncronous Receiver/Transmitter) 통신

아두이노의 가장 기본이 되는 통신은 시리얼(Serial or UART) 통신입니다.

시리얼 통신은 프로세서에서 병렬로 한번에 처리되는 데이터를 외부 전송을 위해 직렬 데이터 스트림으로 바꿔서 통신을 하게됩니다.

시리얼 통신은 두 기기간의 1:1 통신입니다.

아두이노와 PC의 통신도 시리얼 통신을 기본으로 합니다. 다만 아두이노와 PC의 동작전압이 서로 틀리기 때문에 이것을 보정해 줄 변환칩이 필요합니다. USB 통신 칩이 기본으로 내장된 UNO, Mega, Nano 등의 보드에서는 USB 케이블로 PC와 연결하기만 하면 Serial 통신을 기본으로 사용할 수 있으며 아두이노 Serial monitor 창을 통해 수신받은 데이터를 볼 수 있습니다. 하지만 아두이노 Pro mini 와 같이 USB 변환 칩이 없는 경우는 별도의 USB to UART 변환 모듈을 구입해서 연결해줘야 합니다.

아두이노 - 아두이노 간에 Serial 연결을 할 경우는 별도의 변환 칩이 필요치 않으므로 TX-RX, RX-TX 핀을 서로 크로스해서 연결하면 통신이 가능합니다.

아두이노 내부적으로 Serial TX(전송), RX(수신) 용도로 아두이노 Digital 1번(TX), 0번(RX) 핀을 사용합니다. 따라서 Digital 0번, 1번 핀에 다른 모듈을 연결하고 조작할 경우 Serial 통신 함수를 함께 사용할 수 없습니다. 보통 디지털 0번, 1번 핀 외에 TX, RX  핀이 추가로 달려 있는데 내부적으로는 디지털 0번, 1번과 공유된 핀입니다.

아두이노의 Serial 통신 예약 핀(UNO 보드 기준) : Digital 0번(RX), 1번(TX)

Mega 보드는 4개의 시리얼 연결을 지원 :

Serial: 0 (RX) and 1 (TX); Serial 1: 19 (RX) and 18 (TX); Serial 2: 17 (RX) and 16 (TX); Serial 3: 15 (RX) and 14 (TX)

Serial 을 이용하기 위해 특별히 라이브러리를 설치할 필요는 없습니다. 기본 클래스로 제공되기 때문에 Serial.begin(); 등과 같이 사용하면 됩니다. 표준 스트림 클래스를 상속하므로 read(), write(), print() 등의 함수명을 사용할 수 있습니다.

 

 

2. Software serial

Built-in 된 Serial 통신용 0, 1번 핀 외에 다른 디지털 핀으로 Serial 통신을 원할 경우 Software Serial 을 사용합니다. Serial 통신을 두 개의 디지털 핀으로 가능하게 해주는 라이브러리를 사용하는 방식입니다. 블루투스 모듈의 예제를 보면 이 방식으로 구현되어 있습니다. 물론 Built-in 된 Serial 핀으로 블루투스를 연결해도 되지만 이 경우 PC와의 통신이 안돼서 디버깅 하기가 곤란해집니다.

SoftwareSerial 라이브러리 중 일부는 직접 [아두이노 설치폴더/libraries] 폴더에 복사하고 아두이노 IDE를 끄고 다시 실행시켜줘야 사용할 수 있습니다. SoftwareSerial 라이브러리는 다음과 같이 몇 가지 종류가 있습니다.

  1. AltSoftSerial - Hardware serial 및 다른 라이브러리와의 충돌을 줄이고 여러개의 Serial 통신을 사용할 경우 동신 송신, 수신을 지원합니다. 16bit timer를 사용하기 때문에 같은 타이머를 필요로 하는 다른 라이브러리와 충돌 가능성이 있으며 몇 개의 PWM 핀을 잡아먹는 단점이 있습니다. http://www.pjrc.com/teensy/td_libs_AltSoftSerial.html
  2. NewSoftSerial (Arduino IDE 1.0 이후 버전만 지원) - Serial 모듈별로 인스턴스를 생성해서 여러개를 사용할 수 있지만 한번에 하나의 인스턴스만 전송/수신 할 수 있습니다. 다른 라이브러리와의 충돌 가능성도 약간 있는 듯 합니다. http://arduiniana.org/libraries/newsoftserial/
  3. Old SoftwareSerial (Arduino IDE 0023 이전 버전) - 초기 SoftwareSerial 라이브러리로 상대적으로 퍼포먼스가 느립니다. 아두이노 IDE 구 버전도 지원합니다. http://arduino.cc/en/Reference/SoftwareSerial

SoftwareSerial 라이브러리는 인터럽트를 사용합니다. PCINT 적용 가능한 핀으로 연결해야 합니다. 아두이노 우노 기준으로 디지털 2번(INT0), 3번 핀(INT1)입니다. 메가에서는 2(INT0), 3(INT1), 21(INT2), 20(INT3), 19(INT4), 18(INT5) 번 핀 입니다. "Pin change"를 이용해 인터럽트 핀을 맵핑 가능하다고 하는데 실험해 보진 못했습니다. 자세한 사항은 (여기 혹은 여기서) 확인하세요.

 

3. I2C (Inter-Integrated Circuit)

I2C는 필리스에서 개발한, 시그널 핀 2개를 사용해서 여러 장치들과 통신하게 해주는 1:N 통신 표준입니다. TWI(Two Wire Interface), eye-squared-see, Inter IC Control 이라고도 불립니다.

클럭 시그널을 전송하는 SCL(Serial CLock) 핀과 데이터 전송을 위한 SDA(Serial DAta) 핀을 사용합니다. 연결이 간단한데 비해 데이터 전송을 위해 하나의 커넥션만 사용하므로 데이터는 한번에 한 방향으로만 전송됩니다. 양방향 전송을 할 경우 속도가 느려지는 단점이 있습니다. 고속의 데이터가 필요치 않은 센서 모듈들을 연결할 때 자주 사용됩니다.

아두이노가 I2C 마스터가 되고 다른 모듈들이 I2C 슬레이브가 됩니다. I2C 슬레이브들은 고유의 식별 ID(Address)를 가지고 있으며 이 address 를 통하여 원하는 모듈에 데이터를 전송합니다.

아두이노 UNO 에서는 I2C 용으로 SDA-Analog 4번 핀, SCL-Analog 5번 핀이 예약되어 있습니다. Mega 보드에서는 SDA-Digital 20번, SCL-Digital 21번 핀이 예약되어 있습니다.

보통 I2C를 지원하는 디바이스는 다음의 4핀을 가지고 있습니다. VCC / GND / SDA / SCL.

I2C 통신을 위해서는 전용 라이브러리를 설치해야 합니다. #include <Wire.h> 를 선언함으로써 사용할 수 있으며 표준 스트림 클래스를 상속하므로 read(), write(), print() 등의 함수명을 사용할 수 있습니다.

 

4. SPI (Serial Peripheral Interface)

SPI는 고속으로 1:N 통신을 위한 프로토콜입니다. I2C와는 달리 INPUT, OUTPUT 커넥션이 분리되어 있어서 동시에 읽기, 쓰기를 할 수 있으므로 빠른것이 장점입니다. Micro-controller 들 간의 통신에도 사용이 가능합니다. I2C 처럼 하나의 마스터 디바이스(보통 아두이노 보드)가 있고, 여기서 다른 슬레이브 디바이스를 컨트롤 합니다.

아래와 같은 라인들이 통신을 위해 사용되는 공통 라인입니다.

  • MISO (Master In Slave Out) - 마스터로 데이터를 전송하는 핀
  • MOSI (Master Out Slave In) - 마스터에서 디바이스로 전송
  • SCK (Serial Clock) - 데이터 전송의 동기화를 맞추기 위해 마스터가 생성하는 clock pulse. 

아래라인은 슬레이브 선택을 위해 사용되는 라인입니다.

  • SS (Slave Select) - 마스터가 특정 디바이스를 활성화/비활성화 하기 위해 사용되는 디바이스 상의 핀

 

아래는 보드별로 예약된 핀 번호입니다.

Arduino Board MOSI MISO SCK SS (slave) SS (master)
Uno or Duemilanove 11 or ICSP-4 12 or ICSP-1 13 or ICSP-3 10 -
Mega1280 or Mega2560 51 or ICSP-4 50 or ICSP-1 52 or ICSP-3 53 -
Leonardo ICSP-4 ICSP-1 ICSP-3 - -
Due ICSP-4 ICSP-1 ICSP-3 - 4, 10, 52

ICSP 핀은 우노 보드에 아래와 같이 6개의 핀(또는 홀)이 몰려있는 부분입니다.

ICSPHeader

SPI 는 이더넷 모듈과 같이 고속 전송이 필요한 모듈을 사용할 때 사용되는게 일반적이며, 아두이노의 부트로더를 굽기위해 2개의 보드를 연결할 때도 사용되어집니다. 

#include <SPI.h> 를 선언함으로써 사용할 수 있으며 특정 이더넷 모듈은 개선된 버전의 SPI 라이브러리를 별도로 사용하기도 합니다.

 

출처 : http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=lecture_pract&wr_id=1&page=2

 

 

항목
UART
SPI
I2C
전체 이름
Universal Asyncronous Receiver/Transmitter
Serial Peripheral Interface
Inter-Integrated Circuit
Interface Diagram
 

 
 
 
TxD: Transmit Data
RxD: Receive Data
SCLK: Serial Clock
MOSI: Master Output, Slave Input
MISO: Master Input, Slave Output
SS: Slave Select
SDA: Serial Data
SCL: Serial Clock
Data Rate
데이터 전송 속도
비동기(asynchronous) 통신이기 때문에 공유하는Clock  없어서 통신하는 양쪽 기기의 속도를 동일하게 맞춰 주어야 한다동일하지 않아도 통신이 되는 경우가 있지만 의도하지 않은 데이터가 들어갈경우가 있다
Maximum 통신 속도는 Model 에 따라 다르며, 일반적으로 115,200bps 이다.
SPI에서 최대 데이터 속도는 정해져 있지 않다보통10Mbps 에서 20Mbps 사이 이다.
I2C 100Kbps400Kbps3.4Mbps  주로 사용하며10Kbps  1Mbps 사용하는 경우도 있다.
Distance 거리
5미터 이하
가장 길다.
길다.
Type of communication
통신의 종류
비동기
통신을 하는 기기가 같은 clock 공유하지 않는다는의미로통신하는  기기가 동일한 속도를 맞춰야한다편리한 점은 속도만 맞추면 어떤 기기와도 통신이 가능하다는 
동기
같은 clock 사용하여 통신을 한다는 의미로개발 단계에서 연결이 되어야 한다.
동기
Number of masters
Master 없다각자 주고(Tx), 받는(Rx) .
Master  하나이며 변하지 않는다.
Master 하나 이상이   있다.
Clock
공유하는 Clock 없다 기기는 각자의 Clock사용하며 통신 시에는 동일한 데이터 전송 속도를설정하여 송수신 해야 한다.
Master Slave들은 동일한 Clock 사용한다.
Master들과 Slave들은 동일한 클럭을 사용한다.
Hardware Complexity
가장 복잡하지 않다.
복잡하지 않다.
복잡하다.
Protocol
Data 8bit 보내며 앞에 Start bit 뒤에 Stop bit 붙인다.
통일된 Protocol 있지 않다그래서 해당 기기의datasheet 참조해야 한다예를 들어 microcontrollerEEPROM 통신을 한다면 EEPROM  datasheet 봐야 한다.
Start bit Stop bit 사용하며 데이터는 8bit 전송한다8bit 보내고 나면 (slave?) ack 사용하여 데이터가  받아졌는지를 확인한다아래 그림에 표시 되어있다.
 
Software addressing
1:1 통신만을 하기 때문에 addressing 필요 없다.
Master에는 slave 개수만큼 slave select 라인이 있기 때문에 해당 line 통해서 slave 선택한다.
다수의 master 다수의 slave 존재하고 master모든 slave 접근할  있다. 27개의 slave까지 지원이 되며 master 고유 주소값을 통해 접근한다.
장점
하드웨어가 간단해서 거의 모든 장치에서 UART지원하기 때문에 (9개의 핀이 연결되거나, USB 있는 장치라면편리하다. RS232 라고도 불린다. RS232 protocol 이름이며 UART 그것을 가능하게  주는 송수신기를 의미하기 때문이다.
간단한 프로토콜이기 때문에 구현하는데 어렵지 않다. Full duplex(전체 동시 송수신전이중통신을 지원한다.
나뉘어진 slave select 라인이 있기 때문에 같은 종류의 칩들이 회로에 사용될  있다.
SPI push-pull 사용하기 때문에 높은 데이터 전송률을가지며  거리도 가능하다.
SPI I2C 비교하면 적은 파워를 사용한다.
Open collector(?) 디자인이기 때문에 slew rate(출력 전압의 최대 변화율모양이 이상해 지는 ) 제한적이다.
  이상의 master 가능하다.
선이   필요하다.
Addressing 하는 방법이 간단해서 SPI 같이 여러 라인이필요하지 않다.
Open collector bus concept 가지고 있어 busvoltage  유연(다른  voltage level 가능)하다.
Flow control 사용한다. (ack 말하는 )
Mixed speed 가 가능하다(Link)
단점
1:1 통신만 지원한다.
동일한 속도를 맞추고 시작해야 한다그렇지 않으면데이터가 깨질 것이다.
Voltage level 이 동일해야 한다.
Slave 많아지면  slave 라인이 필요하기 때문에hardware 구성이 복잡해진다.
만약 slave 추가 된다면 선을 새로 연결해야 하며addressing 위해 software 디자인이 변경되어야 한다.
Master slave 고정되어 있기 때문에 I2C에서 하는 것처럼 역할 변경을   없다.
Flow control   없다.
Voltage level 이 동일해야 한다.
Master slave 많아지면 복잡성이 증가한다.
I2C  half duplex(반이중이다 말은 하나의  SDA 통해서 Data  방향으로   있지만 한번에는 하나의 데이터만 간다는 뜻이다UART 항상  방향으로만 가는데 반해  이중은 동시는 아니지만  방향이 가능하다.
참조
RS232 Interface>>
UART는 회로를 의미하는 단어로, 일반적으로 EIA RS-232, RS-422, RS-485와 같은 통신 표준과 함께 사용한다.