산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

nRF24L01 마스터하기: 무선 통신, 아두이노 연동, 회로 및 코드 가이드

이 튜토리얼에서는 nRF24L01 트랜시버 모듈을 사용해 두 아두이노 보드 간 무선 통신 구현 방법을 배웁니다. nRF24L01 모듈은 아두이노용 무선 통신에 매우 인기 있는 선택지입니다.

이미 여러 아두이노 프로젝트에 이 모듈 사용했습니다. 일부 확인 가능:

  • DIY 아두이노 RC 송신기
  • 아두이노 RC 비행기 | 100% DIY
  • DIY 아두이노 기반 RC 호버크래프트
  • 아두이노 무선 기상 관측소 프로젝트

다음 영상 시청 또는 아래 문서 튜토리얼 읽기. 모듈 핀아웃, 작동 원리, 배선, 여러 코드 예제 등 nRF24L01 트랜시버 모듈 필수 지식 모두 포함.

개요

무선 통신 설명 위해 두 예제 만듭니다. 첫째: 한 아두이노에서 다른 아두이노로 간단 "Hello World" 메시지 전송. 둘째: 두 아두이노 간 양방향 통신. 첫 번째 아두이노 조이스틱으로 두 번째 아두이노 서보 모터 제어, 반대로 두 번째 아두이노 푸시버튼으로 첫 번째 아두이노 LED 제어.

nRF24L01 마스터하기: 무선 통신, 아두이노 연동, 회로 및 코드 가이드

nRF24L01 트랜시버 모듈

nRF24L01 트랜시버 모듈 자세히 보기. 2.4GHz 대역 사용, 250kbps~2Mbps 보레이트 작동. 개방 공간에서 낮은 보레이트 사용 시 통신 거리 최대 100m.

nRF24L01 마스터하기: 무선 통신, 아두이노 연동, 회로 및 코드 가이드

전체 사양:

주파수 범위 2.4~2.5GHz ISM 대역
데이터 속도 250Kbps / 1Mbps / 2Mbps
최대 출력 0dBm
동작 전압 1.9~3.6V
최대 동작 전류 12.3mA
대기 전류 22µA
로직 입력 5V 허용
통신 거리 100m (개방 공간)

작동 원리

모듈은 125개 채널 사용 가능해 한 장소에 125개 독립 모뎀 네트워크 구성 가능. 각 채널당 최대 6개 주소, 각 유닛이 동시에 최대 6개 다른 유닛과 통신 가능.

nRF24L01 마스터하기: 무선 통신, 아두이노 연동, 회로 및 코드 가이드

모듈 전력 소비는 전송 시 약 12mA로 단일 LED보다 낮음. 동작 전압 1.9~3.6V지만 다른 핀은 5V 로직 허용해 로직 레벨 컨버터 없이 아두이노 직접 연결 가능.

nRF24L01 마스터하기: 무선 통신, 아두이노 연동, 회로 및 코드 가이드

세 핀은 SPI 통신용으로 아두이노 SPI 핀 연결 필요. 단 아두이노 보드별 SPI 핀 다름 주의. CSN, CE 핀은 아두이노 아무 디지털 핀이나 연결 가능, 대기/액티브 모드 설정, 송신/명령 모드 전환용. 마지막 핀은 인터럽트 핀으로 필수 아님.

모듈 변형

NRF24L01 모듈 여러 변형 존재. 가장 인기 많은 건 온보드 안테나 내장형. 컴팩트하지만 통신 거리 약 100m로 감소.

nRF24L01 마스터하기: 무선 통신, 아두이노 연동, 회로 및 코드 가이드

두 번째 변형: 온보드 안테나 대신 SMA 커넥터로 덕 안테나 장착 가능해 더 나은 통신 거리.

세 번째 변형: 덕 안테나 외 RFX2401C 칩 내장. PA(파워 앰프)와 LNA(저잡음 앰프) 포함. NRF24L01 신호 증폭으로 개방 공간 최대 1000m 통신 거리 달성.

nRF24L01 모듈 핀아웃

NRF24L01 핀아웃과 NRF24L01+ PA/LNA 모듈 상세 보기.

nRF24L01 마스터하기: 무선 통신, 아두이노 연동, 회로 및 코드 가이드

두 모듈(NRF24L01, NRF24L01+ PA/LNA) 핀아웃 동일해 같은 방식으로 회로 연결 가능.

