Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Jaringan Nirkabel Arduino dengan Beberapa Modul NRF24L01

Dalam tutorial ini kita akan belajar bagaimana membangun jaringan nirkabel Arduino, terdiri dari beberapa modul transceiver NR24L01. Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini.

Ringkasan

Sebagai contoh saya membuat jaringan 5 node dan masing-masing dapat berkomunikasi dengan node manapun dalam jaringan dan pada saat yang sama mereka dapat bekerja baik sebagai pemancar dan penerima. Contoh ini sebenarnya diatur dengan cara yang menjelaskan cara membuat jaringan yang jauh lebih besar, atau tepatnya, kita dapat memiliki total 3125 modul yang berkomunikasi satu sama lain pada satu saluran RF. Jadi mari kita lihat cara kerjanya.

Dalam tutorial saya sebelumnya, kita telah mempelajari cara membuat komunikasi nirkabel antara dua papan Arduino menggunakan modul NRF24L01 dan perpustakaan RF24. Sekarang selain perpustakaan ini, kami akan menggunakan perpustakaan RF24Network, yang memungkinkan dengan cara mudah untuk membangun jaringan nirkabel Arduino dengan banyak papan yang berkomunikasi satu sama lain. Begini cara kerja topologi jaringan.

Komunikasi beberapa modul NRF24L01

Satu modul NRF24L01 dapat secara aktif mendengarkan hingga 6 modul lain secara bersamaan.

Kemampuan ini digunakan oleh perpustakaan RF24Network untuk menghasilkan jaringan yang diatur dalam topologi pohon, di mana satu simpul adalah basis, dan semua simpul lainnya adalah anak dari simpul tersebut atau simpul lainnya. Setiap node dapat memiliki hingga 5 anak, dan ini dapat mencapai kedalaman 5 level, yang berarti kita dapat membuat jaringan dengan total 3125 node. Setiap node harus didefinisikan dengan alamat 15-bit, yang secara tepat menggambarkan posisi node di dalam pohon.

Kami sebenarnya dapat menentukan alamat node dalam format oktal. Jadi, alamat master atau basisnya adalah 00, alamat turunan dasarnya adalah 01 hingga 05, alamat turunan node 01 adalah 011 hingga 051 dan seterusnya.

Perhatikan bahwa jika node 011 ingin berbicara dengan node 02, komunikasi harus melalui node 01 dan base node 00, sehingga kedua node ini harus aktif sepanjang waktu agar komunikasi berhasil.

Kontrol Motor Servo Nirkabel Arduino menggunakan RF24Network Library

Sebelum kita menjelaskan contoh utama dari tutorial ini, untuk lebih memahami cara kerja library, mari kita buat contoh sederhana dari dua papan Arduino yang berkomunikasi satu sama lain. Berikut diagram sirkuit untuk contoh ini.

Anda bisa mendapatkan komponen yang diperlukan untuk Tutorial Arduino ini dari link di bawah ini:

  • Modul Pemancar NRF24L01………..
  • Motor Servo ……………………………………
  • Potensiometer ………………………………..
  • Arduino Nano ……………………………….. 

Jadi dengan menggunakan potensiometer di Arduino pertama kita akan mengontrol motor servo di Arduino kedua. Mari kita lihat kode sumbernya sekarang.

Berikut kode di sisi potensiometer:

