반응형

【 아두이노모듈#19 nRF24L01 :  2.4G RF 무선통신 하기! ( Arduino 통신 ) 

 nRF24L01 모듈을 이용하여 RF 무선 통신을 해보자.  블루투스통신의 경우 통신거리가 10m 내외로 짧지만, nRF24 모듈은 2.4GHz 대 주파수를 사용한 통신으로 보통 100m 까지도 통신이 가능하다. 안테나가 달린 모듈을 사용할 경우 800까지도 가능하다. 


(기본 모듈의 경우 통신거리 스펙 : 250kbps의 속도로 ~250m까지,  실제 : 100m 정도,
 외장 안테나 달린 모듈 스펙 :  250kbps의 속도로 ~1.1km까지,  실제 : 800m 정도)   

 오늘은 기본적인 연결방법과 간단한 데이터(문자)를 송수신 하는 것을 다루고, 차후에는 무선 RC기기를 컨트롤 해보려고 한다. 

 Let's get it~!

 

▶ nRF24L01 에 대해 :

 nRF24L01모듈은 기본적으로 2.4GHz 대역을 사용하는 RF(Radio Frequency)통신 모듈이다. 

이 모듈의 장점은 Bluetooth, ZigBee, NFC 모듈에 비해 가격이 매우 저렴하고 통신 가능 거리가 긴 것이 장점이다. 

 단점은, RF통신의 특성상 중간에 벽과같은 장애물이 있을 경우 수신율이 많이 떨어질 수 있다.

Image from. howtomechatronics.com

- NRF24L01 모듈은 기본적으로 다대 다 통신이 가능하며, 1MHz 간격으로 125개의 주파수 채널을 운영할 수 있고, 1대 다 통신도 가능하다.   선택적 통신을 위해 5자리의 Address(주소)를 사용한다. 

 

기본적으로 위 모듈의 VCC 단자에는 1.9V~3.6V 입력만 가능하다, 따라서 아두이노 우노에 직접연결하고자 할 경우 반드시 3.3V 출력단자에 연결해야하니 주의가 필요하다.  만약 5V단자에 연결할 경우 nRF24L01 모듈의 손상을 피할 수 없다. 

 그런데, 아래 이미지의 nRF24L01 어뎁터 소켓을 사용하면,  3.3V 레귤레이터가 내장 되어 있어 아두이노의 5V 전원단자에 연결 할 수 있다. 

 소켓을 사용하면 좋은 다른 이유는, 복제(클론) 아두이노 보드나 다른 메이커의 아두이노 보드들 중 3.3V 출력에 사용되는 레귤레이터를 용량이 작은 것으로 사용하고 있는 것들이 더러 있어서 nRF24L01 모듈을 소켓없이 3.3V 단자에 연결하여 사용할 경우 동작이 잘 안 되는 경우가 더러 있기 때문인데, 소켓을 사용하여 5V 단자에 연결하면 이런 경우를 예방할 수 있다. 

이유는 메이커 업체들이 5V 단자를 주로 사용하게 되는 아두이노 보드에서 3.3V단자는 잘 사용하지 않기 때문에 비용절감을 위해 좀더 저용량?의 저렴한 3.3V 레귤레이터를 사용하려 하기 때문일 것이다. 

 그런데, 당장 소켓을 구할 수 없을 때는 어떻게 할 것인가? 그럴때는 아래 소켓의 설명처럼, nRF24L01 모듈의 +,- 단자 사이에 10uF 이상의 전해콘덴서를 납땜하여 전원보강을 해주면 이런 문제는 해결 될 것이다. 

nRF24L01 Adapter Socket
nRF24L01을 어뎁터 소켓에 장착한 모마

또한 송수신율을 높여주기 위해 필요한 경우 아래와 같은 커패시터(전해콘덴서-약 10uF이상) 를 VCC-GND단자 사이에 연결해주면 도움이 될 수 있다. 커패시터는 전기를 모아서 내보낼 수 있는 충방전 기능이 있어 출력을 보완해주어 전원을 안정시켜줄 수 있으며, 노이즈를 제거를 위해 바이패스용으로 세라믹 콘덴서를 함께 달 수도 있다.

