Embedded/Arduino

아두이노 나노 + SZH-RFBB-019 (433MHz RF무선송수신 모듈) 테스트 – 여러 개 송수신 테스트

변화의 물결1 2024. 2. 20. 00:04

 

 

안녕하세요.

 

  지난번 HC-12보다 가격이 더 싼 모듈을 가지고 433MHz 통신 테스트를 해보려고 합니다.

  이번 테스트는 수신(Recevie) 모듈 2개와 송신(Send) 모듈 1개로 한 곳에서 송신 시 여러 곳에서 받을 수 있는지,  송신 2개, 수신 1개로 구성해서 여러 곳에서 송신해도 한 곳에서 수신 가능한지 확인해 보았습니다.

 

  사실 주파수 대역만 같다면 보내고 받는 거야 크게 문제없다고 생각이 들지만, 그래도 실제로 확인해 보아야 이 모듈도 가능하다고 보고할 수 있지 않을까 합니다. ^^

 

  소스는 공개된 몇 가지가 있는데 그중에 빠르게 테스트해 볼 수 있는 내용을 참조해서 수정 작업해 보았습니다.

 

  아두이노에서 433MHz 송수신 모듈 간 통신을 해주기 위해서 패킷을 만들고(Encoding), 받은 쪽에서 다시 패킷을 풀어주는(Decoding) 작업을 해주어야 합니다. 그렇지만 웹상에는 좋으신 분들이 많이 계시다 보니, 감사하게도 잘 만들어진 라이브러리를 이용할 수가 있습니다.

 

  그중에 RadioHead 라이브러리는 많은 무선통신을 지원해주고 있는데 RH_ASK(Amplitude Shift Keying) 드라이버를 이용해서 작업해 보도록 하겠습니다. 사이트에 들어가서 Public member Functions를 보면 실제로 사용할 수 있는 함수를 확인할 수 있습니다.

 

  https://www.airspayce.com/mikem/arduino/RadioHead/classRH__ASK.html

 

그럼 시작해 보겠습니다.

 

 


 

0. 준비물 확인

 

  - 아두이노 나노 카피본 2개, 정품 1개

  (가능하다면 동일한 나노 제품 3개로 테스트하는 것이 다운로드할 때 편하실 겁니다. 나노 제품이 다르면 다운로드할 때마다 프로세서를 바꿔주어야 합니다)

 - 점퍼 케이블, USB 케이블

 

433 통신 테스트 위한 부품

 

 - 제품 스펙

 

  <Receiver Module>

  Model : MX-05V

  Operating voltage: DC 5V

  Quiescent Current: 4mA

  Receiving frequency: 433.92 MHZ

  Receiving sensitivity: - 105dB

  Size: 30mm * 14mm * 7mm

 

  <Emission Head (2SC3357 기반)>

  Model: MX-FS-03V

  Transmission Distance: 20-200 meters (different voltage, different effects)

  Operating voltage: 3.5-12V

  Work: AM

  Transfer rate: 4KB / S

  Transmitting power: 10mW

  Transmission frequency: 433.92 M

  Dimensions: 19 * 19mm

  Pinout left → right :( the DATA ; the VCC ; the GND )

 (mcuboard 사이트 참조)

 

 

1. RadioHead 라이브러리 다운로드

 

  - 현재 최신 버전인데 사이트에 가서 최신 버전을 받으셔도 됩니다. 버그들이 발견되어 수정되기도 하기 때문입니다.

    http://www.airspayce.com/mikem/arduino/RadioHead/RadioHead-1.113.zip

 

  - 다운로드한 파일을 압축 풀어서 아두이노가 설치된 폴더에 넣어줍니다. 옮겨줄 때는 압축 푼 폴더(RadioHead) 자체를 설치된 라이브러리 경로로 이동시켜 줍니다.

 

  예시) C:\Program Files (x86)\Arduino\libraries  안에 복사

 

 

2. 아두이노 나노와 연결하기

 

  1) 송신기 연결하기

 

송신 모듈 배선

 

 

아두이노 나노 송신 모듈
5V VCC
GND GND
D12번 핀(PB4) DATA

 

  2) 수신기 연결하기

 

수신 모듈 배선

 

 

아두이노 나노 수신 모듈
5V VCC
GND GND
D11번 핀 (PB3) DATA

 

- VCC와, GND 연결하면 2개 핀이 남는데, 어느 쪽에 연결하셔도 DATA 핀에 연결됩니다. 2핀이 연결(Short) 되어 있습니다.

 

 

3. 아두이노 나노 프로그래밍하기

 

  1) 송신 쪽 소스

 

    - 1초마다 1씩 증가시켜 문자열로 만들어 ASK 송신 라이브러리로 보내고 시리얼로도 출력하는 소스입니다.

    - 문자열을 보낼 때 변환하는 작업이 있으니 간단하게 참조하시면 도움이 되실 겁니다.

 

