본문 바로가기
코딩/아두이노

nRF24L01 내장 아두이노 나노보드 최대 통신 거리

by DIYver 2021. 3. 14.

 

 

중국 알리에서 구입한 nRF24L01 모듈 내장형 나노 보드

 

nRF24L01 의 경우 최대 1~2km 까지도 통신이 된다 했었고,

유튜브에서도 그와 관련된 자료가 꽤 있기도 하다.

 

 

 

 

www.youtube.com/watch?v=R2L2mvcJsPY

중국에서 사는 한국인이 올린 자료인데

 

2km 모듈의 경우 200m까지는 되었다고 한다.

 

 

 

그래서 과연 필자가 주문해서 받은 나노보드의 경우 통신범위가 어떻게 되나 테스트를 해봤다.

영상을 찍을 필요도 없이 처참한 결과였다.

 

 

외장 안테나가 없어서 거리가 짧을 줄은 알고있었는데

생각보다 너무 짧아서... 놀람을 금치 못했다.

 

 

일단 사이에 벽이 있으면 통신이 안 된다고 보면 되고,

뻥 뚫려있는 상황에서 최대 5m 거리에서 통신이 되었다.

 

radio.setPALevel(RF24_PA_MAX);

최대 통신 거리로 공급전압을 설정해 주었으며,

실내에서 테스트를 진행했다.

 

 

가까운 거리에서 테스트를 진행해보면

양방향 통신이 된 경우

캐릭터 LCD1602 에

signal 과 Return OK 문구가 뜨게 된다.

 

 

 

 

 

만약 버튼을 눌러서 수신기에 신호를 보냈는데

수신기에서 Return 신호를 쏘지 못했거나, 

신호를 쏘긴했는데 송신기에서 받지 못한 경우 밑에 Return OK 가 뜨지 않는다.

 

 

 

측정결과 뻥뚫려 있는 곳에서 5m이내로 통신이 되었고,

가깝더라도 벽간에 장애물이 있다면 안 될 가능성이 크다.

 

RC카와 리모컨으로 구성하기에는 매우 부족한 성능이라고 할 수 있겠다.

제대로 사용하려면 안테나 있는 제품을 쓰는것이 좋아보인다.

 

워낙 사용방법이 간단해서 근거리 아두이노간의 통신에서는 사용하기에 적합해 보인다.

 

 

 

100m 까지 통신을 하려면 이런 외장 안테나가 있는 모듈을 구입해서 사용하는 것을 권장한다.

말이 권장이지 이 모듈을 사용하는게 아니면 사용 불가능하다.

 

 

 

실험에 쓰인 코드를 첨부하니

필요한 경우 잘 사용해 보시길 바란다.

 

<송신기 코드 - LCD1602 사용>

#include <SPI.h>

#include <LiquidCrystal_I2C.h>
#include <Wire.h>


#include <nRF24L01.h>
#include <RF24.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display


RF24 radio(10, 9); // SPI 버스에 nRF24L01 라디오를 설정하기 위해 CE, CSN를 선언.
const byte address[6] = "00001"; //주소값을 5가지 문자열로 변경할 수 있으며, 송신기와 수신기가 동일한 주소로 해야됨.

const int button_pin = 5;
unsigned long time;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(button_pin, INPUT_PULLUP);
  
  radio.begin();
  radio.openWritingPipe(address); //이전에 설정한 5글자 문자열인 데이터를 보낼 수신의 주소를 설정
  radio.setPALevel(RF24_PA_MAX); //전원공급에 관한 파워레벨을 설정합니다. 모듈 사이가 가까우면 최소로 설정합니다.

//거리가 가까운 순으로 RF24_PA_MIN / RF24_PA_LOW / RF24_PA_HIGH / RF24_PA_MAX 등으로 설정할 수 있습니다.

//높은 레벨(거리가 먼 경우)은 작동하는 동안 안정적인 전압을 가지도록 GND와 3.3V에 바이패스 커패시터 사용을 권장함. 

  radio.stopListening();  //모듈을 송신기로 설정
    lcd.init();                      // initialize the lcd 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("test");
  lcd.setCursor(0,1);
  lcd.print("READY OK!");


}


void loop() {
  // put your main code here, to run repeatedly:
  
 
  while(digitalRead(button_pin))
  {
   
    delay(10);
  }
  time = millis();
  lcd.clear();
  
  const char text[] = "signal";
  Serial.println("signal");
  
  lcd.setCursor(0,0);
  lcd.print("signal");
  
  radio.write(&text, sizeof(text)); //해당 메시지를 수신자에게 보냄
  //delay(1000);


  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MAX); //전원공급에 관한 파워레벨을 설정합니다. 모듈 사이가 가까우면 최소로 설정합니다.
  radio.startListening(); //모듈을 수신기로 설정

  while(millis() < time + 3000) 
  {
    if (radio.available()) {
      char text2[32] = "";
      radio.read(&text2, sizeof(text2));
      Serial.println(text2);

      lcd.setCursor(0,1);
      lcd.print("Return OK");
      break;
    }
  }
  radio.openWritingPipe(address); //이전에 설정한 5글자 문자열인 데이터를 보낼 수신의 주소를 설정
  radio.setPALevel(RF24_PA_MAX); //전원공급에 관한 파워레벨을 설정합니다. 모듈 사이가 가까우면 최소로 설정합니다.
  radio.stopListening();  //모듈을 송신기로 설정
  delay(1000);
}

 

 

 

 

<수신부 코드>

 #include <SPI.h> 

#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(10, 9); // SPI 버스에 nRF24L01 라디오를 설정하기 위해 CE, CSN 선언.
const byte address[6] = "00001"; //주소값을 5가지 문자열로 변경할 수 있으며, 송신기과 수신기가 동일한 주소로 해야됨.

unsigned long time;

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MAX); //전원공급에 관한 파워레벨을 설정합니다. 모듈 사이가 가까우면 최소로 설정합니다.

//거리가 가까운 순으로 RF24_PA_MIN / RF24_PA_LOW / RF24_PA_HIGH / RF24_PA_MAX 등으로 설정할 수 있습니다.

//높은 레벨(거리가 먼 경우)은 작동하는 동안 안정적인 전압을 가지도록 GND와 3.3V에 바이패스 커패시터 사용을 권장함
  radio.startListening(); //모듈을 수신기로 설정
}



void loop() {
  if (radio.available()) {
    char text[32] = "";
    radio.read(&text, sizeof(text));
    Serial.println(text);

      radio.openWritingPipe(address); //이전에 설정한 5글자 문자열인 데이터를 보낼 수신의 주소를 설정
      radio.setPALevel(RF24_PA_MAX); //전원공급에 관한 파워레벨을 설정합니다. 모듈 사이가 가까우면 최소로 설정합니다.
      radio.stopListening();  //모듈을 송신기로 설정

      time = millis();

      while(millis() < time + 1000)
      {
        const char text2[] = "OK";
        radio.write(&text2, sizeof(text2)); //해당 메시지를 수신자에게 보냄
        delay(1000);
      }
      

    radio.openReadingPipe(0, address);
    radio.setPALevel(RF24_PA_MAX); //전원공급에 관한 파워레벨을 설정합니다. 모듈 사이가 가까우면 최소로 설정합니다.
    radio.startListening(); //모듈을 수신기로 설정
  }

  
}

 

댓글