<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://smwiki.info/index.php?action=history&amp;feed=atom&amp;title=%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8%3ARF%ED%86%B5%EC%8B%A0_nRF24L01%2B</id>
	<title>아두이노:RF통신 nRF24L01+ - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://smwiki.info/index.php?action=history&amp;feed=atom&amp;title=%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8%3ARF%ED%86%B5%EC%8B%A0_nRF24L01%2B"/>
	<link rel="alternate" type="text/html" href="https://smwiki.info/index.php?title=%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8:RF%ED%86%B5%EC%8B%A0_nRF24L01%2B&amp;action=history"/>
	<updated>2026-07-23T17:54:56Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://smwiki.info/index.php?title=%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8:RF%ED%86%B5%EC%8B%A0_nRF24L01%2B&amp;diff=11363&amp;oldid=prev</id>
		<title>Sam: 새 문서: {{아두이노}}  == 개요 == nRF24L01+ 모듈을 이용한 통신을 다루는 문서. 2.4GHz의 이론에 대하여선 아두이노:2.4GHz 송수신 문서를 참고하자.  === nRF24L01+ 모듈 규격 === nRF24L01+ 모듈은 이 대역에서 동작하는 GFSK 방식의 반이중(half-duplex) 트랜시버로, 한 순간에는 송신 또는 수신 중 하나만 수행하지만 소프트웨어적으로 역할을 빠르게 전환해 양방향 통신을 구현할 수 있다.&lt;...</title>
		<link rel="alternate" type="text/html" href="https://smwiki.info/index.php?title=%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8:RF%ED%86%B5%EC%8B%A0_nRF24L01%2B&amp;diff=11363&amp;oldid=prev"/>
		<updated>2026-07-23T15:14:19Z</updated>

		<summary type="html">&lt;p&gt;새 문서: {{아두이노}}  == 개요 == nRF24L01+ 모듈을 이용한 통신을 다루는 문서. 2.4GHz의 이론에 대하여선 &lt;a href=&quot;/%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8:2.4GHz_%EC%86%A1%EC%88%98%EC%8B%A0&quot; title=&quot;아두이노:2.4GHz 송수신&quot;&gt;아두이노:2.4GHz 송수신&lt;/a&gt; 문서를 참고하자.  === nRF24L01+ 모듈 규격 === nRF24L01+ 모듈은 이 대역에서 동작하는 GFSK 방식의 반이중(half-duplex) 트랜시버로, 한 순간에는 송신 또는 수신 중 하나만 수행하지만 소프트웨어적으로 역할을 빠르게 전환해 양방향 통신을 구현할 수 있다.&amp;lt;...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{아두이노}}&lt;br /&gt;
