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

여러 NRF24L01 모듈이 있는 Arduino 무선 네트워크

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

이 튜토리얼에서는 여러 NR24L01 트랜시버 모듈로 구성된 Arduino 무선 네트워크를 구축하는 방법을 배웁니다. 다음 비디오를 보거나 아래에 작성된 튜토리얼을 읽을 수 있습니다.

개요

예를 들어 5개의 노드로 구성된 네트워크를 만들었고 각 노드는 네트워크의 모든 노드와 통신할 수 있으며 동시에 송신기와 수신기로 작동할 수 있습니다. 이 예제는 실제로 훨씬 더 큰 네트워크를 만드는 방법을 설명하는 방식으로 설정되었습니다. 정확히 말하면 단일 RF 채널에서 서로 통신하는 총 3125개의 모듈을 가질 수 있습니다. 작동 방식을 살펴보겠습니다.

이전 튜토리얼에서 우리는 NRF24L01 모듈과 RF24 라이브러리를 사용하여 두 개의 Arduino 보드 간에 무선 통신을 만드는 방법을 이미 배웠습니다. 이제 이 라이브러리에 추가하여 RF24Network 라이브러리를 사용하여 서로 통신하는 많은 보드가 있는 Arduino 무선 네트워크를 쉽게 구축할 수 있습니다. 네트워크 토폴로지가 작동하는 방식은 다음과 같습니다.

여러 NRF24L01 모듈 통신

단일 NRF24L01 모듈은 동시에 최대 6개의 다른 모듈을 능동적으로 수신할 수 있습니다.

이 기능은 RF24Network 라이브러리에서 한 노드가 기본이고 다른 모든 노드가 해당 노드 또는 다른 노드의 자식인 트리 토폴로지로 배열된 네트워크를 생성하는 데 사용됩니다. 각 노드는 최대 5개의 자식을 가질 수 있으며 이는 5단계까지 갈 수 있으므로 총 3125개의 노드로 구성된 네트워크를 만들 수 있습니다. 각 노드는 트리 내에서 노드의 위치를 ​​정확하게 설명하는 15비트 주소로 정의되어야 합니다.

실제로 노드의 주소를 8진수 형식으로 정의할 수 있습니다. 따라서 마스터 또는 기본 주소는 00, 기본 자식 주소는 01~05, 01 노드 자식 주소는 011~051 등입니다.

노드 011이 노드 02와 통신하려면 통신이 노드 01과 기본 노드 00을 거쳐야 하므로 통신이 성공하려면 이 두 노드가 항상 활성 상태여야 합니다.

RF24Network Library를 사용한 Arduino 무선 서보 모터 제어

이 튜토리얼의 주요 예제를 설명하기 전에 라이브러리가 어떻게 작동하는지 더 잘 이해하기 위해 서로 통신하는 두 개의 Arduino 보드의 간단한 예제를 만들어 보겠습니다. 다음은 이 예의 회로도입니다.

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

따라서 첫 번째 Arduino에서 전위차계를 사용하여 두 번째 Arduino에서 서보 모터를 제어합니다. 이제 소스 코드를 살펴보겠습니다.

전위차계 쪽의 코드는 다음과 같습니다.

/*
  Arduino Wireless Network - Multiple NRF24L01 Tutorial
 == Example 01 - Servo Control / Node 00 - Potentiometer ==
  by Dejan, www.HowToMechatronics.com
  Libraries:
  nRF24/RF24, https://github.com/nRF24/RF24
  nRF24/RF24Network, https://github.com/nRF24/RF24Network
*/
#include <RF24.h>
#include <RF24Network.h>
#include <SPI.h>

RF24 radio(10, 9);               // nRF24L01 (CE,CSN)
RF24Network network(radio);      // Include the radio in the network
const uint16_t this_node = 00;   // Address of this node in Octal format ( 04,031, etc)
const uint16_t node01 = 01;      

