nRF24L01모듈을 사용해 오렌지 보드끼리 통신하기

 


[컴퓨터월드] 아두이노는 이탈리어로 ‘친한 친구’라는 뜻을 가진 대표적인 오픈소스 하드웨어다. 딱딱하고 접근하기 힘들었던 임베디드 분야를 누구나 쉽게 접근할 수 있도록 만든 미니 기판이라 할 수 있다. 이번 강좌에 사용하는 아두이노 오렌지보드는 한국형 아두이노라 할 수 있다.

아두이노의 보급은 오픈소스 하드웨어의 확산을 불러일으켰고 메이커 문화의 확산에도 큰 기여를 했다. 최근에는 인텔, 마이크로소프트 등 대형 기업들도 이런 오픈소스 하드웨어 시장에 뛰어들기 시작했다. 그 만큼 오픈소스 하드웨어 시장의 잠재력이 커졌다는 얘기이다.

RF통신이란?
RF는 Radio Frequency의 약자로 우리말로는 방사주파수라 하며 무선 주파수를 방사해 정보를 교환하는 통신 방법이다. RF통신은 우리가 들을 수 있는 가청 주파수(audio frequency)와 대조되며 주로 10Khz에서 300Ghz사이의 영역을 의미한다.

 

그림과 같이 다양한 종류의 주파수가 무선통신으로 사용된다. 대표적인 예가 차 안에서 많이 듣는 라디오다. 라디오의 경우 주파수 변경을 통해 다양한 채널을 들을 수 있다.

파장이 긴 극저주파는 잠수함이나 내비게이션에 사용되며 파장이 긴 극고주파는 우주산업과 관련된 곳에 쓰인다. 주로 우리가 사용하는 무선통신은 4세대(4G) 무선통신으로 2.4GHz~5GHz 사이 대역의 주파수가 사용된다. WiFi와 블루투스가 이에 속한다.

흔히 우리 생활에서 사용하는 대부분의 무선 통신을 RF통신이라고 보면 이해가 쉽다.


아두이노와 RF모듈

이번 튜토리얼에서 사용할 부품은 nRF24L01 모듈로 모습은 아래 사진과 같다. 모듈의 가격이 2$ 미만으로 국내에서 3 ~ 4천 원대로 구매가 가능하기 때문에 다른 통신모듈에 비해 싸다는 장점이 있으며 2.4Ghz로 양방향 통신이 가능하다.

10m이내 거리 통신에 쓰이기에 적합하며 안테나가 달려있는 모듈은 통신거리가 더 늘어나기도 한다. 다만 작동 전압이 3.3V이다 보니 5V가 기본이 아두이노UNO에서는 선 연결에 주의해야 한다.


 
 

필요한 부품 목록

 

 

하드웨어 연결하기

브레드 보드
1. RF모듈의 VCC핀을 오렌지보드의 3.3v에 연결한다.
2. RF모듈의 GND핀을 오렌지보드의 GND에 연결한다.
3. RF모듈의 CSN핀을 오렌지보드의 D8에 연결한다.
4. RF모듈의 CE핀을 오렌지보드의 D7에 연결한다.
5. RF모듈의 MOSI핀을 오렌지보드의 D11에 연결한다.
6. RF모듈의 SCK핀을 오렌지보드의 D13에 연결한다.
7. RF모듈의 MISO핀을 오렌지보드의 D12에 연결한다.

 

전자 회로도

 


유의점 : 다른 모듈과 달리 VCC단자를 오렌지 보드의 3.3v에 연결하는 것에 유의해야 한다. 5V에 연결하여 사용할 경우 모듈이 망가질 수 있다.

nRF24L01 모듈은 오렌지보드와 SPI통신을 하기 때문에 MOSI(Master Out Slave In)핀과 MISO(Master In Slave Out)핀을 사용한다. 자세한 모듈 연결은 아래 사진을 참조한다.

 
 



소스코드

송신측 코드

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

#define CE_PIN 7
#define CSN_PIN 8

const uint64_t pipe = 0xE8E8F0F0E1LL;

RF24 radio(CE_PIN, CSN_PIN);
int arr[3] = {0,1,2};

void setup() {
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);

}

void loop() {
radio.write( arr, sizeof(arr) );
Serial.println("Send Success");
delay(1000);
}


수신측 코드
 

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

#define CE_PIN 7
#define CSN_PIN 8

const uint64_t pipe = 0xE8E8F0F0E1LL;

RF24 radio(CE_PIN, CSN_PIN);

int arr[3];

void setup() {
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(1, pipe);
radio.startListening();
delay(1000);
Serial.println("NRF24L01 Receiver Starting");
}

void loop() {
if ( radio.available() ) {
bool done = false;
while (!done) {
done = radio.read( arr, sizeof(arr) );
Serial.print(arr[0]);
Serial.print(", ");
Serial.print(arr[1]);
Serial.print(", ");
Serial.println(arr[2]);
}
}
else {
Serial.println("No radio available");
}
}


코드는 송신측 코드와 수신측 코드 2개로 이뤄진다.

송신쪽의 아두이노와 수신쪽의 아두이노는 파이프 통신으로 데이터를 송수신한다. 파이프 통신이란 한쪽에서 물을 흘려보내면 그 물이 다른 쪽으로 나오는 파이프의 모습과 유사한 통신 방법이기 때문에 붙여진 이름이다.

파이프의 각 입구마다 주소를 정해놓고 보내는 쪽과 받는 쪽에서는 그 주소를 통해 통신하게 된다. 파이프 통신은 양방향 통신이 가능하지만 위 예제의 경우에는 송신 쪽이 수신 쪽으로 데이터를 보내기만 하는 단방향 통신이다.

 

 


파이프통신에서는 보통 부모–자식 간 통신이라는 표현을 사용한다. 보내는 쪽은 부모, 받는 쪽을 자식이라 부른다. 위 예제는 한 방향으로 흐르는 통신이기 때문에 보내는 쪽과 받는 쪽에서는 각각 하나의 파이프만을 열어 사용한다.

//송신쪽 코드
radio.openWritingPipe(pipe); //부모의 쓰기 파이프 open

//수신쪽 코드
radio.openReadingPipe(1, pipe); //자식의 읽기 파이프 open


파이프가 열리게 되면 그 이후에는 시리얼통신과 같이 read()함수와 write()함수를 사용해 데이터를 송수신한다. 데이터를 송수신할 때는 데이터의 크기를 매개변수에 포함해 전달한다.

//송신쪽 코드
radio.write( arr, sizeof(arr) ); //arr배열 전달

//수신쪽 코드
radio.read( arr, sizeof(arr) ); //arrd


▲ 결과 출력 화면
 

마치며

RF통신은 어렵게 들릴 수도 있지만 이미 우리 실생활에서 대부분의 통신에 쓰이고 있다. 아두이노에는 블루투스나 WiFi, Zigbee 등 다양한 통신을 활용할 수 있다. 하지만 정작 아두이노끼리 무선통신을 쉽게 할 수 있는 모듈은 쉽게 찾을 수 없다. 이런 면에서 nRF24L01 모듈은 가격이나 난이도 측면에서 모두 쉽게 사용할 수 있는 모듈이다.

다만 코드작성에서는 약간의 컴퓨터 지식이 필요한 만큼 응용을 위해서는 공부가 필요하다.
코코아팹(http://kocoafab.cc)을 통해 위 튜토리얼의 내용과 nRF24L01 모듈을 사용해 RC카와 무선으로 제어 가능한 컨트롤러를 만든 프로젝트 등을 확인할 수 있다.

저작권자 © 컴퓨터월드 무단전재 및 재배포 금지