&lt;br /&gt;
== 개요 ==&lt;br /&gt;
nRF24L01+ 모듈을 이용한 통신을 다루는 문서. 2.4GHz의 이론에 대하여선 [[아두이노:2.4GHz 송수신]] 문서를 참고하자.&lt;br /&gt;
&lt;br /&gt;
=== nRF24L01+ 모듈 규격 ===&lt;br /&gt;
nRF24L01+ 모듈은 이 대역에서 동작하는 GFSK 방식의 반이중(half-duplex) 트랜시버로, 한 순간에는 송신 또는 수신 중 하나만 수행하지만 소프트웨어적으로 역할을 빠르게 전환해 양방향 통신을 구현할 수 있다.&amp;lt;ref&amp;gt;How To Mechatronics, &amp;quot;nRF24L01 – How It Works&amp;quot;.&amp;lt;/ref&amp;gt; 주요 특징:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;초저전력&amp;#039;&amp;#039;&amp;#039;: 송신 시 약 12 mA(0 dBm 기준)로 LED 한 개보다 적게 소비하며, 대기 22 µA, 파워다운 900 nA 수준이다.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;저가&amp;#039;&amp;#039;&amp;#039;: 모듈당 미화 2달러 내외로 매우 저렴하다.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;다중 노드&amp;#039;&amp;#039;&amp;#039;: 최대 125개 채널, 채널당 6개 주소(파이프)를 지원해 하나의 수신 허브가 최대 6개 송신 노드와 통신할 수 있다.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;하드웨어 프로토콜&amp;#039;&amp;#039;&amp;#039;: Enhanced ShockBurst 엔진이 패킷 조립, 자동 응답(ACK), 재전송, CRC를 하드웨어에서 처리한다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+주요 사양&lt;br /&gt;
!항목&lt;br /&gt;
!표준 모듈&lt;br /&gt;
!PA/LNA 모듈&lt;br /&gt;
|-&lt;br /&gt;
|동작 주파수&lt;br /&gt;
|2.400 – 2.525 GHz&lt;br /&gt;
|2.400 – 2.525 GHz&lt;br /&gt;
|-&lt;br /&gt;
|공급 전압&lt;br /&gt;
|1.9 – 3.6 V&lt;br /&gt;
|1.9 – 3.6 V&lt;br /&gt;
|-&lt;br /&gt;
|로직 입력&lt;br /&gt;
|5 V 허용(tolerant)&lt;br /&gt;
|5 V 허용&lt;br /&gt;
|-&lt;br /&gt;
|출력 전력&lt;br /&gt;
|−18 dBm ~ 0 dBm&lt;br /&gt;
|−18 dBm ~ +20 dBm&lt;br /&gt;
|-&lt;br /&gt;
|송신 전류(최대)&lt;br /&gt;
|약 11.3 mA @ 0 dBm&lt;br /&gt;
|약 115 mA @ +20 dBm&lt;br /&gt;
|-&lt;br /&gt;
|대기 전류&lt;br /&gt;
|22 µA&lt;br /&gt;
|22 µA&lt;br /&gt;
|-&lt;br /&gt;
|파워다운 전류&lt;br /&gt;
|900 nA&lt;br /&gt;
|900 nA&lt;br /&gt;
|-&lt;br /&gt;
|데이터 속도&lt;br /&gt;
|250 kbps / 1 Mbps / 2 Mbps&lt;br /&gt;
|250 kbps / 1 Mbps / 2 Mbps&lt;br /&gt;
|-&lt;br /&gt;
|페이로드 크기&lt;br /&gt;
|1 – 32 바이트&lt;br /&gt;
|1 – 32 바이트&lt;br /&gt;
|-&lt;br /&gt;
|채널 수&lt;br /&gt;
|126 (1 MHz 간격)&lt;br /&gt;
|126 (1 MHz 간격)&lt;br /&gt;
|-&lt;br /&gt;
|통신 거리&lt;br /&gt;
|최대 약 100 m(개활지)&lt;br /&gt;
|최대 약 1,000 m(외장 안테나)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 모듈 종류 ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;기판 안테나형(PCB 안테나)&amp;#039;&amp;#039;&amp;#039;: 소형·컴팩트, 개활지 기준 약 100 m. 실내·벽 통과 시 거리 감소.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;PA/LNA + 외장 안테나형&amp;#039;&amp;#039;&amp;#039;: 전력 증폭기(PA)와 저잡음 증폭기(LNA)를 내장해 최대 약 1 km까지 도달. 전류 소모가 크므로 별도 3.3 V 전원 권장.&lt;br /&gt;
&lt;br /&gt;
=== 배선 (Arduino Uno / Nano 기준) ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+nRF24L01+ ↔ 아두이노 연결&lt;br /&gt;
!nRF24L01+ 핀&lt;br /&gt;
!아두이노 Uno/Nano 핀&lt;br /&gt;
!비고&lt;br /&gt;
|-&lt;br /&gt;
|VCC&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;3.3 V&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|절대 5 V 연결 금지&lt;br /&gt;
|-&lt;br /&gt;
|GND&lt;br /&gt;
|GND&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|CE&lt;br /&gt;
|D9 (변경 가능)&lt;br /&gt;
|코드와 일치시킬 것&lt;br /&gt;
|-&lt;br /&gt;
|CSN&lt;br /&gt;
|D10 (변경 가능)&lt;br /&gt;
|코드와 일치시킬 것&lt;br /&gt;
|-&lt;br /&gt;
|SCK&lt;br /&gt;
|D13(칩마다 다름)&lt;br /&gt;
|하드웨어 SPI 고정&lt;br /&gt;
|-&lt;br /&gt;
|MOSI&lt;br /&gt;
|D11(칩마다 다름)&lt;br /&gt;
|하드웨어 SPI 고정&lt;br /&gt;
|-&lt;br /&gt;
|MISO&lt;br /&gt;
|D12(칩마다 다름)&lt;br /&gt;
|하드웨어 SPI 고정&lt;br /&gt;
|-&lt;br /&gt;
|IRQ&lt;br /&gt;
|(미사용)&lt;br /&gt;
|인터럽트용, 선택 사항&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 전원 안정화 (매우 중요) ===&lt;br /&gt;
아두이노 내장 3.3 V 레귤레이터는 전류 공급 능력이 부족해 통신 불안정의 가장 흔한 원인이다.&lt;br /&gt;
&lt;br /&gt;
* VCC–GND 사이에 &amp;#039;&amp;#039;&amp;#039;10 µF ~ 100 µF 전해 커패시터&amp;#039;&amp;#039;&amp;#039;를 최대한 모듈 가까이 병렬 연결한다.&lt;br /&gt;
* PA/LNA 모듈이나 다수 노드 사용 시 별도 외장 3.3 V 레귤레이터를 권장한다.&lt;br /&gt;
* 어댑터 보드(소켓형)를 쓰면 레귤레이터와 디커플링이 내장되어 편리하다.&lt;br /&gt;
&lt;br /&gt;
== 동작 원리 ==&lt;br /&gt;
&lt;br /&gt;
=== SPI 인터페이스 ===&lt;br /&gt;
모듈은 SPI 슬레이브로 동작하며, 아두이노(마스터)의 하드웨어 SPI 핀(MOSI, MISO, SCK)에 반드시 연결해야 한다. 여기에 더해 두 개의 제어 핀을 사용한다.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CE (Chip Enable)&amp;#039;&amp;#039;&amp;#039;: 송신/수신 모드를 활성화하는 핀. 임의의 디지털 핀 사용 가능.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CSN (Chip Select Not)&amp;#039;&amp;#039;&amp;#039;: SPI 슬레이브 선택 핀. 임의의 디지털 핀 사용 가능.&lt;br /&gt;
&lt;br /&gt;
=== Enhanced ShockBurst ===&lt;br /&gt;
Enhanced ShockBurst는 하드웨어 기반 프로토콜 엔진으로 다음을 자동 처리한다.&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;자동 패킷 조립&amp;#039;&amp;#039;&amp;#039;: 프리앰블, 주소, CRC 필드를 페이로드에 자동 추가.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;자동 응답 및 재전송&amp;#039;&amp;#039;&amp;#039;: 수신 측이 ACK를 자동 전송하며, 송신 측은 ACK를 못 받으면 최대 15회까지 자동 재전송.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;동적 페이로드 길이&amp;#039;&amp;#039;&amp;#039;: 1~32바이트 가변 길이 지원.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;멀티 파이프&amp;#039;&amp;#039;&amp;#039;: 서로 다른 주소를 가진 6개 데이터 파이프를 동시에 수신 대기.&lt;br /&gt;
&lt;br /&gt;
== 라이브러리 설치 ==&lt;br /&gt;
가장 널리 쓰이는 라이브러리는 TMRh20이 유지보수하는 &amp;#039;&amp;#039;&amp;#039;RF24&amp;#039;&amp;#039;&amp;#039; 라이브러리다.&lt;br /&gt;
&lt;br /&gt;
# 아두이노 IDE를 연다.&lt;br /&gt;
# 메뉴에서 &amp;#039;&amp;#039;&amp;#039;스케치 → 라이브러리 포함하기 → 라이브러리 관리&amp;#039;&amp;#039;&amp;#039;를 선택한다.&lt;br /&gt;
# 검색창에 &amp;lt;code&amp;gt;RF24&amp;lt;/code&amp;gt;를 입력하고 TMRh20의 &amp;lt;code&amp;gt;RF24 by TMRh20&amp;lt;/code&amp;gt;을 설치한다.&lt;br /&gt;
&lt;br /&gt;
필요한 헤더는 다음과 같다.&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;       // SPI 통신&lt;br /&gt;
#include &amp;lt;nRF24L01.h&amp;gt;  // 레지스터 정의&lt;br /&gt;
#include &amp;lt;RF24.h&amp;gt;      // RF24 드라이버 클래스&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 예제들 =&lt;br /&gt;
&lt;br /&gt;
== 예제 1: 단방향 통신 (&amp;quot;Hello World&amp;quot;) ==&lt;br /&gt;
가장 기본적인 예제로, 송신기가 문자열을 1초마다 보내고 수신기가 시리얼 모니터에 출력한다. 최신 RF24 라이브러리는 주소를 &amp;lt;code&amp;gt;uint64_t&amp;lt;/code&amp;gt; 대신 &amp;#039;&amp;#039;&amp;#039;바이트 배열&amp;#039;&amp;#039;&amp;#039;로 지정하는 방식을 권장한다.&lt;br /&gt;
&lt;br /&gt;
=== 송신기 (Transmitter) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;nRF24L01.h&amp;gt;&lt;br /&gt;
#include &amp;lt;RF24.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RF24 radio(9, 10);  // CE, CSN 핀&lt;br /&gt;
&lt;br /&gt;
const byte address[6] = &amp;quot;00001&amp;quot;;  // 5바이트 주소(파이프)&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  if (!radio.begin()) {&lt;br /&gt;
    Serial.println(F(&amp;quot;무선 모듈이 응답하지 않습니다!&amp;quot;));&lt;br /&gt;
    while (1) {}  // 무한 루프로 정지&lt;br /&gt;
  }&lt;br /&gt;
  radio.openWritingPipe(address);   // 송신 파이프 열기&lt;br /&gt;
  radio.setPALevel(RF24_PA_LOW);    // 출력 레벨(테스트 시 LOW 권장)&lt;br /&gt;
  radio.setDataRate(RF24_250KBPS);  // 데이터 속도(거리↑, 안정성↑)&lt;br /&gt;
  radio.stopListening();            // 송신 모드로 전환&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  const char text[] = &amp;quot;Hello World&amp;quot;;&lt;br /&gt;
  bool ok = radio.write(&amp;amp;text, sizeof(text));&lt;br /&gt;
  Serial.println(ok ? F(&amp;quot;전송 성공&amp;quot;) : F(&amp;quot;전송 실패&amp;quot;));&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 수신기 (Receiver) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;nRF24L01.h&amp;gt;&lt;br /&gt;
