아두이노의 통신 방법, 핀 정리 (Serial, UART, Software Serial, SPI, I2C)
아두이노의 통신 방법과 예약된 핀을 정리했습니다. 특별히 보드를 명시하지 않은 경우 핀 번호는 UNO 보드를 기준으로 합니다.
Serial / I2C / SPI 통신 규약에 대한 상세 내용은 아래 링크를 참고하세요.
.
1. Serial(UART) 통신
아두이노의 가장 기본이 되는 통신은 시리얼(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 라이브러리는 다음과 같이 몇 가지 종류가 있습니다.
- AltSoftSerial – Hardware serial 및 다른 라이브러리와의 충돌을 줄이고 여러개의 Serial 통신을 사용할 경우 동신 송신, 수신을 지원합니다. 16bit timer를 사용하기 때문에 같은 타이머를 필요로 하는 다른 라이브러리와 충돌 가능성이 있으며 몇 개의 PWM 핀을 잡아먹는 단점이 있습니다. http://www.pjrc.com/teensy/td_libs_AltSoftSerial.html
- NewSoftSerial (Arduino IDE 1.0 이후 버전만 지원) – Serial 모듈별로 인스턴스를 생성해서 여러개를 사용할 수 있지만 한번에 하나의 인스턴스만 전송/수신 할 수 있습니다. 다른 라이브러리와의 충돌 가능성도 약간 있는 듯 합니다. http://arduiniana.org/libraries/newsoftserial/
- 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개의 핀(또는 홀)이 몰려있는 부분입니다.
SPI 는 이더넷 모듈과 같이 고속 전송이 필요한 모듈을 사용할 때 사용되는게 일반적이며, 아두이노의 부트로더를 굽기위해 2개의 보드를 연결할 때도 사용되어집니다.
#include <SPI.h>
를 선언함으로써 사용할 수 있으며 특정 이더넷 모듈은 개선된 버전의 SPI 라이브러리를 별도로 사용하기도 합니다.