본문 바로가기
아두이노 통신

[통신/근거리] 433/315Mhz 근거리 무선 송수신 통신을 아두이노(Arduino)에서 구현해보자

by 작동미학 2015. 2. 8.
반응형

상대적으로 짧은 단거리(공개된 곳에서 10m미만)를 커버하는 433/315Mhz 저가의 부품을 사용해 근거리 통신을 구현

 

▶ 이 가이드를 따라하면,

- 두 개의 아두이노가 서로 무선으로 근거리(100m미만)에서 단방향 통신하는 기능을 구현한다

- 433Mhz MX-V5 와 VirtualWire 라이브러리를 사용해 통신할 수 있다.

 

▶ 먼저 읽으면 좋은 글

- 라이브러리 설치 방법 : http://bbangpan.tistory.com/1

 

▶ 부품 설명 및 회로 구성

 아두이노의 매력은 무선 네트워크를 다루면서 가치가 더욱 커진다. 1천원 수준에서 구현할 수 있는 통신 방법은 IR통신(적외선 리모콘)외에 이 433/315Mhz 무선 통신 모듈을 구현하는 방법이 있다. 433/315Mhz는 자동차 무선 시동 및 락 등에 사용되는 무선 주파수 영역이다. 그림의 부품이 송신/수신 한 쌍인데 Aliexpress에서는 한 쌍에 천원 미만으로 판매되고 있어 손쉽게 무선 통신을 구현할 수 있다. 양방향이 아닌 단방향의 전송만 가능하지만 센서 정보를 수집하는 것은 가능하고, 하나의 송신기가 뿌려주면 다수의 수신기에서 신호를 잡을 수 있다.

모듈의 ANT라고 씌인 빈 구멍에 30cm정도의 전선을 안테나에 납땜해주면(송/수신 모두), 통신 거리는 대략 집안 정도의 거리와 벽을 커버 할 수 있고, 안테나 없이도 방안에서는 통신이 가능하다. 유사 부품이 많은데 여기서는 XY-MK-5V라는 수신 모듈과 XY-FS라는 송신 모듈을 기준으로 설명한다. 5~40mW이하 정도의 저전력으로 작동하며 433 와 315Mhz 두가지 모듈이 존재하는데, 둘 차이는 주파수 외에는 없는 것으로 알려져있다.

 송수신 거리는 야외 100m라고 하지만 실제로는 몇m정도여서, 안테나 없이는 1m 정도를, 안테나를 적절히 달아주면 10~20m정도 통신이 가능하다. (해당 모듈의 단순 테스트 용도 이외의 사용에는 반드시 전파규제-출력 및 용도-에 적합한지 확인이 필요하다.) 

< XY-FS(송신/3핀), XY-MK-5V(수신/4핀) 433Mhz 무선 통신 모듈>

 

기본적으로 무선 통신은 1과 0을 빠르게 전환하면서 정보를 실어 주파수에 담아 송신측이 발사하면 수신측에서 이를 동기화하여 받아 해석하여 통신할 수 있다. 따라서 이 복잡한 과정을 직접 구현하는 방법이 있지만, VirtualWire라는 라이브러리를 통해 손쉽게 구현이 가능하다. 여기서는 해당 라이브러리 사용을 가정한다.

<송신회로 구성/5V,GND,DATA(기본 12핀) 세 종류 핀을 연결한다>

<수신회로 구성/5V,GND,DATA(GND 옆, 기본 11핀) 세 종류 핀을 연결한다>

 

▶ 소스 코드 입력 및 구동

라이브러리는 VirtualWire: http://www.airspayce.com/mikem/arduino/VirtualWire/index.html 를 사용한다. Arduino 기본 IDE 강좌(http://bbangpan.tistory.com/1 )를 참조로 해당 라이브러리 zip을 다운받아 아두이노설치폴더/libraries/VirtualWire/* 에 해당 소스들과 examples폴더가 위치하도록 한다.

아래는 송수신 모듈을 각기 표기하였다. 데이터핀의 경우는 내부 코드를 조절하여 변경 가능하다(디폴트로는 기본 핀이 선택됨)

    

송신 모듈 소스 원본 GitHub 링크 : https://github.com/bbangpan/bbangpan.com/blob/master/neibc_433_315mhz_trans/neibc_433_315mhz_trans.ino

