Embedded/Arduino

아두이노 나노 + HC-12 (433MHz RF 통신) 테스트 3편 – 송수신 테스트 (거리체크)

변화의 물결1 2024. 1. 30. 10:42

 

 

안녕하세요.

 

 2편에서는 HC-12 설정하는 방법을 확인해 보았습니다. 이번에는 실제적인 거리를 확인해 보겠습니다.

HC-12 거리 테스트를 하기 위해서 소스를 조금 변경하여 송신과 수신을 나누어 생각해 보도록 하겠습니다.

 

 한쪽을 송신(보내는 쪽), 다른 한쪽은 수신(받는 쪽)으로 소스를 나누어 코딩합니다.

송수신 소스는  https://github.com/daar/HC-12 내용을 참조했습니다.


 

1. 프로그래밍할 시나리오

 

 - 송신 쪽에서 카운트한 값을 1초마다 전송합니다. 보낼 때마다 LED 점멸하도록 합니다.

수신 쪽은 버퍼를 지속해서 검사를 하다가 값이 들어오면 출력해 주고 LED 점멸하도록 합니다.

 

 

2. 송수신 별 소스코드

 

 - 송수신 소스 코드 자체는 크게 차이가 나지 않습니다.

 

1) 송신 쪽 소스코드(hc12_send.ino)

#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3

SoftwareSerial HC12(rxPin, txPin); 
long baud = 9600;
long lCount = 0;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);

  // define pin modes for tx, rx:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);

  Serial.begin(baud);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Serial monitor available... OK");

  Serial.print("Serial link available... ");
  HC12.begin(9600);
  if (HC12.isListening()) {
    Serial.println("OK");
  } else {
    Serial.println("NOK");
  }

  //test HC-12
  Serial.print("HC-12 available... ");
  HC12.write("AT+DEFAULT");
  delay(1000);
  while (HC12.available() > 0) {
    Serial.write(HC12.read());
  }
  Serial.println();
  Serial.println("initialization done. SEND");
}

boolean state = false;

void loop() {

  digitalWrite(LED_BUILTIN, state);
  Serial.print("Distance Test, Count : ");
  Serial.println(lCount);
    
  HC12.print("Distance Test, Count :");
  HC12.println(lCount);
  delay(1000);
  lCount++;
  state = not state;
}

 

2) 수신 측 소스코드(hc12_recv.ino)

 

#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3

SoftwareSerial HC12(rxPin, txPin);
long baud = 9600;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  
  // define pin modes for tx, rx:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  

  Serial.begin(baud);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Serial monitor available... OK");

  Serial.print("Serial link available... ");
  HC12.begin(9600);
  if (HC12.isListening()) {
    Serial.println("OK");
  } else {
    Serial.println("NOK");
  }

  //test HC-12
  Serial.print("HC-12 available... ");
  HC12.write("AT+DEFAULT");
  delay(1000);
  while (HC12.available() > 0) {
    Serial.write(HC12.read());
  }
  Serial.println();
  Serial.println("initialization done. RECV");
}

boolean state = false;

void loop() {

  //data is waiting in the buffer
  if (HC12.available() > 0) {

    Serial.print(millis());
    Serial.print(" RF: ");
    state = not state;
    digitalWrite(LED_BUILTIN, state);
    while (HC12.available() > 0) {
      
      Serial.print(char(HC12.read()));
    }
  }

  delay(100);
}

 

 - 위와 같이 코딩했다면 각 보드 컴포트(Comport)를 잘 선택하여 송신과 수신을 구분하여 다운로드합니다. 그리고 또 하나 HC-12의 SET 핀에 연결된 GND를 연결되지 않게 합니다. 순수하게 송수신만 되게 설정합니다.

 


3. 테스트 방법

 

 -  PC 쪽에 송신 아두이노 장착하고 아두이노 프로그램의 시리얼 모니터 사용하였고,
  노트북 쪽에 수신 아두이노 장착해서 일반 시리얼 통신 프로그램(SerialPortMon)을 통신속도 9600bps, 데이터 비트 8, 패러티 None, 정지비트 1, 흐름제어 none로 설정해서 밖에서 테스트했습니다. 

 

송수신 모듈 확인

 

 

4. 통신 결과

 

 - 스프링 안테나 장착 하여 실험 결과는 건물 3층 책상에 송신 모듈을 두고 일반 도로 길을 수신 모듈을 들고 따라갔을 경우 100m~120m 정도에서도 값을 받을 수 있었습니다. 100m가 넘어가면 데이터 소실이 발생하였습니다.
  건물들 사이로 갔을 경우 정확하지는 않지만 1~2채 정도 건물은 통과하는 것으로 보였습니다. 그러나 건물 간섭 등 실제 현장에 사용하고자 한다면 실현장 테스트해 보아야 할 것입니다.

 

수신 측  결과

 

 

  * 참고로 위처럼 송수신을 분리해서 프로그래밍할 수도 있지만, 하나로 통합해서  AT Command도 구분할 수 있는 코드로도 만들 수 있습니다. 참고할 수 있는 소스가 있어 링크 걸어 놓습니다.

https://github.com/honzakucera/HC-12

 

 

* 기타 소스 참고 사이트

http://www.electronoobs.com/eng_arduino_tut96.php

 

 

  마지막 4편은 저도 궁금했던 부분인데 1대 N이 가능한지입니다. 다른 분들 글을 찾아봤는데 남겨주신 분을 찾지 못했습니다. (검색 미숙;;;)

 

 

감사합니다.

 

반응형