위 모듈은 일반적으로 탁트인 공간에서 100m 정도 송수신이 가능하다.  그런데 그 이상의 통신거리가 필요하다면, 아래와 같은 안테나가 달린 모듈을 사용하면, 이론상 800m까지도 가능하다.

 

근본적으로 원거리 통신이 필요하다면, 아래 《nRF20L01 PA-LNA 외장 안테나 모듈》을 사용하면 된다.

 

▶ 실습 회로 도면 :

(송신기 아두이노 회로와 수신기 아두이노 회로를 동일하게 구성한다)

▶ 실습목표  :  

    1. nRF24L01 모듈 사용법을 익힐 수 있다.

    2. nRF24L01 모듈을 이용한 RF 무선 통신 모듈에 대해 익힐 수 있다.

    3. 아두이노 시리얼 모니터를 통해 간단한 문자를 송수신 할 수 있다 

 

▶ 코딩 :

코딩에 앞서, 'nRF24' 관련 라이브러리 파일이 필요하다. 
이를 깃허브를 통해 다운 받거나 아래 첨부파일로 다운받아서, 아두이노에서 추가해주어야 한다.

( 스케치IDE : 스케치 》 라이브러리 포함하기 》 .ZIP 라이브러리 추가 》 다운받은 라이브러리 선택.  끝 ) 

RF24-master.zip
0.36MB

깃 허브 직접 다운로드 :  https://github.com/nRF24/RF24

 

《송신기 코드》 아래 코드를 송신용 아두이노에 업로드 시킨다.

 

#include  <SPI.h>
#include  <nRF24L01.h>
#include  <RF24.h>
RF24 radio(7, 8); // SPI통신을 위한 (CE, CSN) 핀 선언
const byte address[6] = "00001"; // 송신기와 수신기를 동일한 값으로 주소 설정함(5자리)
void setup() {
  radio.begin();
  radio.openWritingPipe(address); // 데이터를 보낼 수신 주소를 설정
  radio.setPALevel(RF24_PA_MIN); // 송신거리에 따른, 전원공급 파워레벨 설정
//(최소) RF24_PA_MIN → RF24_PA_LOW  RF24_PA_HIGH  RF24_PA_MAX (최대) 설정가능
//송신이 약하다고 판단될 경우 nRF24모듈의 GND와 3.3V 단자에 전해콘덴서(10uF이상:+를3.3V연결)사용권장

  radio.stopListening();  // 모듈을 송신기로 설정
}
void loop() {
  const char text[] = "(From) nRF24 Tx : Hello World!"; // 송신할 문자
  radio.write(&text, sizeof(text));   // 위 문자를 문자 길이 만큼 송출함
  delay(1000);
}

 

《수신기 코드》 아래 코드를 수신용 아두이노에 업로드 시킨다.

#include  <SPI.h>
#include  <nRF24L01.h>
#include  <RF24.h>
RF24 radio(7, 8);     // SPI통신을 위한 (CE, CSN) 핀 선언
const byte address[6] = "00001"; // 송신기와 수신기가 동일한 값으로 주소 설정함(5자리)
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 (최대) 설정가능 
//송신이 약하다고 판단될 경우 nRF24모듈의 GND와 3.3V 단자에 전해콘덴서(10uF이상:+를3.3V연결)사용권장 
  radio.startListening();   // 모듈을 수신기(상태)로 설정
}
void loop() {
  if (radio.available()) {
    char text[32] = "";   // 데이터를 수신 받을 변수 설정
    radio.read(&text, sizeof(text));  // 수신되는 데이터 길이만큼 읽어 저장
    Serial.println(text);
  }
}

▶ 코드 다운로드 : 

nRF24 송신-수신 코드.zip
0.00MB

 

▶ 회로 동작(설명) 영상 :

(YouTube : 1080P 고화질로 보기)

https://youtu.be/5Q_yJY5bj4w

 

(카카오로 보기)

 

반응형