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

nRF24L01 – 작동 원리, Arduino 인터페이스, 회로, 코드

<메인 클래스="사이트 메인" id="메인">

이 튜토리얼에서는 무선 통신을 만드는 방법을 배웁니다. nRF24L01을 사용하여 두 개의 Arduino 보드 간에 트랜시버 모듈. nRF24L01 모듈은 Arduino를 사용할 때 무선 통신에 매우 인기 있는 선택입니다.

이미 수많은 Arduino 프로젝트에 이 모듈을 사용했으며 여기에서 그 중 일부를 확인할 수 있습니다.

다음 비디오를 보거나 아래에 작성된 튜토리얼을 읽을 수 있습니다. 여기에는 모듈 핀 배치, 작동 원리, 배선 및 여러 코드 예제와 같이 nRF24L01 트랜시버 모듈에 대해 알아야 할 모든 것이 포함되어 있습니다.

개요

무선 통신을 설명하기 위해 우리는 두 가지 예를 만들 것입니다. 첫 번째는 한 Arduino에서 다른 Arduino로 간단한 "Hello World" 메시지를 보내는 것이고 두 번째 예에서는 Arduino 보드 간에 양방향 통신을 할 것입니다. 첫 번째 Arduino의 조이스틱을 사용하여 두 번째 Arduino의 서보 모터를 제어하고, 그 반대로 두 번째 Arduino의 푸시 버튼을 사용하여 첫 번째 Arduino의 LED를 제어합니다.

nRF24L01 트랜시버 모듈

NRF24L01 트랜시버 모듈을 자세히 살펴보겠습니다. 2.4GHz 대역을 사용하며 250kbps에서 최대 2Mbps의 전송 속도로 작동할 수 있습니다. 열린 공간에서 더 낮은 전송 속도에서 사용하는 경우 범위는 최대 100미터에 도달할 수 있습니다.

전체 사양은 다음과 같습니다.

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

작동 방식

이 모듈은 125개의 다른 채널을 사용할 수 있어 한 곳에서 독립적으로 작동하는 125개의 모뎀 네트워크를 가질 수 있습니다. 각 채널은 최대 6개의 주소를 가질 수 있으며 각 장치는 동시에 최대 6개의 다른 장치와 통신할 수 있습니다.

<그림 클래스="aligncenter">

이 모듈의 전력 소비는 전송 중 약 12mA로 단일 LED보다 훨씬 낮습니다. 모듈의 동작 전압은 1.9V ~ 3.6V이지만 다른 핀은 5V 로직을 견디기 때문에 로직 레벨 컨버터를 사용하지 않고도 아두이노에 쉽게 연결할 수 있다는 것이 장점입니다.

<그림 클래스="aligncenter">

이 핀 중 3개는 SPI 통신용이며 Arduino의 SPI 핀에 연결해야 하지만 각 Arduino 보드에는 서로 다른 SPI 핀이 있습니다. CSN 및 CE 핀은 Arduino 보드의 모든 디지털 핀에 연결할 수 있으며 모듈을 대기 또는 활성 모드로 설정하고 전송 또는 명령 모드 간에 전환하는 데 사용됩니다. 마지막 핀은 사용할 필요가 없는 인터럽트 핀입니다.

모듈 변형

NRF24L01 모듈에는 여러 변형이 있습니다. 가장 인기 있는 것은 온보드 안테나가 있는 것입니다. 이것은 모듈을 더 컴팩트하게 만들지만 다른 한편으로 전송 범위를 약 100미터의 거리로 낮춥니다.

두 번째 변형은 온보드 안테나 대신 SMA 커넥터가 있으며 더 나은 전송 범위를 위해 덕 안테나를 연결할 수 있습니다.

여기에 표시된 세 번째 변형에는 오리 안테나 외에도 PA가 포함된 RFX2401C 칩이 있습니다. (전력 증폭기) 및 LNA (저잡음 증폭기). 이것은 NRF24L01 신호를 증폭하고 열린 공간에서 최대 1000미터의 더 나은 전송 범위를 가능하게 합니다.

