출처
[아두이노 강좌] 17. Serial 통신(3) - 유용한 기능들
- 우리는 이미 Serial(시리얼)을 사용해 본 적이 있다. 앞서 digitalRead() 함수를 설명할 때도 사용했었고, analogRead() 함수를 설명할 때도 사용했었다.
- 다음은 ‘AnalogReadSerial’ 예제.
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue);
delay(100);
}
- 저렇게 써준 후 아두이노 스케치의 시리얼 모니터를 실행하면 화면에 읽어 들인 센서의 측정 값이 숫자로 나타나는 것을 볼 수 있었다. 시리얼 통신을 사용하여 PC로 데이터를 전송하고 PC는 수신된 데이터를 시리얼 모니터 화면에 출력한 것이다.
- 자, 그럼 시리얼 통신이 뭐야?
- 시리얼(Serial)의 뜻은 ‘직렬’이다. 직렬? 그럼 병렬도 있나? 있다, ‘Parallel(패러럴)’. 직렬 통신과 병렬 통신. 두 가지 모두 하나의 기기가 다른 기기와 데이터를 주고 받기 위해 만들어진 통신 방법이다.
- 8비트(한 비트는 하나의 0 또는 1) 데이터를 하나 보낸다고 할 때, 8개의 데이터 선을 사용해서 각각의 선에 비트 하나씩 한 번 보내는 방법이 병렬 통신이고, 하나의 데이터 선을 사용해서 8개의 비트를 하나씩 차례로 보내는 방법이 직렬 통신이다. 다음 그림은 ‘100(십진수)’이라는 값을 병렬 통신과 직렬 통신 방법으로 전송하는 것을 그림으로 나타낸 것이다.
- 그림에서 나타나있다시피 병렬이든 직렬이든 LOW, HIGH 신호를 이용해 0과 1의 데이터만을 보낼 수 있기 때문에 데이터는 2진수 값으로 변환하여 전송된다.
- 사실 시리얼 통신이라는 말은 직렬 방식으로 데이터를 주고 받는 모든 통신을 통틀어 말하는 것이고, 여기서 설명하려는 방식은 그 중에 하나인 UART(Universal Asynchrounous serial Receiver and Transmitter) 통신 방식이긴 하지만 아두이노에서는 UART 통신을 “Serial”이라는 객체로 정의해뒀기 때문에 그냥 시리얼 통신이라고 설명하겠다.
- 시리얼 통신 방식의 종류에 대한 설명은 이 글 마지막에 "*참고"로 접어 뒀으니 궁금하면 참조.
- 시리얼 통신은 데이터 전송을 위한 선(TX) 하나와 수신을 위한 선(RX) 하나로 이루어진다. 대부분의 아두이노 보드에서는 0번과 1번 핀을 시리얼 통신을 위한 핀으로 사용하며, 메가(Mega 2560/ADK)의 경우에는 여기에 3쌍의 핀(14~19번 핀)이 추가되어 총 4쌍의 시리얼 통신 핀을 가지고 있다.
- ‘TX’라고 표시된 핀이 아두이노 보드에서 데이터를 전송할 때 사용하는 핀이며, ‘RX’라고 표시된 핀이 아두이노 보드가 데이터를 수신할 때 사용하는 핀이다. 뒤에 붙어 있는 숫자는 시리얼 포트의 번호이고, 메가(Mega 2560/ADK)일 경우에 0~3번까지 총 4개의 포트가 있다. 우노(Uno)의 경우에는 0번밖에 없다.
- 0, 1번 핀은 USB to Serial 기능을 하는 칩과 연결되어 있어서 USB 케이블을 통해 아두이노에서 PC로 데이터를 전송, 수신할 수 있으며, USB 케이블을 PC와 연결하지 않았을 경우에 0, 1번 핀을 다른 기기의 시리얼 통신 포트와 연결하여 데이터를 주고 받을 수도 있다.
- 시리얼 통신을 사용하기 위해서는 시리얼 통신 포트를 초기화 해줘야 하는데, 이 기능을 하는 함수가 바로 "Serial.begin()" 함수이다. 이번 강좌에서 초기화 부분만 살펴보고 넘어가자. 시리얼 통신을 위한 함수는 “Serial” 객체에 정의되어 있어서 함수를 사용할 때는 “Serial.”을 앞에 꼭 붙여줘야 한다는 거.
Serial.begin(speed)
Serial.begin(speed, config)
- begin() 함수는 시리얼 통신을 사용하기 위해 핀을 초기화 시켜준다. 메가 외의 다른 보드에는 시리얼 통신 핀은 0번, 1번뿐이므로 이 함수를 사용하면 0번 핀과 1번 핀을 더 이상 디지털 핀으로 사용할 수 없다. 매개 변수로 통신 속도 값을 전달하며, 통신 설정 정보를 함께 전달할 수도 있다.