void setup() {
  SPI.begin();
  radio.begin();
  network.begin(90, this_node);  //(channel, node address)
}

void loop() {
  network.update();
  unsigned long potValue = analogRead(A0);  // Read the potentiometer value
  unsigned long angleValue = map(potValue, 0, 1023, 0, 180); // Convert the value to 0-180
  RF24NetworkHeader header(node01);     // (Address where the data is going)
  bool ok = network.write(header, &angleValue, sizeof(angleValue)); // Send the data
}Code language: Arduino (arduino)

먼저 RF24 및 RF24Network 라이브러리와 SPI 라이브러리를 모두 포함해야 합니다. 그런 다음 RF24 개체를 만들고 RF24Network 개체에 포함해야 합니다. 여기에서 노드의 주소를 8진수 형식으로 정의해야 합니다. 이 노드의 경우 00, 서보 측의 다른 노드의 경우 01입니다.

설정 섹션에서 이 노드의 채널과 주소를 설정하여 네트워크를 초기화해야 합니다.

루프 섹션에서 네트워크의 모든 작업이 발생하는 update() 함수를 지속적으로 호출해야 합니다. 그런 다음 전위차계의 값을 읽고 서보 제어에 적합한 0에서 180 사이의 값으로 변환합니다. 그런 다음 데이터가 가는 노드의 주소를 할당하는 네트워크 헤더를 만듭니다. 마지막으로 write() 함수를 사용하여 데이터를 다른 노드로 보냅니다. 따라서 여기에서 첫 번째 매개변수는 주소 정보를 포함하고 두 번째 매개변수는 데이터가 전송될 지점을 가리키며 세 번째 매개변수는 데이터의 크기입니다.

서보 쪽의 코드는 다음과 같습니다.

/*
  Arduino Wireless Network - Multiple NRF24L01 Tutorial
  == Example 01 - Servo Control / Node 01 - Servo motor ==
*/
#include <RF24.h>
#include <RF24Network.h>
#include <SPI.h>
#include <Servo.h>

RF24 radio(10, 9);               // nRF24L01 (CE,CSN)
RF24Network network(radio);      // Include the radio in the network
const uint16_t this_node = 01;   // Address of our node in Octal format ( 04,031, etc)

Servo myservo;  // create servo object to control a servo

void setup() {
  SPI.begin();
  radio.begin();
  network.begin(90, this_node); //(channel, node address)
  myservo.attach(3);   // (servo pin)
}

void loop() {
  network.update();
  while ( network.available() ) {     // Is there any incoming data?
    RF24NetworkHeader header;
    unsigned long incomingData;
    network.read(header, &incomingData, sizeof(incomingData)); // Read the incoming data
    myservo.write(incomingData);  // tell servo to go to a particular angle
  }
}Code language: Arduino (arduino)

반면에 서보 모터에서는 앞에서 설명한 것과 같은 방식으로 라이브러리와 객체를 정의해야 합니다. 여기서 8진수 형식의 이 노드 주소는 01입니다. 서보 모터를 정의한 후 루프 섹션에서 while() 루프와 available() 함수를 사용하여 들어오는 데이터가 있는지 지속적으로 확인합니다. true인 경우 데이터를 수락할 네트워크 헤더와 데이터가 저장될 변수를 생성합니다. 그런 다음 read() 함수를 사용하여 데이터를 읽고 수신 데이터 변수에 저장합니다. 결국 우리는 이 데이터를 사용하여 다른 노드의 전위차계에 따라 서보 모터를 이동합니다.

여러 NRF24L01 모듈이 있는 Arduino 무선 네트워크

이 예제를 이해한 후 이 튜토리얼의 주요 예제로 이동하여 서로 통신하는 5개의 Arduinos의 무선 네트워크를 구축할 수 있습니다. 다음은 예제의 블록 다이어그램입니다.

