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

아두이노 nRF24L01 양방향 통신

by DIYver 2021. 3. 14.

 

 

 

이번 포스팅에서는 nRF24L01 의 양방향 통신에 대해서 다뤄보도록 한다.

 

 

 

 

nRF24L01의 기본적인 사용 방법은 이전 포스팅에서 다뤘으니,

기본적인 단방향 통신이 궁금하다면 아래 링크의 포스트를 참고하시길 바란다.

diyver.tistory.com/145

 

아두이노 nRF24L01 모듈로 무선통신 하는 방법

<목표> - 아두이노의 무선 통신의 대표는 WiFi, Bluetooth, RF통신 이 있다. 이 중에서 이번에는 RF통신을 다뤄보도록 한다. RF란? Radio Frequency로, 직역하면 무선 주파수 이며, 곧 주파수를 통한 통신을

diyver.tistory.com

 

 

기본적으로 nRF24L01 의 통신 모듈은 단방향 통신이 보통 사용 방법이다.

블루투스 HC-05, HC-06 모듈처럼 양방향 통신이 기본적으로 지원하지 않는다는 뜻이다.

 

nRF24L01 의 경우 송신으로 설정하면 수신은 안되고,

수신으로 설정하면 송신이 안된다.

 

이런 단방향 통신 모듈도 약간의 꼼수?를 사용하면 양방향 통신이 가능하다.

 

기본적으로 2개의 nRF24 모듈이 장착된 아두이노 세트가 2개 있어야 한다.

필자의 경우 버튼을 하나 추가하여서 버튼을 누를경우 서로 통신이 되게끔 하였다.

 

세트 A 와 세트 B가 있을경우

세트 A에서 버튼을 누르면 "signal"이라는 신호를 송출한다.

세트 B에 신호가 들어가게되고,

세트 B는 신호를 입력받으면, 입력받았다는 뜻으로 "OK" 사인을 세트 A에 보내는 식이다.

 

세트A에서 "signal" 이라는 신호를 송출함과 동시에

송신기 모드에서 수신기 모드로 설정을 바꿔줘야 하며,

세트 B에게 "OK" 신호를 받으면 다시 송신기 모드로 변환해준다.

 

 

세트B는 수신기 모드에서

신호를 받으면 "OK" 라는 신호를 보내기 위해

송신기 모드로 바꿔준다.

신호를 보냈다면 다시 신호를 받기위해서 수신기 모드로 변환해준다.

 

 

 

 

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

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_MIN); //전원공급에 관한 파워레벨을 설정합니다. 모듈 사이가 가까우면 최소로 설정합니다.

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

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

  radio.stopListening();  //모듈을 송신기로 설정

}


void loop() {
  // put your main code here, to run repeatedly:
  
 
  while(digitalRead(button_pin))
  {
   
    delay(10);
  }
  time = millis();

  const char text[] = "signal";
  Serial.println("signal");
  radio.write(&text, sizeof(text)); //해당 메시지를 수신자에게 보냄
  //delay(1000);


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

  while(millis() < time + 3000) 
  {
    if (radio.available()) {
      char text2[32] = "";
      radio.read(&text2, sizeof(text2));
      Serial.println(text2);
      break;
    }
  }
  radio.openWritingPipe(address); //이전에 설정한 5글자 문자열인 데이터를 보낼 수신의 주소를 설정
  radio.setPALevel(RF24_PA_MIN); //전원공급에 관한 파워레벨을 설정합니다. 모듈 사이가 가까우면 최소로 설정합니다.
  radio.stopListening();  //모듈을 송신기로 설정
  delay(1000);
}

<세트 A - 송신기 코드>

 

 

 #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_MIN); //전원공급에 관한 파워레벨을 설정합니다. 모듈 사이가 가까우면 최소로 설정합니다.

//거리가 가까운 순으로 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_MIN); //전원공급에 관한 파워레벨을 설정합니다. 모듈 사이가 가까우면 최소로 설정합니다.
      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_MIN); //전원공급에 관한 파워레벨을 설정합니다. 모듈 사이가 가까우면 최소로 설정합니다.
    radio.startListening(); //모듈을 수신기로 설정
  }

  
}

<세트 B - 수신기 코드>

 

 

세트A를 PC에 연결하여 시리얼 모니터로 확인한 결과이다.

 

 

이런식으로 nRF24L01 로 통신하게 되면 

보다 확실하게 통신을 하고 있는지 확인할 수 있게 된다.

 

다음번에는 이런 방식을 통해서

nRF24L01 의 통신 거리를 확인해보도록 하겠다.

 

기회가 된다면 물속에서도 통신이 되는지 확인을 해보도록 하겠다.

과연 2.4GHz 통신이 물속에서는 얼마나 안 될지 궁금하다.

 


※ 궁금하시거나 질문사항이 있으시면 댓글로 작성해주시면 답변해 드릴 수 있는 부분에서 친절히 답변드리겠습니다!

 

 

 

댓글