이 튜토리얼에서는 nRF24L01 트랜시버 모듈을 사용해 두 아두이노 보드 간 무선 통신 구현 방법을 배웁니다. nRF24L01 모듈은 아두이노용 무선 통신에 매우 인기 있는 선택지입니다.
이미 여러 아두이노 프로젝트에 이 모듈 사용했습니다. 일부 확인 가능:
DIY 아두이노 RC 송신기
아두이노 RC 비행기 | 100% DIY
DIY 아두이노 기반 RC 호버크래프트
아두이노 무선 기상 관측소 프로젝트
다음 영상 시청 또는 아래 문서 튜토리얼 읽기. 모듈 핀아웃, 작동 원리, 배선, 여러 코드 예제 등 nRF24L01 트랜시버 모듈 필수 지식 모두 포함.
개요
무선 통신 설명 위해 두 예제 만듭니다. 첫째: 한 아두이노에서 다른 아두이노로 간단 "Hello World" 메시지 전송. 둘째: 두 아두이노 간 양방향 통신. 첫 번째 아두이노 조이스틱으로 두 번째 아두이노 서보 모터 제어, 반대로 두 번째 아두이노 푸시버튼으로 첫 번째 아두이노 LED 제어.
nRF24L01 트랜시버 모듈
nRF24L01 트랜시버 모듈 자세히 보기. 2.4GHz 대역 사용, 250kbps~2Mbps 보레이트 작동. 개방 공간에서 낮은 보레이트 사용 시 통신 거리 최대 100m.
전체 사양:
주파수 범위
2.4~2.5GHz ISM 대역
데이터 속도
250Kbps / 1Mbps / 2Mbps
최대 출력
0dBm
동작 전압
1.9~3.6V
최대 동작 전류
12.3mA
대기 전류
22µA
로직 입력
5V 허용
통신 거리
100m (개방 공간)
작동 원리
모듈은 125개 채널 사용 가능해 한 장소에 125개 독립 모뎀 네트워크 구성 가능. 각 채널당 최대 6개 주소, 각 유닛이 동시에 최대 6개 다른 유닛과 통신 가능.
모듈 전력 소비는 전송 시 약 12mA로 단일 LED보다 낮음. 동작 전압 1.9~3.6V지만 다른 핀은 5V 로직 허용해 로직 레벨 컨버터 없이 아두이노 직접 연결 가능.
세 핀은 SPI 통신용으로 아두이노 SPI 핀 연결 필요. 단 아두이노 보드별 SPI 핀 다름 주의. CSN, CE 핀은 아두이노 아무 디지털 핀이나 연결 가능, 대기/액티브 모드 설정, 송신/명령 모드 전환용. 마지막 핀은 인터럽트 핀으로 필수 아님.
모듈 변형
NRF24L01 모듈 여러 변형 존재. 가장 인기 많은 건 온보드 안테나 내장형. 컴팩트하지만 통신 거리 약 100m로 감소.
두 번째 변형: 온보드 안테나 대신 SMA 커넥터로 덕 안테나 장착 가능해 더 나은 통신 거리.
세 번째 변형: 덕 안테나 외 RFX2401C 칩 내장. PA(파워 앰프)와 LNA(저잡음 앰프) 포함. NRF24L01 신호 증폭으로 개방 공간 최대 1000m 통신 거리 달성.
nRF24L01 모듈 핀아웃
NRF24L01 핀아웃과 NRF24L01+ PA/LNA 모듈 상세 보기.
두 모듈(NRF24L01, NRF24L01+ PA/LNA) 핀아웃 동일해 같은 방식으로 회로 연결 가능.
nRF24L01 아두이노 연결 방법
NRF24L01 모듈 아두이노 보드 연결법.
앞서 말했듯 아두이노 보드별 SPI 핀 다름. 모듈 연결 시 유의.
아두이노
SCK
MISO
MOSI
SS
Uno
13
12
11
10
Nano
13
12
11
10
Mega
52
50
51
53
이 아두이노 튜토리얼 필요 부품:
NRF24L01 트랜시버 모듈 ………
아두이노 보드 ………………………………
브레드보드와 점퍼 와이어 …………
아두이노와 nRF24L01 코드
NRF24L01 모듈 아두이노 연결 완료 후 송신기·수신기 코드 작성.
먼저 RF24 라이브러리 다운로드·설치로 프로그래밍 단순화. 아두이노 IDE 라이브러리 매니저에서 직접 설치 가능. "rf24" 검색 후 "TMRh20, Avamander" 버전 찾아 설치.
setup에서 두 파이프 정의. 첫 번째 아두이노 쓰기 주소 = 두 번째 아두이노 읽기 주소, 첫 번째 아두이노 읽기 주소 = 두 번째 아두이노 쓰기 주소.
// 송신기 측 radio.openWritingPipe(addresses[1]); // 00001 radio.openReadingPipe(1, addresses[0]); // 00002
// 수신기 측 radio.openWritingPipe(addresses[0]); // 00002 radio.openReadingPipe(1, addresses[1]); // 00001
loop에서 radio.stopListening()로 첫 번째 아두이노 송신기 모드, 조이스틱 값 0~180 매핑 읽고 radio.write()로 수신기 전송.
radio.stopListening(); int potValue = analogRead(A0); int angleValue = map(potValue, 0, 1023, 0, 180); radio.write(&angleValue, sizeof(angleValue));
수신 측 radio.startListening()로 두 번째 아두이노 수신기 모드, 데이터 가용 여부 확인. 데이터 있는 동안 읽어 "angleV" 저장, 그 값으로 서보 모터 회전.
radio.startListening(); if ( radio.available()) { while (radio.available()) { int angleV = 0; radio.read(&angleV, sizeof(angleV)); myServo.write(angleV); }
다음, 송신 측 첫 번째 아두이노 수신기 모드, 빈 "while" 루프로 두 번째 아두이노 데이터(푸시버튼 눌림 여부) 전송 대기. 버튼 눌리면 LED 점등. 이 과정 끊임없이 반복, 두 아두이노 지속 송수신.
예제 3 – 단일 패키지로 다중 변수 전송
NRF24L01 모듈 사용 한 가지 더 예제 코드. 이전 예제들과 모두 동일하나 데이터 구조화·전송 방식만 다름.
송신기 코드
/* Arduino Wireless Communication Tutorial Example 1 - Transmitter Code by Dejan Nedelkovski, www.HowToMechatronics.com Library: TMRh20/RF24, https://github.com/tmrh20/RF24/ */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(7, 8); // CE, CSN const byte address[6] = "00001"; // 이 구조체 최대 크기 32바이트 - NRF24L01 버퍼 한계 struct Data_Package { byte a = 0; byte b = 125; byte c = 255; int d = 1024; float e = 3.141592; String f = "Test"; }; Data_Package data; // 위 구조체 변수 생성 void setup() { radio.begin(); radio.openWritingPipe(address); radio.setPALevel(RF24_PA_MIN); radio.stopListening(); } void loop() { // 구조체 전체 데이터 수신기 전송 radio.write(&data, sizeof(Data_Package)); delay(500); }
다양한 타입 변수 모음인 struct 생성 가능.
// 이 구조체 최대 크기 32바이트 - NRF24L01 버퍼 한계 struct Data_Package { byte a = 0; byte b = 125; byte c = 255; int d = 1024; float e = 3.141592; String f = "Test"; }; Data_Package data; // 위 구조체 변수 생성
이 struct 데이터 최대 크기 32바이트 명심. 여기 byte 변수 3개, int 변수 1개(4바이트), float 변수 1개(4바이트), 4문자 String(4바이트) 포함 총 15바이트.
수신기 코드
/* Arduino Wireless Communication Tutorial Example 1 - Receiver Code by Dejan Nedelkovski, www.HowToMechatronics.com Library: TMRh20/RF24, https://github.com/tmrh20/RF24/ */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(7, 8); // CE, CSN const byte address[6] = "00001"; // 이 구조체 최대 크기 32바이트 - NRF24L01 버퍼 한계 struct Data_Package { byte a = 0; byte b = 125; byte c = 255; int d = 1024; float e = 3.141592; String f = "Test"; }; Data_Package data; // 위 구조체 변수 생성 void setup() { Serial.begin(9600); radio.begin(); radio.openReadingPipe(0, address); radio.setPALevel(RF24_PA_MIN); radio.startListening(); } void loop() { // 수신 데이터 있는지 확인 if (radio.available()) { radio.read(&data, sizeof(Data_Package)); // 전체 데이터 읽어 'data' 구조체 저장 } Serial.print("a: "); Serial.print(data.a); Serial.print(" b: "); Serial.print(data.b); Serial.print(" c: "); Serial.print(data.c); Serial.print(" d: "); Serial.print(data.d); Serial.print(" e: "); Serial.print(data.e); Serial.print(" f: "); Serial.println(data.f); }
수신 측에서도 동일 struct 정의해야 수신 데이터 처리 가능. 무선 통신 정상 작동 테스트 위해 시리얼 모니터 각 변수 출력.
결론
NRF24L01 모듈은 아두이노 프로젝트 무선 통신 필요 시 훌륭한 옵션. 이미 여러 아두이노 프로젝트에 사용.
이 모듈 사용한 내 프로젝트 모두 나열:
아두이노 로봇카 무선 제어: HC-05 블루투스, NRF24L01, HC-12 트랜시버 모듈 사용
아두이노 무선 기상 관측소 프로젝트
DIY 아두이노 RC 송신기
아두이노 개미 헥사포드 로봇
DIY 아두이노 기반 RC 호버크래프트
아두이노 메카넘 휠 로봇
DIY 아두이노 RC 수신기 (RC 모델·아두이노 프로젝트용)
아두이노 RC 비행기 | 100% DIY
각 프로젝트/튜토리얼에 NRF24L01 모듈 사용법 상세 설명, 회로도, 통신 개선 코드 구현 등 포함.
내 최애 프로젝트는 커스텀 설계 아두이노 RC 송신기. 실제 14채널 RC 컨트롤러로 거의 모든 아두이노 프로젝트 제어 가능.
이 튜토리얼 여기까지. 즐겁게 보셨고 새 지식 얻으셨길. 언제나처럼 댓글 섹션 질문 자유롭게 남겨주세요.