본문 바로가기

Arduino/NRF24L01

Arduino NRF24L01 example

두이노에서 NRF24L01 무선모듈 사용 예


2개의 아두이노 간에 무선으로 데이터를 송수신할 수 있도록 2개의 무선 모듈을 구입하여 테스트하려고 한다. 동일한 무선모듈을 2개 구입해야만 가능한 일이다. 가격도 저렴하고 송달거리가 장애물이 없는 개활지에서는 100m 까지 이를 수 있다고 한다.


네로마트에서 구입한 NRF24L01 모듈(초록색, LKEMBEDDED사 제조)




아두이노와 위의 NRF2401 모듈의 연결



아두이 NFR24L01 모듈( 초록색, LK Embeded 제조 )

3.3V                 VCC

GND                 GND

D7                 CE

D8                 CSN

D11                 MOSI

D12                 MISO

D13                 SCK



CE, CSN 에 연결되는 아두이노 핀은 임의로 선택할 수 있고 소스코드에서 해당 핀 번호를 등록하면 된다

그 외의 다른 핀은 고정되어 있는 것이므로 임의로 변경하면 작동하지 않는다


파이프 주소는 송/수신 측에서 동일한 주소를 사용해야 한다


NFR24L01 모듈은 인터넷에서 구매할 때 검정색, 초록색 바탕으로 2가지가 있는데, 검정색 바탕의 모듈을 구매해서 아두이노와 연결하여 테스트해보니 통신이 이루어지지 않았다. 아두이노 보드에서 무선 모듈에 공급하는 전류가 너무 낮아서 잘 작동하지 않는 문제가 있다는 정보를 본 적이 있어서 이번에는 초록색 바탕의 무선모듈을 다시 구해서 테스트했는데 송수신에 성공했다


NFR24L01 모듈은 송/수신 기능으로 모두 사용할 수 있지만 모듈 한개로 동시에 송수신할 수는 없고 송신할 때는 수신할 수 없고, 수신할 때는 동시에 송신할 수는 없다. 그러므로 송/수신 테스트를 위해서는 반드시 2개의 모듈을 구입해야 한다


테스트해본 결과 가까운 거리일지라도 집안의 벽 뒤에서는 수신되지 않았다. 툭 트인 공간에서는 100m까지 가능하다고 적혀 있었는데 아직 테스트해보지는 않았다


아래의  코드가 컴파일에 성공하기 위해서는 NFR24L01을 지원하는 RF24라는 라이브러리를 먼저 설치해야 한다


RF24 라이브러리 다운로드 https://github.com/maniacbug/RF24


송신측 코드

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

#define CE_PIN 7
#define CSN_PIN 8

int joystick[2];
RF24 radio(CE_PIN, CSN_PIN);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int x;
int y;

void setup(void)
{
  Serial.begin(9600);
  radio.begin();
  radio.setPALevel(RF24_PA_MIN); // LOW, MAX
  radio.openWritingPipe(pipe);
  x = 0;
  y = 0;
}
void loop(void)
{
  joystick[0] = x++;
  joystick[1] = y++;
  radio.write( joystick, sizeof(joystick) );
  Serial.println("Sent");
  delay(1000);
}


수신측 코드

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
 
#define CE_PIN 7
#define CSN_PIN 8
 
int joystick[2];
RF24 radio(CE_PIN, CSN_PIN);
const uint64_t pipe = 0xE8E8F0F0E1LL;
 
void setup(void)
{
  Serial.begin(9600);
  radio.begin();
  radio.setPALevel(RF24_PA_MIN); // LOW, MAX
  radio.openReadingPipe(1,pipe);
  radio.startListening();
}
void loop(void)
{
  if ( radio.available() )
  {
      radio.read( joystick, sizeof(joystick) );
 
      Serial.print(joystick[0]);
      Serial.print(", ");
      Serial.println(joystick[1]);
  }
}