따라서 기본에서 전위차계를 사용하여 노드 01의 서보 모터를 제어하고 두 번째 전위차계를 사용하여 노드 022의 LED를 제어하고 버튼을 사용하여 노드 012의 LED를 제어하고 여기의 LED 베이스는 노드 02의 전위차계를 사용하여 제어됩니다. 또한 노드 012의 적외선 센서를 사용하여 노드 01의 LED를 제어합니다. 따라서 이 예에서 데이터를 동시에 전송하고 수신하는 방법을 설명하고 있음을 알 수 있습니다. 다른 지점의 노드와 통신하는 방법도 있습니다. 이제 아두이노 코드를 살펴보자.

관련: DIY Arduino RC 송신기

베이스 00 소스 코드

/*
  Arduino Wireless Network - Multiple NRF24L01 Tutorial
          == Base/ Master Node 00==
  by Dejan, www.HowToMechatronics.com
  Libraries:
  nRF24/RF24, https://github.com/nRF24/RF24
  nRF24/RF24Network, https://github.com/nRF24/RF24Network
*/

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

#define button 2
#define led 3

RF24 radio(10, 9);               // nRF24L01 (CE,CSN)
RF24Network network(radio);      // Include the radio in the network
const uint16_t this_node = 00;   // Address of this node in Octal format ( 04,031, etc)
const uint16_t node01 = 01;      // Address of the other node in Octal format
const uint16_t node012 = 012;
const uint16_t node022 = 022;

void setup() {
  SPI.begin();
  radio.begin();
  network.begin(90, this_node);  //(channel, node address)
  radio.setDataRate(RF24_2MBPS);
  pinMode(button, INPUT_PULLUP);
  pinMode(led, OUTPUT);
}

void loop() {
  network.update();
  //===== Receiving =====//
  while ( network.available() ) {     // Is there any incoming data?
    RF24NetworkHeader header;
    unsigned long incomingData;
    network.read(header, &incomingData, sizeof(incomingData)); // Read the incoming data
    analogWrite(led, incomingData);    // PWM output to LED 01 (dimming)
  }
  //===== Sending =====//
  // Servo control at Node 01
  unsigned long potValue = analogRead(A0);
  unsigned long angleValue = map(potValue, 0, 1023, 0, 180); // Suitable for servo control
  RF24NetworkHeader header2(node01);     // (Address where the data is going)
  bool ok = network.write(header2, &angleValue, sizeof(angleValue)); // Send the data

  // LED Control at Node 012
  unsigned long buttonState = digitalRead(button);
  RF24NetworkHeader header4(node012);    // (Address where the data is going)
  bool ok3 = network.write(header4, &buttonState, sizeof(buttonState)); // Send the data

  // LEDs control at Node 022
  unsigned long pot2Value = analogRead(A1);
  RF24NetworkHeader header3(node022);    // (Address where the data is going)
  bool ok2 = network.write(header3, &pot2Value, sizeof(pot2Value)); // Send the data
}Code language: Arduino (arduino)

따라서 기본 또는 마스터 노드에서 앞서 설명한 대로 라이브러리와 개체를 정의하고 마스터가 데이터를 보낼 다른 모든 노드도 정의해야 합니다. 루프 섹션에서는 들어오는 데이터가 있는지 지속적으로 확인하는 것으로 시작합니다. 그렇다면 데이터를 읽고 수신 데이터 변수에 저장하고 LED 밝기를 제어하는 ​​데 사용합니다. 이 데이터는 실제로 노드 02의 전위차계에서 가져온 것입니다. 코드를 보면 설정이 거의 동일하다는 것을 알 수 있습니다. 중요한 것은 우리가 데이터를 보내고자 하는 곳에 올바른 주소를 할당하는 것입니다. 이 경우에는 마스터 00입니다. 따라서 전위차계 값을 읽고 0에서 255까지의 적절한 PWM 값으로 변환한 후 이 데이터를 마스터로 보냅니다. 여기에서 내가 millis() 함수를 사용하여 10밀리초 간격으로 데이터를 보낸 것을 알 수 있습니다.

