ENC28j60 test.JPG

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

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

 

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 라이브러리는 다음과 같이 몇 가지 종류가 있습니다.

  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개의 보드를 연결할 때도 사용되어집니다. 

 

 

 

About

TORTUGA

궁금하신 점은 새로 개편한 홈페이지의 QnA 게시판을 이용해주세요!!!!!!! http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=qna

11 Responses

  1. Pingback: 오픈소스 스마트 워치 Retro Watch 만들기 (DIY how to) | Hard Copy Arduino

  2. Pingback: 오픈소스 스마트 밴드 RetroBand 만들기 (DIY How-To) | Hard Copy Arduino

  3. 안녕하세요! 포스팅 된 글 잘 읽었습니다! 저는 센서의 RX와 TX를 갈릴레오 보드의 TX와 RX에 연결시켜서 서로 통신하게끔 했는데요, 아두이노를 통해 센서를 통해 얻은 값을 확인 하고 싶은데 스케치예제를 알 수 있을 까요..? 제가 아두이노를 처음 사용 하는 터라 아직 많이 부족합니다 ㅠㅠ

  4. 안녕하세요 소프트웨어 시리얼 2가지 사용하는 글 잘 읽어보았습니다.
    현재 블루투스와 gps를 소프트웨어시리얼에 연결하여 쓰고있는데
    블루투스로 안드로이드앱에서 정보를 보내면 받아오는 것 까지는 되엇는데
    gps 값을 받아오지 못합니다. 분명 listen 을 사용하였는데도 값을 못받아오는데
    혹시 이런 경우가 있으신가요….
    혹시 코드가 필요하시다면 코드도 보내드리겠습니다.

  5. 안녕하세요 글 잘 읽었습니다!
    제가 현재 외장 다수의 eeprom을 아두이노 2개의 핀에 연결해서 동시에 인식시키려고 하는데요
    일종의 블록을 만들고있습니다.
    예를 들자면 블록에 eeprom이 내장되어있고 이 블록이 보드(아두이노 핀)에 접지되면 그 블록을 인식하는 방식인데요, 처음에는 eeprom이 아닌 저항을 통해 시리얼통신으로 시도해봤는데 블록끼리 병렬로 쌓일시 블록의 종류와 쌓일수있는 층이 너무 적어져서 eeprom에 특정 데이터를 저장하여 블록의 종류를 구분시키려고 합니다.
    제가 가장 중요하게 생각하는게 블록을 동시에 쌓을때(예를 들자면 블록 3층을 미리 쌓은뒤 보드에 접지하는 경우)에도 이를 인지하는 것인데
    이 경우가 가능하려면 다른종류의 블록, 또는 같은 종류의 블록이 쌓여있을때 이 블록안에 내장되어있는 eeprom의 데이터를 1층부터 꼭대기층까지 순서대로 하나씩 인식해야 합니다.
    이런 방법이 I2C방식 또는 글에 써주신 다른 방식으로 호환이 되는지 궁금합니다!

  6. UART 통신선 잘 연결 했는데 왜 않될까요?

  7. 유용한 자료에 감사 드립니다.
    혹 Arduino MEGA와 LS산전 PLC MASTER-k80S와 내장 cnet을 할수있는 방법에 대한 자료를 부탁 드릴수있나요?? 부탁드리겠습니다.

댓글 남기기

이메일은 공개되지 않습니다.