[아두이노] 아두이노 끼리 통신하기

IOT/아두이노|2019. 3. 17. 09:00

[아두이노] 아두이노 끼리 통신하기



시리얼통신에서 블루투스 실험을 하면 좋은데 가상 시뮬레이터에서 블루투스를 제공하지 않아서 그 대안으로 2대의 아두이노를 연결해서 시리얼통신하는 실험을 갖도록 하겠습니다. 지난시간에 배웠던 시리얼통신을 이용하여 한쪽에서는 명령을 내리고 한쪽에서 시리얼통신으로 통해서 받은 명령을 실행하는 동작을 간단하게 어떤식으로 수행되는지 진행해 보겠습니다.

1. SoftwareSerial 라이브러리


아두이노는 내장된 0,1번 핀이 시리얼 통신핀입니다. SoftwareSerial는 소프트웨어를 사용하여 아두이노의 다른 디지털 핀에서 직렬 통신을 허용하게 하기 위해서 개발된 라이브러리 입니다.

#include <SoftwareSerial.h>

  • SoftwareSerial mySerial (rx, tx) : 소프트시리얼 객체선언(rx(수신), tx(전송))
  • mySerial.begin(2400) : 시리얼 통신 시작(예로 2400 통식속도를 사용해 봤네요.)
  • mySerial.write(값) : 데이터 전송
  • mySerial.available() : 데이터 들어왔는 확인
  • mySerial.read() : 전송된 데이터 1byte 읽기

시리얼통신 함수와 별다를 게 없죠. 단지 객체변수로 선언할대 rx, tx 핀번호를 지정해 줘야 한다는 것 외에는 다 동일합니다. 시리얼통신에서 배웠던 함수들임으로 별로 어렵지 않을꺼에요.

2. 회로도 구성


  • 준비물 : Red LED 1개, 저항 220옴 1개, 아두이노우노 2개
  • 내용 : Red LED 깜박이는 기본 예제 회로도


2대의 아두이노를 보면 10, 11번의 두개의 핀을 시리얼 통신용으로 사용 됩니다. 아두이노의 전용 시리얼통신핀은 0, 1번핀입니다. 이 핀을 사용할 수는 있지만 사용을 안하는 걸 추천 드려요. 나중에 블루투스 통신에서 0,1핀을 사용하기는 하지만 여기에서는 아두이노 IDE 시리얼모니터를 사용하기 때문에 이쪽 0,1 핀을 제외한 다른 핀을 시리얼통신으로 사용할려고 10, 11번 핀을 임의로 지정했습니다.

3. 코딩


[ 시리얼통신 기본예제 소스 ]

void setup() {
  Serial.begin(9600);    //시리얼 통신 9600 통신속도로 시작
}
void loop() {
  
  if (Serial.available() > 0) { //데이터가 수신되는지 확인
    char ch = Serial.read(); //1byte 읽음
    Serial.println(ch); //1byte 읽은거 출력
  }
}

[ LED 기본예제 소스(1초 단위로 LED 깜박이기) ]

void setup() {
    pinMode(13, OUTPUT);
}

void loop() {
    digitalWrite(13, HIGH);
    delay(1000);
    digitalWrite(13, LOW);
    delay(1000); 
}

위 기본예제를 2번 아두이노에 합쳐서 동작하게 되는데 1번 아두이노의 명령에 의해서 깜박이게 코딩하도록 하죠.

시리얼통신에 사용되는 라이브러리는 SoftwareSerial 라이브러리입니다. SoftwareSerial 클래스을 이용하여 2대의 아두이노의 통신을 하게 됩니다.

전제척으로 코딩을 하면

[ 1번 아두이노 ]

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10,11); //시리얼통신 핀

void setup()
{
    mySerial.begin(2400); //기존 9600이여서 다른 통신속도를 사용해야함
}

void loop()
{
  mySerial.write('1'); // 2번 아두이노에 '1'값 전송
  delay(1000);
  
  mySerial.write('0');  // 2번 아두이노에 '1'값 전송
  delay(1000);
}

간단하죠. SoftwareSerial를 인쿠루드 시키고 SoftwareSerial 객체변수를 선언할대 아두이노에서 사용될 디지털 핀을 10, 11번으로 지정했습니다. 그리고 나서 따로 할 것은 없고. write()함수 명령어로 값을 2번 아두이노에 보내는 명령 코드가 되겠습니다.


[ 2번 아두이노 ]

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10,11);

char state;
int rPin=13;

void setup()
{
  Serial.begin(9600);
  mySerial.begin(2400);
  pinMode(rPin, OUTPUT);
}

void loop()
{ 
  if(mySerial.available() > 0) { //수신되었는지 상태 확인
    state = mySerial.read(); //수신된 데이터를 1byte 읽어와서 state 변수에 저장함
    
    if(state=='1') digitalWrite(rPin, HIGH); //읽어온 값이 '1'이면 참으로 Red에 HIGH로 불이 들어옴
    else digitalWrite(rPin, LOW); //'0'이면 1이 아니기 때문에 거짓으로 Red에 LOW로 불이 꺼짐
    
    Serial.println(state);  //정상적으로 읽은 값이 들어왔는지 아두이노 IDE 시리얼모니터로 출력
  }
  
}

2번 아두이노는 좀 코딩이 긴 편입니다. 정상적으로 값을 가져왔는지 아두이노 IDE 시리얼모니터로 그 값을 찍어봐야 하기 때문에

 Serial.begin(9600);
 erial.println(state);

이 두문장으로 아두이노 IDE로 state 값을 전송하게 됩니다. 여기서 state 값은 1번 아두이노에서 보내진 데이터를 수신한 값이 되겠습니다.

1번 아두이노에서 데이터를 수신하여 state 변수에 저장되는데 그 로직은 시리얼통신에서 기본적으로 사용하는 시리얼통신으로 데이터가 들어왔을때 그 값을 읽는 로직은 아래와 같습니다. 이건 왠만하면 계속 사용하기 때문에 숙지해 주세요.

  if(mySerial.available() > 0) {
        state = mySerial.read();
    }

if 조건문으로 '1'이면 불이 들어오고 '0'이면 불이 꺼진다는 조건을 만든다.

if(state=='1') 불켜!
else 불꺼;

간단하지요.

4. 결과


오른쪽 아두이노가 SoftwareSerial 을 사용하여 왼쪽 아두이노에게 '1'과 '0'의 값을 전달하고 왼쪽 아두이노도 전송된 값을 읽어서 Red LED가 깜박이게 동작을 수행하게 하는 사진입니다.


마무리


시리얼통신과 차이가 없습니다. 단지 SoftwareSerial 라이브러리를 이용하여 소프트웨어적으로 제어 했다는 것만 다를 뿐이죠.
실험에서는 코드를 따로 어떻게 가상시뮬레이터에서 하냐고 생각 하실 수 있습니다. 그냥 코딩창을 띄워놓은 상태에서 해당 아두이노를 클릭하면 해당 아두이노의 코딩창으로 바뀌게 됩니다. 그리고 해당 아두이노 코딩에 맞게 개별적으로 시뮬레이션이 되니간 쉽게 생각하세요.


그리고 이 그림처럼 직접 마우스로 해당 아두이노를 선택하시면 됩니다. 참고로 이 소스를 기반으로 블루투스를 실제 가지고 있는 분이라서 블루투스 통신 코드로 활용하셔도 됩니다.

마지막으로, 이걸로 뭘 할 수 있을지 한번 상상의 나래를 펼쳐보세요.

댓글()