nRF24L01 모듈 핀아웃

다음은 NRF24L01 핀아웃과 NRF24L01+ PA/LNA 모듈에 대한 자세한 내용입니다.

두 모듈, NRF24L01 및 NRF24L01+ PA/LNA는 핀아웃이 동일하므로 회로에서 동일한 방식으로 연결할 수 있습니다.

nRF24L01을 Arduino에 연결하는 방법

NRF24L01 모듈을 Arduino 보드에 연결하는 방법은 다음과 같습니다.

이미 언급했듯이 각 Arduino 보드에는 서로 다른 SPI 핀이 있으므로 Arduino 보드에 모듈을 연결할 때 염두에 두십시오.

Arduino SCK MISO MOSI SS
아니요 13 12 11 10
나노 13 12 11 10
메가 52 50 51 53

아래 링크에서 이 Arduino 튜토리얼에 필요한 구성요소를 얻을 수 있습니다.

  • NRF24L01 트랜시버 모듈………
  • 아두이노 보드 .....................................................
  • 브레드보드 및 점프 와이어 ..................... 

Arduino 및 nRF24L01 코드

NRF24L01 모듈을 Arduino 보드에 연결하면 송신기와 수신기 모두에 대한 코드를 만들 준비가 된 것입니다.

먼저 프로그래밍을 덜 어렵게 만드는 RF24 라이브러리를 다운로드하여 설치해야 합니다. Arduino 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);
}Code language: Arduino (arduino)

수신자 코드

