2018. 6. 7. 12:50ㆍHARDWARE/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 라이브러리는 다음과 같이 몇 가지 종류가 있습니다.
- 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 라이브러리를 별도로 사용하기도 합니다.
출처 : 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는 100Kbps, 400Kbps, 3.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를 참조해야 한다. 예를 들어 microcontroller와EEPROM의 통신을 한다면 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를 가지고 있어 bus의voltage 가 유연(다른 voltage level 가능)하다.
|
단점
|
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와 같은 통신 표준과 함께 사용한다. |
'HARDWARE > Arduino' 카테고리의 다른 글
아두이노 시작하기 (0) | 2018.06.11 |
---|---|
아두이노 인터럽트 기능 정리 (2) | 2018.06.08 |
아두이노 보드 종류 별 특징 정리! (정리중) (0) | 2018.06.07 |
[아두이노 강좌] 1. 소프트웨어 프로그래밍 교육의 필요성 (0) | 2018.03.14 |
아두이노 우노 호환보드 드라이버 설치 (CH340) (0) | 2018.03.14 |