nRF24L01 아두이노 연결 방법

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" 버전 찾아 설치.

무선 통신용 두 코드와 설명 아래.

송신기 코드

/* * 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"; void setup() { radio.begin(); radio.openWritingPipe(address); radio.setPALevel(RF24_PA_MIN); radio.stopListening(); } void loop() { const char text[] = "Hello World"; radio.write(&text, sizeof(text)); delay(1000); }

수신기 코드

/* * 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"; void setup() { Serial.begin(9600); radio.begin(); radio.openReadingPipe(0, address); radio.setPALevel(RF24_PA_MIN); radio.startListening(); } void loop() { if (radio.available()) { char text[32] = ""; radio.read(&text, sizeof(text)); Serial.println(text); } }

코드 설명

기본 SPI와 새로 설치한 RF24 라이브러리 포함, RF24 객체 생성. 두 인자는 CSN, CE 핀.

RF24 radio(7, 8); // CE, CSN

두 모듈 통신할 주소(파이프) 나타낼 바이트 배열 생성.

const byte address[6] = "00001";

이 주소 값을 아무 5글자 문자열로 변경 가능해 어느 수신기와 통신할지 선택. 여기선 송신기·수신기 동일 주소 사용.

setup에서 radio 객체 초기화, radio.openWritingPipe()로 데이터 보낼 수신기 주소(앞서 설정한 5글자 문자열) 설정.

radio.openWritingPipe(address);

수신 측에서 radio.openReadingPipe()로 동일 주소 설정해 두 모듈 간 통신 활성화.

radio.openReadingPipe(0, address);

radio.setPALevel()로 파워 앰프 레벨 설정. 여기선 모듈 간 거리 가까워 최소로 설정.

radio.setPALevel(RF24_PA_MIN);

높은 레벨 사용 시 모듈 GND와 3.3V 사이 바이패스 커패시터 권장(동작 전압 안정화).

radio.stopListening()로 모듈 송신기 모드, 수신 측 radio.startListening()로 수신기 모드 설정.

// 송신기 측 radio.stopListening();
// 수신기 측 radio.startListening();

loop에서 송신기 측 문자 배열 생성해 "Hello World" 할당. radio.write()로 수신기 전송. 첫 인자: 보낼 변수.

void loop() { const char text[] = "Hello World"; radio.write(&text, sizeof(text)); delay(1000); }

변수명 앞 "&"로 데이터 저장 변수 가리키게 하고, 두 번째 인자로 가져올 바이트 수 지정. sizeof()로 문자열 "text" 전체 바이트 사용. 프로그램 끝 1초 지연.

radio.write()로 한 번에 최대 32바이트 전송 가능.

수신 측 loop에서 radio.available()로 수신 데이터 있는지 확인. 참이면 32요소 배열 "text" 생성해 수신 데이터 저장.

void loop() { if (radio.available()) { char text[32] = ""; radio.read(&text, sizeof(text)); Serial.println(text); } }

radio.read()로 데이터 읽어 "text" 변수 저장. 끝으로 시리얼 모니터 출력. 두 프로그램 업로드 후 수신기 시리얼 모니터 실행하면 1초마다 "Hello World" 출력 확인.

문제 해결

전원 공급 노이즈가 NRF24L01 모듈 통신 성공 시 가장 흔한 문제. 일반적으로 RF 회로나 무선 주파수 신호는 전원 공급 노이즈에 민감. 따라서 전원 라인에 디커플링 커패시터 포함 항상 좋은 생각. 커패시터 10uF~100uF 아무거나 가능.

nRF24L01 마스터하기: 무선 통신, 아두이노 연동, 회로 및 코드 가이드

또 다른 흔한 문제: 아두이노 3.3V 핀이 NRF24L01 모듈에 충분한 전력 공급 못 할 수 있음. 외부 전원으로 모듈 전원 공급도 좋은 방법.

두 NRF24L01과 아두이노로 양방향 무선 통신

두 번째 예제: 두 아두이노 보드 간 양방향 무선 통신. 회로도:

nRF24L01 마스터하기: 무선 통신, 아두이노 연동, 회로 및 코드 가이드

이 예제 필요 부품:

  • NRF24L01 트랜시버 모듈…………
  • 아두이노 보드………………………………….
  • 조이스틱 모듈 ……………………………….
  • 서보 모터 …………………………………….
  • 푸시버튼 ……………………………………..
  • LED …………………………………………………

nRF24L01 소스 코드

두 코드와 설명 아래.

송신기 코드

/* * Arduino Wireless Communication Tutorial * Example 2 - 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> #define led 12 RF24 radio(7, 8); // CE, CSN const byte addresses[][6] = {"00001", "00002"}; boolean buttonState = 0; void setup() { pinMode(12, OUTPUT); radio.begin(); radio.openWritingPipe(addresses[1]); // 00002 radio.openReadingPipe(1, addresses[0]); // 00001 radio.setPALevel(RF24_PA_MIN); } void loop() { delay(5); radio.stopListening(); int potValue = analogRead(A0); int angleValue = map(potValue, 0, 1023, 0, 180); radio.write(&angleValue, sizeof(angleValue)); delay(5); radio.startListening(); while (!radio.available()); radio.read(&buttonState, sizeof(buttonState)); if (buttonState == HIGH) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } }

수신기 코드

/* * Arduino Wireless Communication Tutorial * Example 2 - 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> #include <Servo.h> #define button 4 RF24 radio(7, 8); // CE, CSN const byte addresses[][6] = {"00001", "00002"}; Servo myServo; boolean buttonState = 0; void setup() { pinMode(button, INPUT); myServo.attach(5); radio.begin(); radio.openWritingPipe(addresses[0]); // 00001 radio.openReadingPipe(1, addresses[1]); // 00002 radio.setPALevel(RF24_PA_MIN); } void loop() { delay(5); radio.startListening(); if ( radio.available()) { while (radio.available()) { int angleV = 0; radio.read(&angleV, sizeof(angleV)); myServo.write(angleV); } delay(5); radio.stopListening(); buttonState = digitalRead(button); radio.write(&buttonState, sizeof(buttonState)); } }

이전 예제와 다른 점: 양방향 통신 위해 두 파이프(주소) 생성 필요.

const byte addresses[][6] = {"00001", "00002"};

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 마스터하기: 무선 통신, 아두이노 연동, 회로 및 코드 가이드

결론

NRF24L01 모듈은 아두이노 프로젝트 무선 통신 필요 시 훌륭한 옵션. 이미 여러 아두이노 프로젝트에 사용.

이 모듈 사용한 내 프로젝트 모두 나열:

  • 아두이노 로봇카 무선 제어: HC-05 블루투스, NRF24L01, HC-12 트랜시버 모듈 사용
  • 아두이노 무선 기상 관측소 프로젝트
  • DIY 아두이노 RC 송신기
  • 아두이노 개미 헥사포드 로봇
  • DIY 아두이노 기반 RC 호버크래프트
  • 아두이노 메카넘 휠 로봇
  • DIY 아두이노 RC 수신기 (RC 모델·아두이노 프로젝트용)
  • 아두이노 RC 비행기 | 100% DIY

각 프로젝트/튜토리얼에 NRF24L01 모듈 사용법 상세 설명, 회로도, 통신 개선 코드 구현 등 포함.

내 최애 프로젝트는 커스텀 설계 아두이노 RC 송신기. 실제 14채널 RC 컨트롤러로 거의 모든 아두이노 프로젝트 제어 가능.

nRF24L01 마스터하기: 무선 통신, 아두이노 연동, 회로 및 코드 가이드

이 튜토리얼 여기까지. 즐겁게 보셨고 새 지식 얻으셨길. 언제나처럼 댓글 섹션 질문 자유롭게 남겨주세요.

제조공정

  1. 아두이노와 파이썬으로 OpenSensors를 활용한 공기질 측정 가이드
  2. 아두이노로 범용 IR 리모컨 만들기: 단계별 가이드
  3. 디지털 신장계 제작: 아두이노 & 레이저 센서로 키 측정하기
  4. JX 웨이브 제너레이터 – OLED 디스플레이를 탑재한 아두이노 호환 DDS 오실레이터
  5. 아두이노, 구글 카드보드, 블루투스로 DIY VR 스케이트보드 만들기
  6. 아두이노 메가와 NEO-6M GPS 모듈 연결하기: 단계별 가이드
  7. 서미스터(NTC) 온도 센서 아두이노 활용 완전 정복 - 수식부터 구현까지
  8. 아두이노로 음악 톤 만들기: 88키 피아노 음계 구현 가이드
  9. 아두이노로 Modbus 마스터하기: 단계별 완벽 가이드
  10. 뇌-컴퓨터 인터페이스: 사고와 행동을 다시 잇다