본문 바로가기
아두이노 통신

[통신/근거리고속] 2.4Ghz 양방향 통신을 nRF24L01 모듈로 구현하자

by 작동미학 2015. 5. 22.
반응형

nRF24L01 모듈을 통해 양방향 통신을 두대의 Arduino UNO로 해보자.

 

▶ 이 가이드를 따라하면

- SPI방식의 양방향 통신 모듈을 구현해볼 수 있다

- nRF24L01모듈의 사용방법을 알 수 있다.

 

▶ 먼저 읽으면 좋은 글

- 아두이노 기초 : http://bbangpan.tistory.com/1

 

▶ 부품 설명 및 회로 구성

 nRF24L01은 SPI(모듈과 Arduino 보드간의 통신 방식으로, MISO, MOSI등의 핀을 통해 통신한다) 통신 방식을 통해 2.4Ghz의 양방향 신호 전달이 가능한 저가($2 미만)의 통신 모듈이다. 그러나 3.3V 기반이라 Arduino Due같은 모델이 아니면 사용방법이 어려운게 특징이다. 이 모듈의 소모 전력은 그리 높지 않으나, Arduino UNO같은 5V기반의 보드들은 3.3V 지원 전압이 50mA정도로 매우 약하기 때문이다.

 nRF24L01이라고 판매되는 모듈도 다양한데, 여기서는 녹색보드 기반의 nRF24L01모듈을 사용했다. 사진은 아래와 같다. 검정색도 판매하는데 본인의 경우에는 전력문제인지 Arduino UNO에서는 이 검정색 모듈이 잘 작동하지 않았다. 최대 속도는 2Mbps이고, 도달거리 실험자료가 몇가지 있지만, 개방된 장소에서도 모듈 뽑기에 따라 10여m만 도달하는 경우가 있고, 집안을 다 커버하기 버거운 경우가 많고, 벽이 있으면 신호가 잡히지 않기도 한다. 별도 외장 안테나가 달린 모델도 판매하는데 사용기에 따르면 2~3배 정도 더 커버한다고 한다.

 NRF칩을 쓰는 이 모듈은 반면에 다른 통신 모듈 대비 고속의 전송이 가능하다는 장점과 SPI방식이라 핀이 많이 필요하다는 단점을 지닌다. (그리고 추가해두는데 socket adapter가 있어서, 전력이 부족한 부분을 보충해주고 5V에서도 사용가능하게 해준다고 들었다. nRF24L01과 socket adapter로 검색해보자)

<nRF24L01통신모듈(녹색), 송수신이 동시에 가능하다. >

<NRF24L01, 검정색버전>

연결방법 등은 http://www.bashmodulo.com/arduino/nrf24l01-radio-frequency-transmitter-receiver-on-arduino/ 를 참조하면 된다.

기본적으로 VCC->3.3V, GND->GND, CE->D9, SCN->D10, SCK->D13, MOSI->D11, MISO->D12로 연결하면 되고, CE/SCN의 연결핀은 소스상에서 교체가 가능하다. IRQ는 연결하지 않는다.

<녹백버전PIN>

<검정버전PIN>

<UNO에 두 쌍을 연결한 그림>

▶ 라이브러리 설치

RF24가 가장 안정적으로 작동하는 것으로 알려져있다. https://github.com/maniacbug/RF24/tree/master 를 받아서 설치하자. zip으로 받은 후 역시 Arduino의 library 폴더 안에 압축을 풀면 된다.

 

▶ 소스 코드 입력 및 구동

아래는 두 개의 숫자를 송신하고 수신하는 예제이다. 앞서 소개한 링크의 joystick신호 보내는 소스를 약간만 바꾸어 전송만 확인한다.

두가지 소스 중 아래는 송신측 소스이다.

GitHub 원본 소스 링크 / https://github.com/bbangpan/bbangpan.com/blob/master/neibc_nrf24l01_newtrans/neibc_nrf24l01_newtrans.ino

http://www.bbangpan.com ----------------------------------

#include <SPI.h>

#include <nRF24L01.h>

#include <RF24.h>

#define CE_PIN 9

#define CSN_PIN 10

#define JOYSTICK_X A0

#define JOYSTICK_Y A1

 

const uint64_t pipe = 0xE8E8F0F0E1LL;

 

RF24 radio(CE_PIN, CSN_PIN);

int valarray[2];

 

void setup()

{

Serial.begin(9600);

radio.begin();

radio.openWritingPipe(pipe);

}

 

void loop()

{

valarray[0] = 0;

valarray[1] = 1000;

radio.write( valarray, sizeof(valarray) );

}

아래는 수신측 소스이다.

GitHub 원본 소스 링크 / https://github.com/bbangpan/bbangpan.com/blob/master/neibc_nrf24l01_newrecv/neibc_nrf24l01_newrecv.ino

http://www.bbangpan.com ----------------------------------

#include <SPI.h>

#include <nRF24L01.h>

#include <RF24.h>

#define CE_PIN 9

#define CSN_PIN 10

 

const uint64_t pipe = 0xE8E8F0F0E1LL;

 

RF24 radio(CE_PIN, CSN_PIN);

 

int valarray[2];

 

void setup()

{

Serial.begin(9600);

delay(1000);

Serial.println("Nrf24L01 Receiver Starting");

radio.begin();

radio.openReadingPipe(1,pipe);

radio.startListening();

}

 

void loop()

{

if ( radio.available() ) {

bool done = false;

while (!done) {

done = radio.read( valarray, sizeof(valarray) );

Serial.print("X = ");

Serial.print(valarray[0]);

Serial.print(" Y = ");

Serial.println(valarray[1]);

}

} else {

Serial.println("No radio available");

}

 

}

 

각각 송수신 Arduino에 컴파일해서 넣은 후 recv쪽에서 시리얼모니터로 확인해보자. 실제 송신측이 송신하는 숫자 두개를 출력하는 것을 알 수 있다.

<nRF24L01 모듈 수신 확인>

▶ 구매 가이드

nRF24L01 : http://www.aliexpress.com/wholesale?catId=0&initiative_id=SB_20150521080951&SearchText=nrf24l01

nRF24L01 (green) : http://www.aliexpress.com/item/2pcs-lot-Green-NRF24L01-wireless-module-2-4-G-Wireless-Commmunication-Module-Free-Shipping-12000162/32227170319.html

nRF24L01 socket adapter : https://www.aliexpress.com/af/nRF24L01-socket-adapter.html?d=y&origin=n&SearchText=nRF24L01+socket+adapter&catId=0&initiative_id=SB_20200902075442 


강의 키워드

nRF24L01, NRF24L01, 2.4Ghz 통신, 양방향 송수신, Arduino, 3.3V

 

 

반응형