http://www.bbangpan.com ----------------------------------

/* Originally posted on www.bbangpan.com

 

Program Description: 433/315Mhz transmitter(FS1000A or XY-FS) test code

Needed library : VirtualWire http://www.airspayce.com/mikem/arduino/VirtualWire/index.html

DataPin : 12 to 433/315Mhz transmitter DATA(near GND)

Tested on : Arduino 1.0.6, Arduino UNO R3, VirtualWire

 

Inspired by http://www.buildcircuit.com/how-to-use-rf-module-with-arduino/

 

Copyright (c) 2015 www.bbangpan.com. All rights reserved.

This program can be used for any non-commercial purpose freely. */

 

#include <VirtualWire.h>

 

const int TX_DIO_Pin = 12; // default 12

 

 

void setup()

{

vw_set_tx_pin(TX_DIO_Pin); // Initialize TX pin

vw_setup(2000); // Transfer speed : 2000 bits per sec

}

 

void loop()

{

send("Bbangpan!");

delay(1000);

}

 

void send (char *message)

{

vw_send((uint8_t *)message, strlen(message));

vw_wait_tx(); // Wait until the whole message is gone

}

-------------------------------------------------------

 

수신 모듈 소스 원본 GitHub 링크 : https://github.com/bbangpan/bbangpan.com/blob/master/neibc_433_315mhz_recv/neibc_433_315mhz_recv.ino

http://www.bbangpan.com -----------------------------

/* Originally posted on www.bbangpan.com

 

Program Description: 433/315Mhz receiver(XY-MK-5V) test code

Needed library : VirtualWire http://www.airspayce.com/mikem/arduino/VirtualWire/index.html    

DataPin : 11 to 433/315Mhz receiver DATA

Tested on : Arduino 1.0.6, Arduino UNO R3, VirtualWire

 

Inspired by http://www.buildcircuit.com/how-to-use-rf-module-with-arduino/

 

Copyright (c) 2015 www.bbangpan.com. All rights reserved.

This program can be used for any non-commercial purpose freely. */

 

#include <VirtualWire.h>

 

byte message[VW_MAX_MESSAGE_LEN]; // a buffer to store the incoming messages

byte messageLength = VW_MAX_MESSAGE_LEN; // the size of the message

 

const int RX_DIO_Pin = 11; // default 11

 

void setup()

{

Serial.begin(9600);

Serial.println("Ready to receive:");

vw_set_rx_pin(RX_DIO_Pin); // Initialize RX pin

vw_setup(2000); // Transfer speed : 2000 bits per sec

vw_rx_start(); // Start the receiver

}

 

void loop()

{

if (vw_get_message(message, &messageLength)) // Non-blocking

{

Serial.print("Received: ");

for (int i = 0; i < messageLength; i++)

{

Serial.write(message[i]);

}

Serial.println();

}

}

 

-------------------------------------------------------

 

이렇게 구동하고 나서 각각의 송/수신 Arduino에 업로드 하고, receive모듈의 시리얼 모니터를 구동(Arduino IDE에서 Ctrl+Shift+M)하면 아래와 같이 일정 간격으로 신호를 받는 것을 확인할 수 있다.

<수신 모듈 탑재 Arduino에서 시리얼 모니터 통신 화면>

 

간단하게 두 아두이노 간의 통신이 되었다. 다음 회차에서는 이를 응용하여 온/습도 정보를 무선으로 송/수신하는 아두이노를 만들어보자.

 

▶ 구매 가이드

433/315Mhz 송수신 모듈 : http://www.aliexpress.com/item/RF-wireless-receiver-module-transmitter-module-board-for-arduino-super-regeneration-315-433MHZ-DC5V-ASK-OOK/1446556872.html

433Mhz Spring 안테나 : http://www.aliexpress.com/wholesale?catId=0&initiative_id=SB_20150816080748&SearchText=433+spring+antenna

(위 설명한 안테나보다 성능이 다소 낮으나 크기가 작아 그냥 쓰는것보다는 낫다)

해외 직구 사이트에서433 arduino RF로 검색하면 구매 가능하다.

 

강의 키워드

아두이노 무선 통신, 433/315Mhz 무선통신, XY-FS, XY-MK-5V, 아두이노 RF

반응형