[아두이노] nRF24L01모듈로 RF 통신 사용하기


안녕하세요 대짜이찐입니다.
이전 Wifi 모듈에 이어서 이번엔 아두이노로 RF통신을 해보려 합니다.
RF통신이란 Radio Frequency라고 하는 무선 주파수 통신입니다.
이번에 사용하려고 하는 nRF24L01 모듈을 2.4G주파수 영역을 사용하며,
가정에서 사용하는 무선랜 주파수 영역과 같습니다.

아두이노와의 통신은 SPI통신을 사용합니다.


nRF24L01의 핀맵입니다.
아두이노와 연결은 아래 표와 같이 하면 되고,
IRQ핀은 사용하지 않습니다.

아두이노 우노
nRF24L01 모듈
3.3V
VCC
GND
GND
D8
CSN
D7
CE
D11
MOSI
D13
SCK
D12
MISO
NC
IRQ

전원은 3.3V를 사용하며, 로직레벨은 5V입니다.

5~12V를 전원으로 사용하기 위해선 별도의 어댑터가 필요하며,

I2C 통신과 5V를 사용할 수있는 어댑터 또한 있습니다.



준비물: 점퍼선, 아두이노 우노 x 2EA, nRF24L01 모듈 x 2EA, 10uF 캐패시터 x 2EA, 브레드 보드, 스위치 모듈

RF통신을 하기 위해서는 송/수신 nRF2401 통신모듈 2개와 아두이노 2개가 필요합니다.

nRF24L01 모듈과 아두이노를 연결하면 노이즈로 인해
거리가 멀어질수록 통신이 잘 안됩니다.
이를 해결하기 위해 전원단에 10uF 캐패시터를 바이패스 목적으로
연결해서 노이즈를 제거 할 수 있습니다.

소스코드를 사용하기 위해서 라이브러리가 필요합니다.
아래 링크에서 라이브러리를 다운 받을 수 있습니다.

https://github.com/nRF24/RF24



위에 회로도와 아래 소스를 사용한 예제는 스위치를 눌렀을 때,
송신쪽 아두이노에서 수신쪽 아두이노로 텍스트를 전송하는 예제입니다.

/*
nRF24L01 모듈 사용
아래 링크에서 라이브러리 다운로드
https://github.com/nRF24/RF24

http://www.devicemart.co.kr/
*/

#include <SPI.h>
#include "RF24.h"
int sw=6; // 스위치 D6에 연결하고 변수 선언
int read_sw=0; // 스위치 읽은 값 변수 선언

// 0번과 1번으로 송수신을 결정
// 수신 아두이노는 0으로, 송신 아두이노는 1로 설정하고 컴파일
bool radioNumber = 1;

RF24 radio(7,8); // 7번핀 CE, 8번핀 CSN으로 SPI통신 설정

// pipe adresses를 설정하기 위한 값
// 하나의 Rx가 6개까지의 Tx와 통신가능
// 5 byte의 문자열로 주소값 설정가능
byte addresses[6] = "ABCDE";

void setup()
{
Serial.begin(9600); // 통신속도 9600bps로 시리얼 통신 시작
pinMode(sw, INPUT_PULLUP); // 스위치 내부풀업 입력모드로 설정
radio.begin(); // nRF24L01모듈 초기화

// 전원 공급 관련 문제가 발생하지 않도록 PA레벨을 LOW로 설정, RF24_PA_MAX가 기본값
// RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX
// NRF24L01: -18dBm, -12dBm,-6dBM, and 0dBm
radio.setPALevel(RF24_PA_LOW);

// 송신기 설정
if(radioNumber)
{
  radio.openWritingPipe(addresses); // 데이터를 보낼 주소 설정
  radio.stopListening(); // Listening을 멈춤
}

// 수신기 설정
else
{
  radio.openReadingPipe(1,addresses); // 데이터를 받을 주소 설정
  radio.startListening(); // 읽는 pipe 주소의 data Listening 시작
}
}

void loop()
{
if (radioNumber) // 송신기
{
  read_sw=digitalRead(6);
  if(read_sw==1)
  {
   char message[] = "전자부품 No.1 쇼핑몰";
   radio.write(&message, sizeof(message)); // 해당 텍스트를 송신


char message2[] = "Device mart";

   radio.write(&message2, sizeof(message2)); // 해당 텍스트를 송신
   delay(300);
  }
}

 else // 수신기
{
  if(radio.available())
  {
   char message[32] = ""; // 최대 32byte까지 받아들일수 있음
   radio.read(&message, sizeof(message));
   Serial.println(message); // 읽은 텍스트 출력
  }
}
}

아두이노 2개를 사용하지만 소스코드는 1개입니다.
위 소스에서 송신으로 사용할 아두이노는 radioNumber를 1로 설정해주고,

// 0번과 1번으로 송수신을 결정
// 수신 아두이노는 0으로, 송신 아두이노는 1로 설정하고 컴파일
bool radioNumber = 1;

수신으로 사용할 아두이노는 radioNumber를 0으로 설정한 뒤,
 소스코드를 업로드 해줍니다.

// 0번과 1번으로 송수신을 결정
// 수신 아두이노는 0으로, 송신 아두이노는 1로 설정하고 컴파일
bool radioNumber = 0;



위 예제에서 사용한 제품은 모두 디바이스마트에서 구매하실 수 있습니다.

nRF24L01 무선통신모듈
http://www.devicemart.co.kr/goods/view?no=1322085

10uF 캐패시터
http://www.devicemart.co.kr/goods/view?no=1318

아두이노 우노
http://www.devicemart.co.kr/goods/view?no=1245596

nRF24L01 어댑터
http://www.devicemart.co.kr/goods/view?no=1322122
http://www.devicemart.co.kr/goods/view?no=1323015

감사합니다.

댓글 쓰기

0 댓글