/*
  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)

Pertama kita perlu menyertakan kedua perpustakaan RF24 dan RF24Network, serta perpustakaan SPI. Kemudian kita perlu membuat objek RF24, dan memasukkannya ke dalam objek RF24Network. Di sini kita perlu menentukan alamat node dalam format oktal, atau 00 untuk node ini, dan 01 untuk node lain di sisi servo.

Di bagian setup kita perlu menginisialisasi jaringan, dengan mengatur saluran dan alamat node ini.

Di bagian loop kita terus-menerus perlu memanggil fungsi update() yang melaluinya semua tindakan dalam jaringan terjadi. Kemudian kita membaca nilai potensiometer dan mengubahnya menjadi nilai dari 0 hingga 180 yang cocok untuk kontrol servo. Kemudian kami membuat header jaringan tempat kami menetapkan alamat node tempat data pergi. Pada akhirnya, menggunakan fungsi write() kami mengirim data ke node lain. Jadi di sini parameter pertama berisi informasi alamat, parameter kedua menunjukkan data mana yang akan dikirim, dan parameter ketiga adalah ukuran data.

Berikut kode di sisi servo:

/*
  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)

Di sisi lain, pada motor servo, kita perlu mendefinisikan perpustakaan dan objek dengan cara yang sama seperti yang dijelaskan sebelumnya. Di sini alamat node ini dalam format oktal adalah 01. Setelah mendefinisikan motor servo, di bagian loop, menggunakan loop while() dan fungsi available() kita terus-menerus memeriksa apakah ada data yang masuk. Jika benar, kami membuat header jaringan tempat data akan diterima dan juga variabel tempat data akan disimpan. Kemudian menggunakan fungsi read() kita membaca data, dan menyimpannya ke dalam variabel incomingData. Pada akhirnya kami menggunakan data ini untuk menggerakkan motor servo sesuai dengan potensiometer dari node lain.

Jaringan Nirkabel Arduino dengan Beberapa Modul NRF24L01

Setelah memahami contoh ini, kita dapat melanjutkan dengan contoh utama tutorial ini dan membangun jaringan nirkabel dari 5 Arduino yang saling berkomunikasi. Berikut adalah diagram blok dari contohnya.

Jadi dari basis, menggunakan potensiometer kita akan mengontrol motor servo di node 01, dengan potensiometer kedua kita akan mengontrol LED di node 022, menggunakan tombol kita akan mengontrol LED di node 012, dan LED di sini di basis akan dikontrol menggunakan potensiometer pada node 02. Juga menggunakan sensor inframerah pada node 012 kita akan mengontrol LED pada node 01. Jadi kita dapat melihat bahwa contoh ini menjelaskan cara mengirim dan menerima data pada saat yang bersamaan, serta bagaimana berkomunikasi dengan node dari cabang yang berbeda. Mari kita lihat kode Arduino sekarang.

Terkait: Pemancar RC Arduino DIY

Kode sumber 00 dasar

/*
  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)

Jadi pada node dasar atau master kita perlu mendefinisikan perpustakaan dan objek seperti yang dijelaskan sebelumnya, dan juga mendefinisikan semua node lain yang akan dikirimi data oleh master. Di bagian loop kita mulai dengan terus-menerus memeriksa apakah ada data yang masuk. Jika demikian, kami membaca data, menyimpannya ke dalam variabel data masuk dan menggunakannya untuk mengontrol kecerahan LED. Data ini sebenarnya berasal dari potensiometer dari node 02. Jika kita melihat kodenya, kita dapat melihat bahwa pengaturannya hampir sama. Yang penting adalah menetapkan alamat yang benar ke mana kita ingin mengirim data. Dalam hal ini, itu adalah master 00. Jadi setelah membaca nilai potensiometer dan mengubahnya menjadi nilai PWM yang sesuai dari 0 hingga 255, kami mengirimkan data ini ke master. Kita dapat melihat di sini bahwa saya menggunakan fungsi milis() untuk mengirim data pada interval 10 milidetik.

Kode sumber simpul 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)

Selanjutnya dari master, kami mengirimkan data potensiometer ke node 01 untuk mengontrol motor servo.

Kode sumber simpul 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)

Node 01 sebenarnya menerima data dari dua node yang berbeda, satu untuk kontrol servo dan yang lainnya untuk kontrol LED yang berasal dari sensor inframerah dari node 012.

Kode sumber simpul 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)

Dalam kasus seperti itu, kami menggunakan atribut header.from_node untuk mendapatkan informasi dari node mana data tersebut berasal. Jika data yang masuk berasal dari master, kami menggunakannya untuk mengontrol servo, dan jika data yang masuk berasal dari node 012, kami menggunakannya untuk mengontrol LED.

Pada node 012 kami memiliki transmisi dan penerimaan. Sensor inframerah mengontrol LED yang disebutkan sebelumnya di node 01 dan LED di sini adalah kontrol dari tombol di master.

Kode sumber simpul 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)

Terakhir, LED pada node 022 dikontrol menggunakan data yang berasal dari potensiometer lain di master.

Jadi, kesimpulannya, jika semuanya terhubung dengan benar, dan semua node aktif sepanjang waktu, tugas kami bermuara pada menangani node secara tepat dan semua pekerjaan berat di belakang dilakukan oleh library RF24Network yang luar biasa.

Jadi itu saja, saya harap Anda menikmati proyek Arduino ini dan belajar sesuatu yang baru. Jangan ragu untuk mengajukan pertanyaan apa pun di bagian komentar di bawah.


Proses manufaktur

  1. Membangun Jaringan Sensor Nirkabel di Rumah Anda
  2. Pengenalan Digit AI dengan PiCamera
  3. Transfer Data Magnetik Nirkabel
  4. Pemantauan CO2 dengan Sensor K30
  5. Komunikasi Tunarungu dengan 1Sheeld/Arduino
  6. Kontrol Penerima Koin dengan Arduino
  7. Arduino dengan Bluetooth untuk Mengontrol LED!
  8. Sensor Sidik Jari Kapasitif dengan Arduino atau ESP8266
  9. Adaptor MIDI Nirkabel USB-BLE
  10. Bermain Dengan Tampilan Berikutnya