노드 02 소스 코드

/*
  Arduino Wireless Network - Multiple NRF24L01 Tutorial
        == Node 02 (Child of Master node 00) ==    
*/

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

RF24 radio(10, 9);               // nRF24L01 (CE,CSN)
RF24Network network(radio);      // Include the radio in the network
const uint16_t this_node = 02;   // Address of our node in Octal format ( 04,031, etc)
const uint16_t master00 = 00;    // Address of the other node in Octal format

const unsigned long interval = 10;  //ms  // How often to send data to the other unit
unsigned long last_sent;            // When did we last send?

void setup() {
  SPI.begin();
  radio.begin();
  network.begin(90, this_node);  //(channel, node address)
  radio.setDataRate(RF24_2MBPS);
}

void loop() {
  network.update();
  //===== Sending =====//
  unsigned long now = millis();
  if (now - last_sent >= interval) {   // If it's time to send a data, send it!
    last_sent = now;
    unsigned long potValue = analogRead(A0);
    unsigned long ledBrightness = map(potValue, 0, 1023, 0, 255);
    RF24NetworkHeader header(master00);   // (Address where the data is going)
    bool ok = network.write(header, &ledBrightness, sizeof(ledBrightness)); // Send the data
  }
}Code language: Arduino (arduino)

다음으로 마스터에서 서보 모터를 제어하기 위해 전위차계 데이터를 노드 01로 보냅니다.

노드 01 소스 코드

/*
  Arduino Wireless Network - Multiple NRF24L01 Tutorial
        == Node 02 (Child of Master node 00) ==
*/

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <Servo.h>

#define led 2

RF24 radio(10, 9);               // nRF24L01 (CE,CSN)
RF24Network network(radio);      // Include the radio in the network
const uint16_t this_node = 01;   // Address of our node in Octal format ( 04,031, etc)
const uint16_t master00 = 00;    // Address of the other node in Octal format

Servo myservo;  // create servo object to control a servo

void setup() {
  SPI.begin();
  radio.begin();
  network.begin(90, this_node); //(channel, node address)
  radio.setDataRate(RF24_2MBPS);
  myservo.attach(3);   // (servo pin)
  pinMode(led, OUTPUT);
}

void loop() {
  network.update();
  //===== Receiving =====//
  while ( network.available() ) {     // Is there any incoming data?
    RF24NetworkHeader header;
    unsigned long incomingData;
    network.read(header, &incomingData, sizeof(incomingData)); // Read the incoming data
    if (header.from_node == 0) {    // If data comes from Node 02
      myservo.write(incomingData);  // tell servo to go to a particular angle
    }
    if (header.from_node == 10) {    // If data comes from Node 012
      digitalWrite(led, !incomingData);  // Turn on or off the LED 02
    }
  }
}Code language: Arduino (arduino)

노드 01은 실제로 두 개의 다른 노드에서 데이터를 수신하고 있습니다. 하나는 서보 제어용이고 다른 하나는 노드 012의 적외선 센서에서 오는 LED 제어용입니다.

노드 012 소스 코드

/*
  Arduino Wireless Network - Multiple NRF24L01 Tutorial
            == Node 012 (child of Node 02)==    
*/

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

#define led 2
#define IR 3

RF24 radio(10, 9);               // nRF24L01 (CE,CSN)
RF24Network network(radio);      // Include the radio in the network
const uint16_t this_node = 012;  // Address of our node in Octal format ( 04,031, etc)
const uint16_t node01 = 01;    // Address of the other node in Octal format

void setup() {
  SPI.begin();
  radio.begin();
  network.begin(90, this_node);  //(channel, node address)
  radio.setDataRate(RF24_2MBPS);
  pinMode(led, OUTPUT);
  pinMode(IR, INPUT);
}