#include &amp;lt;RF24.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RF24 radio(9, 10);  // CE, CSN 핀&lt;br /&gt;
&lt;br /&gt;
const byte address[6] = &amp;quot;00001&amp;quot;;  // 송신기와 동일해야 함&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  if (!radio.begin()) {&lt;br /&gt;
    Serial.println(F(&amp;quot;무선 모듈이 응답하지 않습니다!&amp;quot;));&lt;br /&gt;
    while (1) {}&lt;br /&gt;
  }&lt;br /&gt;
  radio.openReadingPipe(0, address);  // 수신 파이프 0번 열기&lt;br /&gt;
  radio.setPALevel(RF24_PA_LOW);&lt;br /&gt;
  radio.setDataRate(RF24_250KBPS);&lt;br /&gt;
  radio.startListening();             // 수신 모드로 전환&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (radio.available()) {&lt;br /&gt;
    char text[32] = &amp;quot;&amp;quot;;&lt;br /&gt;
    radio.read(&amp;amp;text, sizeof(text));&lt;br /&gt;
    Serial.print(F(&amp;quot;수신: &amp;quot;));&lt;br /&gt;
    Serial.println(text);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 예제 2: 구조체로 여러 값 한 번에 전송 ==&lt;br /&gt;
온도·습도·기압처럼 여러 값을 한 패킷(≤ 32바이트)에 담아 보낼 때 &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt;를 사용한다.&lt;br /&gt;
&lt;br /&gt;
=== 공통 구조체 정의 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct SensorData {&lt;br /&gt;
  byte  id;           // 1바이트&lt;br /&gt;
  float temperature;  // 4바이트&lt;br /&gt;
  float humidity;     // 4바이트&lt;br /&gt;
  int   pressure;     // 2바이트&lt;br /&gt;
};  // 총 11바이트 (32바이트 이하)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 송신기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;nRF24L01.h&amp;gt;&lt;br /&gt;
#include &amp;lt;RF24.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RF24 radio(9, 10);&lt;br /&gt;
const byte address[6] = &amp;quot;00001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
struct SensorData {&lt;br /&gt;
  byte  id;&lt;br /&gt;
  float temperature;&lt;br /&gt;
  float humidity;&lt;br /&gt;
  int   pressure;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
SensorData data;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  radio.begin();&lt;br /&gt;
  radio.openWritingPipe(address);&lt;br /&gt;
  radio.setPALevel(RF24_PA_LOW);&lt;br /&gt;
  radio.stopListening();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  data.id = 1;&lt;br /&gt;
  data.temperature = 24.5;&lt;br /&gt;
  data.humidity    = 55.2;&lt;br /&gt;
  data.pressure    = 1013;&lt;br /&gt;
  radio.write(&amp;amp;data, sizeof(data));&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 수신기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;nRF24L01.h&amp;gt;&lt;br /&gt;
#include &amp;lt;RF24.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RF24 radio(9, 10);&lt;br /&gt;
const byte address[6] = &amp;quot;00001&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
struct SensorData {&lt;br /&gt;
  byte  id;&lt;br /&gt;
  float temperature;&lt;br /&gt;
  float humidity;&lt;br /&gt;
  int   pressure;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
SensorData data;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  radio.begin();&lt;br /&gt;
  radio.openReadingPipe(0, address);&lt;br /&gt;
  radio.setPALevel(RF24_PA_LOW);&lt;br /&gt;
  radio.startListening();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (radio.available()) {&lt;br /&gt;
    radio.read(&amp;amp;data, sizeof(data));&lt;br /&gt;
    Serial.print(F(&amp;quot;ID: &amp;quot;));    Serial.print(data.id);&lt;br /&gt;
    Serial.print(F(&amp;quot;  온도: &amp;quot;)); Serial.print(data.temperature);&lt;br /&gt;
    Serial.print(F(&amp;quot;  습도: &amp;quot;)); Serial.print(data.humidity);&lt;br /&gt;
    Serial.print(F(&amp;quot;  기압: &amp;quot;)); Serial.println(data.pressure);&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 예제 3: 양방향 통신 (송수신 전환) ==&lt;br /&gt;
한 노드가 송신과 수신을 번갈아 수행한다. 두 노드는 서로 다른 주소를 쓴다.&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;nRF24L01.h&amp;gt;&lt;br /&gt;
#include &amp;lt;RF24.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RF24 radio(9, 10);&lt;br /&gt;
&lt;br /&gt;
// 두 개의 주소: 송신자와 수신자는 아래 노드 순서를 반대로 하면 된다.&lt;br /&gt;
const byte addresses[][6] = {&amp;quot;NODE1&amp;quot;, &amp;quot;NODE2&amp;quot;};  // 문자열이 아니라 바이트 배열로 채널을 잡는다. 5개 문자열만 가능.&lt;br /&gt;
// 배열 크기는 6개로 하고, 마지막에는 \0을 넣어 종료를 알린다.&lt;br /&gt;
&lt;br /&gt;
bool isNode1 = true;  // 상대 노드에서는 false로 설정&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  radio.begin();&lt;br /&gt;
  if (isNode1) {&lt;br /&gt;
    radio.openWritingPipe(addresses[1]);     // NODE2로 송신&lt;br /&gt;
    radio.openReadingPipe(1, addresses[0]);  // NODE1로 수신&lt;br /&gt;
  } else {&lt;br /&gt;
    radio.openWritingPipe(addresses[0]);&lt;br /&gt;
    radio.openReadingPipe(1, addresses[1]);&lt;br /&gt;
  }&lt;br /&gt;
  radio.setPALevel(RF24_PA_LOW);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // --- 송신 단계 ---&lt;br /&gt;
  radio.stopListening();&lt;br /&gt;
  const char msg[] = &amp;quot;PING&amp;quot;;&lt;br /&gt;
  radio.write(&amp;amp;msg, sizeof(msg));&lt;br /&gt;
&lt;br /&gt;
  // --- 수신 단계 ---&lt;br /&gt;
  radio.startListening();&lt;br /&gt;
  unsigned long started = millis();&lt;br /&gt;
  while (!radio.available()) {&lt;br /&gt;
    if (millis() - started &amp;gt; 200) return;  // 200ms 타임아웃&lt;br /&gt;
  }&lt;br /&gt;
  char reply[32] = &amp;quot;&amp;quot;;&lt;br /&gt;
  radio.read(&amp;amp;reply, sizeof(reply));&lt;br /&gt;
  Serial.print(F(&amp;quot;응답 수신: &amp;quot;));&lt;br /&gt;
  Serial.println(reply);&lt;br /&gt;
&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 주요 함수 정리 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+RF24 라이브러리 핵심 메서드&lt;br /&gt;
!함수&lt;br /&gt;
!설명&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;radio.begin()&amp;lt;/code&amp;gt;&lt;br /&gt;
|모듈 초기화. 성공 시 &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; 반환&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;radio.openWritingPipe(addr)&amp;lt;/code&amp;gt;&lt;br /&gt;
|송신 파이프 주소 설정&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;radio.openReadingPipe(n, addr)&amp;lt;/code&amp;gt;&lt;br /&gt;
|n번(0~5) 수신 파이프 주소 설정&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;radio.startListening()&amp;lt;/code&amp;gt;&lt;br /&gt;
|수신 모드 진입&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;radio.stopListening()&amp;lt;/code&amp;gt;&lt;br /&gt;
|송신 모드 진입&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;radio.write(&amp;amp;buf, len)&amp;lt;/code&amp;gt;&lt;br /&gt;
|데이터 송신(ACK 수신 시 true)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;radio.available()&amp;lt;/code&amp;gt;&lt;br /&gt;
|수신 데이터 존재 여부&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;radio.read(&amp;amp;buf, len)&amp;lt;/code&amp;gt;&lt;br /&gt;
|수신 데이터 읽기&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;radio.setPALevel(level)&amp;lt;/code&amp;gt;&lt;br /&gt;
|출력 레벨: &amp;lt;code&amp;gt;RF24_PA_MIN / LOW / HIGH / MAX&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;radio.setDataRate(rate)&amp;lt;/code&amp;gt;&lt;br /&gt;
|속도: &amp;lt;code&amp;gt;RF24_250KBPS / RF24_1MBPS / RF24_2MBPS&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;radio.setChannel(ch)&amp;lt;/code&amp;gt;&lt;br /&gt;
|채널(0~125) 설정&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;radio.setRetries(delay, count)&amp;lt;/code&amp;gt;&lt;br /&gt;
|재전송 간격·횟수 설정&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;radio.printDetails()&amp;lt;/code&amp;gt;&lt;br /&gt;
|디버깅 정보 시리얼 출력&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 문제 해결 (Troubleshooting) ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;전송이 계속 실패하거나 데이터가 안 옴&amp;#039;&amp;#039;&amp;#039; → 전원 문제일 가능성이 가장 큼. VCC–GND에 10~100 µF 커패시터 추가, 외장 3.3 V 전원 사용.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;송·수신이 안 됨&amp;#039;&amp;#039;&amp;#039; → 양쪽의 주소·데이터 속도·채널이 일치하는지 확인.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;radio.begin()&amp;lt;/code&amp;gt;이 false&amp;#039;&amp;#039;&amp;#039; → SPI 배선(MOSI/MISO/SCK) 및 CE/CSN 핀 번호 확인. &amp;lt;code&amp;gt;printDetails()&amp;lt;/code&amp;gt;로 레지스터 값이 0x00/0xFF만 나오면 배선 불량.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;거리가 짧음&amp;#039;&amp;#039;&amp;#039; → 데이터 속도를 250 kbps로 낮추고, PA 레벨을 높이거나 PA/LNA 외장 안테나 모듈 사용.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;간헐적 끊김&amp;#039;&amp;#039;&amp;#039; → Wi-Fi(1~11 채널) 간섭 회피를 위해 상위 채널(예: 100번 이상) 사용.&lt;br /&gt;
&lt;br /&gt;
== 안전 및 규제 ==&lt;br /&gt;
&lt;br /&gt;
* 2.4GHz ISM 대역은 비면허 대역이나, 출력 및 사용 규정은 국가별로 다를 수 있으므로 고출력 PA/LNA 모듈 사용 시 국내 전파 규정을 확인한다.&lt;br /&gt;
* 다수 모듈을 밀집 배치할 경우 상호 간섭을 줄이기 위해 채널을 분리한다.&lt;br /&gt;
&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
== 각주 ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 외부 링크 ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/nRF24/RF24 RF24 라이브러리 공식 GitHub 저장소]&lt;br /&gt;
* [https://nrf24.github.io/RF24/classRF24.html RF24 클래스 레퍼런스 문서]&lt;/div&gt;</summary>
		<author><name>Sam</name></author>
	</entry>
</feed>