/* mx_send.ino */
#include <RH_ASK.h>
#include <SPI.h> // Not actually used but needed to compile
#include <time.h>

RH_ASK driver;

int iCount = 0;

void setup()
{
    Serial.begin(9600);    // Debugging only
    if (!driver.init())
         Serial.println("init failed");
}

void loop()
{
 
    const char *msg = "Msg";
    String strCount = "";
    String strMsg = "SEND : ";
    
    strCount = String(iCount);
    strMsg += strCount;
   
    uint8_t dataArray[strMsg.length()];
    strMsg.toCharArray(dataArray, strMsg.length()+1);

    if (driver.send((uint8_t *)dataArray, strlen(dataArray))) {
      driver.waitPacketSent();
      Serial.println(strMsg);
    }
    else {
      Serial.println("Failed to send a message...");
    }
    
    iCount++;
    delay(1000);
}

 

 

  2) 수신 쪽 소스

 

    -  0.1초마다 수신 버퍼를 검사하여 자료가 있다면 버퍼 자료를 문자열로 읽어서 출력해주고 있습니다.

 

/* mx_recv.ino */
#include <RH_ASK.h>
#include <SPI.h> // Not actualy used but needed to compile

RH_ASK driver;

void setup()
{
    Serial.begin(9600);
    if (!driver.init()) {
      Serial.println("init failed");
    } else {
      Serial.println("init success!");
    }    
}

void loop()
{    
    uint8_t buf[50];
    memset(buf, 0, 50);
    uint8_t buflen = sizeof(buf);
    if (driver.recv(buf, &buflen))
    {
      String message = (char*)buf;                                                  
      Serial.print("Message: ");
      Serial.println(message);                   
    } 
    delay(100);
}

  

 

4. 1:N 통신 테스트

 

  - 1:1로 통신하면 문제없이 통신이 잘 됩니다. 여기서 추가로 송수신 모듈 수를 변경하여 테스트해 보도록 하겠습니다.

 

  1) 수신 1개(왼쪽)와 송신 2개(중간, 오른쪽)

 

수신&nbsp;1개(왼쪽)와 송신&nbsp;2개(중간,&nbsp;오른쪽)

 

 

- 수신된 데이터를 확인하기 위해서 Putty로 각각 Serial port에 연결해서 확인해 보면 송신 측(COM6, COM4)에서 보내는 데이터를 수신 측(COM44)에서 둘 다 받은 카운트 값을 출력해주고 있음을 알 수 있습니다.

 

송신 2개, 수신 1개 모듈 데이터 확인

 

 

  2) 송신 1개(오른쪽)와 수신 2개(왼쪽, 중간)

 

송신&nbsp;1개(오른쪽)와 수신&nbsp;2개(왼쪽,&nbsp;중간)

 

 

  - 반대의 경우에서도 수신된 데이터를 확인하기 위해서 Putty로 각각 Serial port에 연결해서 확인해 보면 송신(COM4)에서 수신 측(COM44)과 수신 측(COM6)으로 보내는 카운트 값을 각각 받아서 출력해주고 있음을 알 수 있습니다.

 

송신 1개, 수신 2개 모듈 데이터 확인

 

 

5. 테스트 후기

 

  - 433MHz 통신을 테스트하는데 저렴한 가격(송수신 모듈이 약 2천 원)으로 할 수 있습니다. 그리고 간단하게 전원 2선, 1개 데이터 선으로 송수신할 수 있습니다. 또한 같은 주파수 대역의 모듈이라면 N:N도 가능해 보였습니다.

 

  그러나 송신 강도, 채널 등 설정할 수 없기 때문에 고정된 주파수를 사용해야 하므로 프로그램상 프로토콜을 만들어 모듈을 구분해서 사용해야 합니다.

  그리고 안테나가 포함되지 않아서 수신 거리가 짧고 모듈 주변을 손으로 덮어버리면 수신이 잘되지 않았습니다. 그래서 실제로 사용하려면 스프링 안테나 등 안테나를 달아서 사용해야 합니다. 그래서 간단한 무선 조종기, 제어기 등에 연결해서 사용하면 좋지 않을까 합니다.

  

  감사합니다.

 

 

<참조 사이트>

https://kocoafab.cc/tutorial/view/218

https://innoaus.com/posts/20190412/

https://stackoverflow.com/questions/36338134/how-to-convert-a-string-into-an-uint8-t-array-on-arduino

https://www.mcuboard.com:14063/shop/goods/goods_view.php?goodsno=8959&category=018

반응형