재료

  • USB 케이블 1개
  • 점프 와이어 4개
  • 아두이노 우노 2개

 이제까지 디지털 통신 인터페이스에 대해서 알아보고 I2C와 SPI 통신에 대해서 실습해보았습니다. 여기에 한 가지를 더 추가해서 UART 통신에 대해서 알아볼까 합니다. UART는 마이크로컨트롤러에서 사용되는 대표적인 시리얼 통신 방법 중 하나입니다. 여기서 시리얼 통신이란 연속적인 통신 채널이나 컴퓨터 버스를 거쳐서 한 번에 하나의 비트 단위로 데이터를 전송하는 과정을 말합니다.  UART 통신의 데이터 송수신 형태는 아래와 같습니다.



많은 장비들이 지원하고 연결도 I2C 통신처럼 두 개의 연결선만 있으면 되서 많이 사용하고 있는 방식입니다. UART 시리얼 통신은 1대 1 통신이라서 I2C와 SPI 통신과 같이 Master-Slave 형태는 아닙니다. 두 개의 연결선은 TX와 RX라고 하는데, TX는 수신부를 RX는 송신부를 의미하고 서로 교차한 형태로 연결해주시면 됩니다.

  UART의 주요 기능은 송신할 병렬 데이터를 직렬로 바꾼 후에 수신된 직렬 데이터를 다시 병렬로 바꾸는 것입니다. 별도의 변환 과정없이 간단하게 데이터를 송수신할 수 있는 장점이 있습니다.


 이제까지 간단하게 UART 통신 방식에 대해서 알아보았으니, 이제부터는 앞에서와 마찬가지로 프로젝트를 통해서 이해해보도록 하겠습니다. 먼저 UART 통신 방식을 사용하여 아두이노 간 통신을 시리얼 모니터 출력을 통해서 확인해보고, 응용 프로젝트에서는 이제까지 LCD를 활용하여 통신의 결과를 출력해보았으니 이번에는 다르게 부저를 이용해서 결과를 출력해보도록 하겠습니다.




STEP1. 준비물

아두이노 보드 2개, USB 케이블, 점프 와이어 4개



STEP2. 회로도

아래와 같이 TX선과 RX선을 아두이노 보드 간에 서로 교차가 되도록 연결해주세요.



꼭 이렇게 연결하시지 않아도 수신부에는 TX 선만, 송신부에서는 RX 선만 연결해주셔도 됩니다.


STEP3. 코드

송신부의 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char send = 'A';
 
void setup(){
  Serial.begin(9600);
  Serial.println("UART");
}
 
void loop(){
  Serial.println(send);
  send++;
  
  if(send > 'Z'){
    send = 'A';
  }  
  delay(1000);
}


수신부의 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
char data;
 
void setup(){
  Serial.begin(9600);
}
 
void loop(){
  while(Serial.available()){
    data = Serial.read();
    Serial.print(data);
  }  
}


여기서 주의하실점은 각각의 코드를 업로드하실 때 꼭 RX(디지털 0번) 핀에 연결되어있는 연결선을 빼신 후에 업로드하셔야 합니다. 그렇지 않으면 핀의 중복사용으로 인한 오류가 발생할 수 있습니다.


STEP4. 결과 확인




앞선 예제들과 마찬가지로 1초에 한번씩 A부터 Z까지의 문자를 출력해줍니다. SPI 통신은 1 byte를 전송해주어야지 slave로부터 1 byte의 정보를 받아올 수 있었지만 UART 통신을 사용하면 I2C 방식같이 1초에 한 번씩 정보가 알아서 전송되어 출력이 되는 것을 확인할 수 있습니다.


STEP5. 응용

 이번에는 부저를 사용하여 출력을 해보도록 하겠습니다. 추가로 브래드 보드와 부저, 점프와이어를 준비해주세요. 먼저 아래와 같이 회로도를 구성해주세요.


그런 후에 송신부에 다음의 코드를 업로드하시고,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char num = '0';
 
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(num);
  num++;
 
  if(num > '3')
    num = '0';
  delay(1000);
}


수신부에 다음의 코드를 업로드하시면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const int buzzer=13;
char data;
 
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  while(Serial.available()){
    data=Serial.read();
    Serial.print(data);
    
    if(data=='3')
      tone(buzzer, 261);
    else
      noTone(buzzer);
    delay(1000);
  }
}


마찬가지로 각각의 코드를 업로드할 때에는 각각 아두이노 보드의 0번 핀에 연결된 선을 제거한 후에 업로드해주셔야 합니다. 코드를 업로드하시면 아래와 같이 3이 들어오는 경우에 부저가 울리는 것을 확인할 수 있습니다.



댓글 0

MADE BY

김민정

사물인터넷, 아두이노