void loop() {
  network.update();
  //===== Receiving =====//
  while ( network.available() ) {     // Is there any incoming data?
    RF24NetworkHeader header;
    unsigned long buttonState;
    network.read(header, &buttonState, sizeof(buttonState)); // Read the incoming data
    digitalWrite(led, !buttonState); // Turn on or off the LED
  }
  //===== Sending =====//
  unsigned long irV = digitalRead(IR); // Read IR sensor
  RF24NetworkHeader header8(node01);
  bool ok = network.write(header8, &irV, sizeof(irV)); // Send the data
}Code language: Arduino (arduino)

이러한 경우 데이터가 어느 노드에서 오는지 정보를 얻기 위해 header.from_node 속성을 사용합니다. 마스터에서 들어오는 데이터가 있으면 서보를 제어하는 ​​데 사용하고 노드 012에서 들어오는 데이터가 있으면 LED를 제어하는 ​​데 사용합니다.

노드 012에는 송신과 수신이 모두 있습니다. 적외선 센서는 앞서 언급한 노드 01의 LED를 제어하고 여기의 LED는 마스터의 버튼에서 제어합니다.

노드 022 소스 코드

/*
  Arduino Wireless Network - Multiple NRF24L01 Tutorial
            == Node 022 (child of Node 02)==    
*/

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

#define led1 2
#define led2 3
#define led3 4
#define led4 5

RF24 radio(10, 9);               // nRF24L01 (CE,CSN)
RF24Network network(radio);      // Include the radio in the network
const uint16_t this_node = 022;  // Address of our node in Octal format ( 04,031, etc)
const uint16_t master00 = 00;    // Address of the other node in Octal format

void setup() {
  SPI.begin();
  radio.begin();
  network.begin(90, this_node);  //(channel, node address)
  radio.setDataRate(RF24_2MBPS);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
}

void loop() {
  network.update();
  //===== Receiving =====//
  while ( network.available() ) {     // Is there any incoming data?
    RF24NetworkHeader header;
    unsigned long potValue;
    network.read(header, &potValue, sizeof(potValue)); // Read the incoming data
    // Turn on the LEDs as depending on the incoming value from the potentiometer
    if (potValue > 240) {
      digitalWrite(led1, HIGH);
    } else {
      digitalWrite(led1, LOW);
    }
    if (potValue > 480) {
      digitalWrite(led2, HIGH);
    } else {
      digitalWrite(led2, LOW);
    }
    if (potValue > 720) {
      digitalWrite(led3, HIGH);
    } else {
      digitalWrite(led3, LOW);
    }
    if (potValue > 960) {
      digitalWrite(led4, HIGH);
    } else {
      digitalWrite(led4, LOW);
    }
  }
}Code language: Arduino (arduino)

마지막으로 노드 022의 LED는 마스터의 다른 전위차계에서 오는 데이터를 사용하여 제어됩니다.

요약하자면, 모든 것이 제대로 연결되고 모든 노드가 항상 활성 상태인 경우 우리의 작업은 노드를 정확하게 지정하는 것으로 귀결되며 뒤에 있는 모든 무거운 작업은 놀라운 RF24Network 라이브러리에 의해 수행됩니다.

그게 다야, 이 Arduino 프로젝트를 즐기고 새로운 것을 배웠기를 바랍니다. 아래 댓글 섹션에서 언제든지 질문하세요.


제조공정

  1. 가정에 무선 센서 네트워크 구축
  2. PiCamera를 사용한 AI 숫자 인식
  3. 무선 자기 데이터 전송
  4. K30 센서로 CO2 모니터링
  5. 1Sheeld/Arduino를 사용한 청각 장애인용 통신
  6. Arduino로 코인 억셉터 제어
  7. Bluetooth가 탑재된 Arduino로 LED 제어!
  8. Arduino 또는 ESP8266이 있는 정전 용량 지문 센서
  9. USB-BLE 무선 MIDI 어댑터
  10. Nextion 디스플레이로 재생