/*
* 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);
  }
}Code language: Arduino (arduino)

코드 설명

따라서 기본 SPI와 새로 설치된 RF24 라이브러리를 포함하고 RF24 객체를 생성해야 합니다. 여기서 두 가지 인수는 CSN 및 CE 핀입니다.

RF24 radio(7, 8); // CE, CSNCode language: Arduino (arduino)

다음으로 주소를 나타내는 바이트 배열 또는 두 모듈이 통신할 파이프를 만들어야 합니다.

const byte address[6] = "00001";Code language: Arduino (arduino)

이 주소의 값을 임의의 5자리 문자열로 변경할 수 있으며 이를 통해 대화할 수신자를 선택할 수 있으므로 이 경우 수신자와 송신기 모두에서 동일한 주소를 갖게 됩니다.

설정 섹션에서 라디오 객체를 초기화하고 radio.openWritingPipe() 함수를 사용하여 데이터를 보낼 수신기의 주소, 이전에 설정한 5자리 문자열을 설정해야 합니다.

radio.openWritingPipe(address);Code language: Arduino (arduino)

다른 한편으로는 수신기에서 radio.setReadingPipe() 함수를 사용하여 동일한 주소를 설정하고 이러한 방식으로 두 모듈 간의 통신을 활성화합니다.

radio.openReadingPipe(0, address);Code language: Arduino (arduino)

그런 다음 radio.setPALevel() 함수를 사용하여 전력 증폭기 레벨을 설정합니다. 이 경우 모듈이 서로 매우 가깝기 때문에 최소로 설정하겠습니다.

radio.setPALevel(RF24_PA_MIN);Code language: Arduino (arduino)

더 높은 레벨을 사용하는 경우 작동하는 동안 더 안정적인 전압을 가질 수 있도록 GND 및 3.3V 모듈에 바이패스 커패시터를 사용하는 것이 좋습니다.

다음으로 모듈을 송신기로 설정하는 radio.stopListening() 함수가 있고 다른 한편에는 모듈을 수신기로 설정하는 radio.startListening() 함수가 있습니다.

// at the Transmitter
radio.stopListening();Code language: Arduino (arduino)
// at the Receiver
radio.startListening();Code language: Arduino (arduino)

루프 섹션에서 송신기에서 "Hello World" 메시지를 할당할 문자 배열을 만듭니다. radio.write() 함수를 사용하여 해당 메시지를 수신자에게 보냅니다. 여기서 첫 번째 인수는 우리가 보내려는 변수입니다.

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

변수 이름 앞에 "&"를 사용하여 전송하려는 데이터를 저장하는 변수 표시를 실제로 설정하고 두 번째 인수를 사용하여 해당 변수에서 가져오려는 바이트 수를 설정합니다. 이 경우 sizeof() 함수는 "텍스트" 문자열의 모든 바이트를 가져옵니다. 프로그램이 끝나면 1초 지연이 추가됩니다.

radio.write() 함수를 사용하여 한 번에 최대 32바이트를 보낼 수 있습니다.

반면에 수신기에서는 radio.available() 함수를 사용하여 루프 섹션에서 수신할 데이터가 있는지 확인합니다. 그것이 사실이라면 먼저 "텍스트"라고 하는 32개 요소의 배열을 만들고 여기에 들어오는 데이터를 저장합니다.

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

radion.read() 함수를 사용하여 데이터를 읽고 "텍스트" 변수에 저장합니다. 결국 우리는 직렬 모니터에 텍스트를 인쇄합니다. 따라서 두 프로그램을 모두 업로드하면 수신기에서 직렬 모니터를 실행할 수 있으며 매초 "Hello World"라는 메시지가 인쇄되는 것을 확인할 수 있습니다.

문제 해결

전원 공급 장치 소음 NRF24L01 모듈과 성공적인 통신을 시도할 때 사람들이 경험하는 가장 일반적인 문제 중 하나입니다. 일반적으로 RF 회로 또는 무선 주파수 신호는 전원 공급 장치 노이즈에 민감합니다. 따라서 전원 공급 라인에 디커플링 커패시터를 포함하는 것이 항상 좋은 생각입니다. 커패시터는 10uF ~ 100uF입니다.

또 다른 일반적인 문제는 Arduino 보드의 3.3V 핀이 항상 NRF24L01 모듈에 충분한 전력을 공급할 수 없다는 것입니다. 따라서 외부 전원으로 모듈에 전원을 공급하는 것도 좋은 생각입니다.

2개의 NRF24L01 및 Arduino를 사용한 양방향 무선 통신

두 번째 예인 두 개의 Arduino 보드 간의 양방향 무선 통신을 살펴보겠습니다. 다음은 회로도입니다.

아래 링크에서 이 예시에 필요한 구성요소를 얻을 수 있습니다.

  • 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);
  }
}Code language: Arduino (arduino)

수신자 코드

/*
* 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));
  }
}Code language: Arduino (arduino)

여기서 이전 예와 다른 점은 양방향 통신을 위해 두 개의 파이프 또는 주소를 생성해야 한다는 것입니다.

const byte addresses[][6] = {"00001", "00002"};Code language: Arduino (arduino)

설정 섹션에서 두 파이프를 모두 정의해야 하며 첫 번째 Arduino의 쓰기 주소는 두 번째 Arduino의 읽기 주소여야 하고 그 반대의 경우도 첫 번째 Arduino의 읽기 주소는 쓰기 주소여야 합니다. 두 번째 아두이노.

// at the Transmitter
radio.openWritingPipe(addresses[1]); // 00001
radio.openReadingPipe(1, addresses[0]); // 00002Code language: Arduino (arduino)
// at the Receiver
radio.openWritingPipe(addresses[0]); // 00002
radio.openReadingPipe(1, addresses[1]); // 00001Code language: Arduino (arduino)

radio.stopListening() 함수를 사용하는 루프 섹션에서 첫 번째 Arduino를 송신기로 설정하고 Joystick의 값을 0에서 180까지 읽고 매핑하며 radio.write() 함수를 사용하여 데이터를 수신기로 보냅니다.

radio.stopListening();
int potValue = analogRead(A0);
int angleValue = map(potValue, 0, 1023, 0, 180);
radio.write(&angleValue, sizeof(angleValue));Code language: Arduino (arduino)

다른 한편으로는 radio.startListening() 함수를 사용하여 두 번째 Arduino를 수신기로 설정하고 사용 가능한 데이터가 있는지 확인합니다. 사용할 수 있는 데이터가 있는 동안 데이터를 읽고 "angleV" 변수에 저장한 다음 해당 값을 사용하여 서보 모터를 회전합니다.

radio.startListening();
  if ( radio.available()) {
    while (radio.available()) {
      int angleV = 0;
      radio.read(&angleV, sizeof(angleV));
      myServo.write(angleV);
    }Code language: Arduino (arduino)

다음으로, 송신기에서 첫 번째 Arduino를 수신기로 설정하고 빈 "while" 루프를 사용하여 두 번째 Arduino가 데이터를 보낼 때까지 기다립니다. 버튼을 누르면 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";

// Max size of this struct is 32 bytes - NRF24L01 buffer limit
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; // Create a variable with the above structure

void setup() {
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop() {
  // Send the whole data from the structure to the receiver
  radio.write(&data, sizeof(Data_Package));
  delay(500);
}Code language: Arduino (arduino)

따라서 실제로 다양한 유형의 변수 모음인 구조체를 만들 수 있습니다.

// Max size of this struct is 32 bytes - NRF24L01 buffer limit
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; // Create a variable with the above structureCode language: Arduino (arduino)

이 구조체 데이터의 최대 크기는 32바이트일 수 있음을 명심해야 합니다. 여기에서 3개의 변수 유형 바이트, 하나의 정수 변수(4바이트), 하나의 부동 변수(4바이트) 및 4개의 문자를 포함하는 하나의 문자열(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";

// Max size of this struct is 32 bytes - NRF24L01 buffer limit
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; //Create a variable with the above structure

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}

void loop() {
  // Check whether there is data to be received
  if (radio.available()) {
    radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure
  }
  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);
}Code language: Arduino (arduino)

수신자 측에서는 들어오는 데이터를 수신할 수 있도록 동일한 구조체 데이터를 정의해야 합니다. 무선 통신이 제대로 되는지 테스트를 위해 시리얼 모니터에 각각의 변수를 출력해 봤습니다.

결론

NRF24L01 모듈은 Arduino 프로젝트에 무선 통신이 필요할 때 적합한 옵션입니다. 저는 이미 많은 Arduino 프로젝트에서 이 모듈을 사용했습니다.

여기에 내가 이 모듈을 사용한 모든 프로젝트를 나열할 것입니다.

  • HC-05 Bluetooth, NRF24L01 및 HC-12 트랜시버 모듈을 사용하는 Arduino 로봇 자동차 무선 제어
  • Arduino 무선 기상 관측소 프로젝트
  • DIY Arduino RC 송신기
  • Arduino Ant Hexapod 로봇
  • DIY Arduino 기반 RC 호버크라프트
  • Arduino Mecanum 바퀴 로봇
  • RC 모델 및 Arduino 프로젝트용 DIY Arduino RC 수신기
  • Arduino RC 비행기 | 100% DIY

이러한 각 프로젝트/튜토리얼에는 회로도, 더 나은 통신을 위한 개선된 코드 구현 등을 포함하여 NRF24L01 모듈을 사용하는 방법에 대한 자세한 설명이 있습니다.

내가 가장 좋아하는 프로젝트는 맞춤형으로 설계된 Arduino RC 송신기입니다. 실제로는 거의 모든 Arduino 프로젝트를 제어하는 ​​데 사용할 수 있는 14채널 RC 컨트롤러입니다.

이것이 이 튜토리얼의 전부입니다. 즐겁게 사용하시고 새로운 것을 배우셨기를 바랍니다. 언제나 그렇듯이 아래의 댓글 섹션에서 언제든지 질문하세요.


제조공정

  1. OpenSensor의 공기질 측정 방법
  2. IR 리모콘 해킹 방법
  3. 키는 얼마입니까?
  4. JX 웨이브 생성기
  5. DIY 가상 현실 스케이트보드
  6. Arduino Mega를 NEO-6M GPS 모듈과 인터페이스하는 방법
  7. 서미스터를 사용하는 것이 얼마나 쉬운가요?!
  8. Arduino로 음악을 만드는 방법
  9. Arduino에서 Modbus를 사용하는 방법
  10. 여기에 아이디어가 있습니다:두뇌-컴퓨터 인터페이스의 작동 방식