2018년 7월 30일 월요일

아두이노 간 시리얼 통신 (UART)

0. 개요


 시리얼 통신의 정의 및 종류를 알 수 있고, UART에 대한 코딩을 알 수 있다.


1. 시리얼 통신이란?

 시리얼 통신은 데이터를 주고 받을 수 있는 직렬 통신이다.
시리얼 통신은 아두이노간 통신을 할 수 있으며, 더 나아가 블루투스-아두이노,
WIFI-아두이노 등 데이터를 송/수신 할 수 있는 기초적이면 가장 핵심적인 수단이다.


2. 시리얼 통신의 종류

 시리얼 통신에는 SPI, I2C, UART 등이 있다.
하지만 아두이노 관점에서 가장 유용하고 많이 쓰이는 것은 UART 등이 있다.


3. UART

 UART의 개념 및 주의사항을 알아보자.
먼저 보레이트라는 것을 알아야 한다. 보레이트는 시리얼통신의 속도이다. 이것이 왜 중요하냐면 아두이노에서 데이터를 주고 받을 때, 시리얼 통신 속도가 같지 않게 설정한다면
디버깅할 때 오류가 생기기 때문이다.
보통은 9600 을 많이 쓰지만, 다른 속도를 사용하여도 상관없다. 다만 라이브러리에서 115200bps 까지 지원한다고 하니 이 아래 속도를 이용해야 한다.


4. UART 종류

 아두이노는 하드웨어 통신과 소프트웨어통신으로 데이터를 송/수신 할 수 있다.
하드웨어 통신은 우노의 경우 TX0, RX0 이 표신 된 곳으로 연결할 때 하드웨어 통신이라 한다. 하지만 아쉽게도 우리가 PC와 아두이노를 통해 데이터를 주고 받을 때 즉 업로딩 과정 및 시리얼 모니터를 이용해 데이터를 주고 받을 때 이 핀을 사용하기 때문에 아두이노간 통신 과 와이파이 통신은 불가능 하다(따로 핀이 비어있지만 비어있는 것이 아니다). 하지만 메가는 이러한 하드웨어가 1~3까지 총 3개가 있기 때문에 시리얼 통신(PC-아두이노)과 다른 보드와 데이터 통신을 동시에 할 수 있다.
 소프트웨어 통신은 눈치 챗다시피 하드웨어 핀이 아닌 일반 디지털 핀을 TX(TRANSFER 송신), RX(RECIEVE,수신)로 소프트웨어적으로 변경하여 통신하는 것이다. 이는 메가보단 우노에서 가장 많이 쓰인다.


5. UART 함수

 먼저 하드웨어핀을 이용한다면 따로 라이브러리를 불러올 필요가 없지만, 소프트웨어통신을 한다면 SoftwareSerial.h 함수를 불러와야 한다.

#include <SoftwareSerial.h> // 라이브러리 함수를 불러들인다.
SoftwareSerial BTSerial(10,11); //  BTSerial은 임의로 지정한 이름이다.  rx, tx 순이며 10, 11번 핀을 rx, tx로 사용한다는 의미이다.


void setup() {
  Serial.begin(9600); // 9600의 통신속도로 준비한다. 라는 명령어, 시리얼속도와 9600이 동일해야함
}


void loop() {

  if(BTSerial.available()) { //시리얼 모니터에 데이터가 출력(저장) 되어 있는지 여부
    char state = BTSerial.read(); // 있다고 하면 그 데이터를 읽어라 즉 수신해라,

   if(state =='y') digitalWrite(red, HIGH); // 수신한 값이 y이면 다음을 실행해라,
   else digitalWrite(red, LOW);
   BTSerial.println(state); // y값을 시리얼모니터에 출력해라
  }

}

----------------------------------------------------------------------------------------------
위와 같은 코딩을 해석해 보았다. 정리하면

데이터 송신할 때 쓰는 명령어는 Serial.print(), Serial.println(), Serial.write() 등이 있으며(serial은 이름으로 다른 단어로 바꿔도 된다), 수신할 때는 serial.read() 라는 함수를 많이 이용한다.

 6. 설계 시 주의점

pc와 아두이노 연결은 문제가 되지 않지만, 아두이노와 다른 보드를 송/수신 할때는 tx, rx 를 서로 연결하여 사용하는데 교차하여 연결해야 한다. 즉 tx 핀에 꼳힌 점퍼선은 다른 보드 rx 핀에 꼳아야 되고 rx핀도 마찬가지이다. 또한 아두이노간 연결할 때는 gnd 끼리 서로 연결해줘야 한다.

 7. 예제, pc-아두이노1-아두이노2 순으로 연결하여 아두이노2의 연결된 서보모터 제어하기.



위 사진은 설계 사진이다. 

메가는 시리얼 모니터로 데이터를 입력받으면 그 데이터를 우노에게 전송하고 우노는 그 데이터에 맞는 명령을 실행하는 것이다. 

메가 코딩

#include <SoftwareSerial.h>  // 메가 코딩은 실제로 필요 없다. 왜냐하면 하드웨어핀이 추가적으로 존재                                  하기 때문이다.
SoftwareSerial BTSerial(2,3);  // 2번을 rx 3번은 tx로 놓자
//
void setup(){
  Serial.begin(9600); // serial 9600 으로 통신 할거다.
  BTSerial.begin(9600); // BTSerial을 9600으로 통신 할거다.
}
//
void loop(){
  if(Serial.available()){  // 시리얼모니터에서 받은 데이터가 있는 지 여부
    char c=Serial.read();  // 있다면 그 데이터를 수신받아라. 그리고 c에 저장하라
    if(c=='y')BTSerial.write('y'); // 그 데이터가 'y'라면 BTSerial을 통해 우노에게 y를 전송해라
  }
}

우노코딩

#include <SoftwareSerial.h> // 우노는 무조건 설정해야함.
#include <Servo.h> // 서보모터를 돌릴 예정으로 라이브러리 추가.
SoftwareSerial BTSerial(2,3); // 2,3번핀을 설정..
Servo servo;
char state
const int servopin=9; // 변수 선언 9번으로
//
void setup(){
  Serial.begin(9600); // 위와 동일
  BTSerial.begin(9600); // 동일
  servo.attach(servopin); // 9번핀을 서브모터로 컨트롤하겠다.
}
//
void loop(){
  if(BTSerial.available()){ // btserial 통해 받은 데이터가 있는 지 여부
    state=BTSerial.read(); // 있으면 state에 수신받아 저장해라
    if(state=='y'){ servo.write(90); delay(1000); servo.write(-90); }  // 그 데이터가 y이면 모터를 90회전 하고 1초쉬고 -90회전해라
    Serial.write(state); Serial.println("y"); //시리얼모니터에 state데이터값을 보내라.
  }
}


위 코딩을 통해 시리얼모니터에 y를 입력하면 서보모터가 작동되는 것을 알 수 있다.
아래는 동영상이다.




                                






댓글 없음:

댓글 쓰기

구글 스프레드 함수를 활용한 내 입맛대로 자산(주식) 통합 관리하기!(자산분배)-(1)

흩어진 주식계좌! 내 입맛대로 실시간 통합관리하기 1.  2% 아쉬운 MY데이터 활용한 자산 통합관리 지인에게서 퀀트투자라는 생소한 투자법을 들은 후 매력을 느껴 더욱 깊이 알아보고자 강형국의 퀀트투자라는 책을 읽게 되었다. 이 책은 나의 투자 가치관...