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

nRF24L01 – Cara Kerja, Antarmuka Arduino, Sirkuit, Kode

Dalam tutorial ini kita akan mempelajari cara membuat komunikasi nirkabel antara dua papan Arduino menggunakan nRF24L01 modul transceiver. Modul nRF24L01 adalah pilihan yang sangat populer untuk komunikasi nirkabel saat menggunakan Arduino.

Saya telah menggunakan modul ini untuk banyak proyek Arduino dan Anda dapat melihat beberapa di antaranya di sini:

  • Pemancar RC Arduino DIY
  • Pesawat RC Arduino | 100% buatan sendiri
  • RC Hovercraft berbasis Arduino DIY
  • Proyek Stasiun Cuaca Nirkabel Arduino

Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini. Ini mencakup semua yang perlu kita ketahui tentang modul transceiver nRF24L01, seperti pinout modul, prinsip kerja, pengkabelan, dan beberapa contoh kode.

Ringkasan

Untuk menjelaskan komunikasi nirkabel kita akan membuat dua contoh, yang pertama akan mengirimkan pesan sederhana “Hello World” dari satu Arduino ke Arduino lainnya, dan pada contoh kedua kita akan memiliki komunikasi dua arah antara papan Arduino, di mana menggunakan Joystick di Arduino pertama kita akan kendalikan motor servo di Arduino kedua, dan sebaliknya, dengan menggunakan push button di Arduino kedua kita akan mengontrol LED di Arduino pertama.

Modul Transceiver nRF24L01

Mari kita lihat lebih dekat modul transceiver NRF24L01. Ini menggunakan pita 2,4 GHz dan dapat beroperasi dengan kecepatan baud dari 250 kbps hingga 2 Mbps. Jika digunakan di ruang terbuka dan dengan baud rate yang lebih rendah jangkauannya bisa mencapai hingga 100 meter.

Berikut spesifikasi lengkapnya:

Rentang frekuensi 2,4 – pita ISM 2,5GHz
Tarif data 250Kbps / 1Mbps / 2Mbps
Maks. daya keluaran 0dBm
Tegangan operasi 1.9 – 3.6V
Maks. operasi saat ini 12,3mA
Saat ini siaga 22µA
Masukan logika toleran 5V
Rentang komunikasi 100m (ruang terbuka)

Cara Kerjanya

Modul ini dapat menggunakan 125 saluran berbeda yang memberikan kemungkinan untuk memiliki jaringan 125 modem yang bekerja secara independen di satu tempat. Setiap saluran dapat memiliki hingga 6 alamat, atau setiap unit dapat berkomunikasi dengan hingga 6 unit lainnya pada saat yang bersamaan.

Konsumsi daya modul ini hanya sekitar 12mA selama transmisi, yang bahkan lebih rendah dari satu LED. Tegangan operasi modul adalah dari 1,9 hingga 3,6V, tetapi hal baiknya adalah pin lain mentolerir logika 5V, sehingga kami dapat dengan mudah menghubungkannya ke Arduino tanpa menggunakan konverter level logika apa pun.

Tiga dari pin ini adalah untuk komunikasi SPI dan harus dihubungkan ke pin SPI Arduino, tetapi perhatikan bahwa setiap papan Arduino memiliki pin SPI yang berbeda. Pin CSN dan CE dapat dihubungkan ke pin digital apa pun dari papan Arduino dan digunakan untuk mengatur modul dalam mode siaga atau aktif, serta untuk beralih antara mode transmisi atau perintah. Pin terakhir adalah pin interupsi yang tidak harus digunakan.

Variasi modul

Ada beberapa variasi modul NRF24L01. Yang paling populer adalah antena dengan antena terpasang. Hal ini membuat modul menjadi lebih ringkas, namun di sisi lain, menurunkan jangkauan transmisi hingga jarak sekitar 100 meter.

Variasi kedua, selain antena on-board, antena ini memiliki konektor SMA dan kami dapat memasang antena bebek untuk jangkauan transmisi yang lebih baik.

Variasi ketiga yang ditampilkan di sini, selain antena bebek, ia memiliki chip RFX2401C yang mencakup PA (Penguat Daya) dan LNA (Penguat Kebisingan Rendah). Ini memperkuat sinyal NRF24L01 dan memungkinkan jangkauan transmisi yang lebih baik hingga 1000 meter di ruang terbuka.

nRF24L01 Pinout Modul

Berikut adalah tampilan mendetail pada pinout NRF24L01, serta modul PA/LNA NRF24L01+.

Kedua modul, NRF24L01 dan NRF24L01+ PA/LNA memiliki pinout yang sama, sehingga kami dapat menghubungkannya di sirkuit kami dengan cara yang sama.

Cara Menghubungkan nRF24L01 ke Arduino

Inilah cara kita perlu menghubungkan modul NRF24L01 ke papan Arduino.

Seperti yang telah saya sebutkan, setiap papan Arduino memiliki pin SPI yang berbeda, jadi ingatlah itu saat menghubungkan modul ke papan Arduino Anda.

Arduino SCK MISO MOSI SS
Tidak 13 12 11 10
Nano 13 12 11 10
Mega 52 50 51 53

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

  • Modul Pemancar NRF24L01………
  • Dewan Arduino ………………………………
  • Breadboard dan Kabel Lompat ………… 

Kode Arduino dan nRF24L01

Setelah kami menghubungkan modul NRF24L01 ke papan Arduino, kami siap membuat kode untuk pemancar dan penerima.

Pertama, kita perlu mendownload dan menginstal library RF24 yang membuat pemrograman menjadi lebih mudah. Kita juga bisa menginstall library ini langsung dari Library Manager Arduino IDE. Cukup telusuri “rf24” dan temukan serta instal yang dengan “TMRh20, Avamander”.

Berikut adalah dua kode untuk komunikasi nirkabel dan di bawah ini adalah deskripsinya.

Kode Pemancar

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

Kode Penerima

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

Deskripsi Kode

Jadi kita perlu menyertakan SPI dasar dan pustaka RF24 yang baru diinstal dan membuat objek RF24. Dua argumen di sini adalah pin CSN dan CE.

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

Selanjutnya kita perlu membuat array byte yang akan mewakili alamat, atau yang disebut pipa melalui mana dua modul akan berkomunikasi.

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

Kami dapat mengubah nilai alamat ini ke string 5 huruf apa pun dan ini memungkinkan untuk memilih penerima mana yang akan kami ajak bicara, jadi dalam kasus kami, kami akan memiliki alamat yang sama di penerima dan pemancar.

Di bagian setup, kita perlu menginisialisasi objek radio dan menggunakan fungsi radio.openWritingPipe() kita mengatur alamat penerima yang akan kita kirimi data, string 5 huruf yang sebelumnya kita atur.

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

Di sisi lain, di penerima, dengan menggunakan fungsi radio.setReadingPipe() kami menetapkan alamat yang sama dan dengan cara itu kami mengaktifkan komunikasi antara dua modul.

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

Kemudian menggunakan fungsi radio.setPALevel() kami mengatur level Power Amplifier, dalam kasus kami, saya akan mengaturnya ke minimum karena modul saya sangat dekat satu sama lain.

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

Perhatikan bahwa jika menggunakan level yang lebih tinggi, disarankan untuk menggunakan kapasitor bypass di seluruh modul GND dan 3.3V sehingga mereka memiliki tegangan yang lebih stabil saat beroperasi.

Selanjutnya kita memiliki fungsi radio.stopListening() yang menetapkan modul sebagai pemancar, dan di sisi lain, kita memiliki fungsi radio.startListening() yang menetapkan modul sebagai penerima.

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

Di bagian loop, di pemancar, kami membuat array karakter yang kami tetapkan pesan "Hello World". Menggunakan fungsi radio.write() kami akan mengirim pesan itu ke penerima. Argumen pertama di sini adalah variabel yang ingin kita kirim.

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

Dengan menggunakan tanda “&” sebelum nama variabel sebenarnya kita menetapkan indikasi dari variabel yang menyimpan data yang ingin kita kirim dan menggunakan argumen kedua kita mengatur jumlah byte yang ingin kita ambil dari variabel tersebut. Dalam hal ini fungsi sizeof() mendapatkan semua byte dari string "teks". Di akhir program kami akan menambahkan penundaan 1 detik.

Menggunakan fungsi radio.write() kami dapat mengirim maksimum 32 byte sekaligus.

Di sisi lain, di penerima, di bagian loop menggunakan fungsi radio.available() kami memeriksa apakah ada data yang akan diterima. Jika itu benar, pertama-tama kita membuat array 32 elemen, yang disebut "teks", di mana kita akan menyimpan data yang masuk.

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

Menggunakan fungsi radion.read() kita membaca dan menyimpan data ke dalam variabel "teks". Pada akhirnya kami hanya mencetak teks pada monitor serial. Jadi begitu kita mengupload kedua program, kita bisa menjalankan serial monitor di receiver dan kita akan melihat pesan “Hello World” tercetak setiap detik.

Pemecahan Masalah

Perlu diperhatikan bahwa kebisingan catu daya adalah salah satu masalah paling umum yang dialami orang ketika mencoba membuat komunikasi yang sukses dengan modul NRF24L01. Umumnya, sirkuit RF atau sinyal frekuensi radio sensitif terhadap gangguan catu daya. Oleh karena itu, selalu merupakan ide yang baik untuk menyertakan kapasitor decoupling di seluruh saluran catu daya. Kapasitor dapat berupa apa saja dari 10uF hingga 100uF.

Masalah umum lainnya adalah bahwa pin 3.3V dari papan Arduino, tidak selalu dapat memasok daya yang cukup ke modul NRF24L01. Jadi, memberi daya modul dengan sumber daya eksternal juga merupakan ide yang bagus.

Komunikasi Nirkabel Dua Arah dengan dua NRF24L01 dan Arduino

Mari kita lihat contoh kedua, komunikasi nirkabel dua arah antara dua papan Arduino. Berikut skema rangkaiannya:

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

  • Modul Pemancar NRF24L01…………
  • Papan Arduino………………………………….
  • Modul Joystick ……………………………….
  • Motor Servo …………………………………….
  • Tekan tombol ……………………………………..
  • LED …………………………………………………

Kode Sumber nRF24L01

Berikut adalah dua kode dan deskripsinya di bawah ini.

Kode Pemancar

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

Kode Penerima

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

Yang berbeda di sini dari contoh sebelumnya adalah kita perlu membuat dua pipa atau alamat untuk komunikasi dua arah.

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

Di bagian penyiapan kita perlu mendefinisikan kedua pipa, dan perhatikan bahwa alamat penulisan di Arduino pertama harus menjadi alamat baca di Arduino kedua, dan sebaliknya, alamat baca di Arduino pertama harus menjadi alamat penulisan di Arduino kedua.

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

Di bagian loop menggunakan fungsi radio.stopListening() kita mengatur Arduino pertama sebagai pemancar, membaca dan memetakan nilai Joystick dari 0 hingga 180, dan menggunakan fungsi radio.write() mengirim data ke penerima.

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

Di sisi lain, menggunakan fungsi radio.startListening() kami mengatur Arduino kedua sebagai penerima dan kami memeriksa apakah ada data yang tersedia. Selama ada data yang tersedia, kami akan membacanya, menyimpannya ke variabel "angleV" dan kemudian menggunakan nilai itu untuk memutar motor servo.

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

Selanjutnya pada transmitter kita set arduino pertama sebagai receiver dan dengan loop while yang kosong kita tunggu arduino kedua untuk mengirim data, dan itulah data status push button ditekan atau tidak. Jika tombol ditekan maka LED akan menyala. Jadi proses ini terus berulang dan kedua papan Arduino terus mengirim dan menerima data.

Contoh 3 – Mengirim beberapa variabel dalam satu paket

Mari kita lihat satu lagi contoh kode menggunakan modul NRF24L01. Semuanya tetap sama seperti pada contoh sebelumnya, harapkan cara kami menyusun dan mengirim tanggal.

Kode Pemancar

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

Jadi, kita bisa membuat struct yang sebenarnya merupakan kumpulan dari berbagai jenis variabel.

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

Kita harus ingat bahwa ukuran maksimum data struct ini bisa 32 byte. Di sini kita bisa melihat saya memasukkan tiga variabel tipe byte, satu variabel integer (4 byte), satu variabel float (4 byte) dan satu String yang berisi empat karakter (4 byte). Itu total 15 byte.

Kode Penerima

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

Di sisi penerima, kita harus mendefinisikan data struct yang sama agar dapat menerima data yang masuk. Untuk menguji apakah komunikasi nirkabel berfungsi dengan baik, saya mencetak setiap variabel pada monitor serial.

Kesimpulan

Modul NRF24L01 adalah pilihan yang bagus ketika Anda membutuhkan komunikasi nirkabel untuk proyek Arduino Anda. Saya telah menggunakan modul ini di banyak proyek Arduino saya.

Di sini saya akan mencantumkan semua proyek saya di mana saya telah menggunakan modul ini.

  • Kontrol Nirkabel Mobil Robot Arduino menggunakan Modul Transceiver Bluetooth HC-05, NRF24L01 dan HC-12
  • Proyek Stasiun Cuaca Nirkabel Arduino
  • Pemancar RC Arduino DIY
  • Robot Semut Semut Arduino
  • RC Hovercraft berbasis Arduino DIY
  • Robot Roda Arduino Mecanum
  • Penerima RC Arduino DIY untuk Model RC dan Proyek Arduino
  • Pesawat RC Arduino | 100% buatan sendiri

Setiap proyek/tutorial ini memiliki penjelasan rinci tentang cara menggunakan modul NRF24L01, termasuk diagram sirkuit, implementasi kode yang ditingkatkan untuk komunikasi yang lebih baik, dan sebagainya.

Proyek favorit saya adalah Pemancar Arduino RC yang dirancang khusus ini. Ini sebenarnya adalah pengontrol RC 14 saluran yang dapat digunakan untuk mengendalikan hampir semua Proyek Arduino.

Itu saja untuk tutorial ini, saya harap Anda menikmatinya dan belajar sesuatu yang baru. Seperti biasa, jangan ragu untuk mengajukan pertanyaan apa pun di bagian komentar di bawah.


Proses manufaktur

  1. Cara Mengukur Kualitas Udara di OpenSensors
  2. Cara Meretas Remote IR
  3. Berapa Tinggi Anda?
  4. JX Wave Generator
  5. Skateboard Realitas Virtual DIY
  6. Cara Menghubungkan Arduino Mega dengan Modul GPS NEO-6M
  7. Seberapa Mudah Menggunakan Termistor?!
  8. Cara membuat musik dengan Arduino
  9. Cara Menggunakan Modbus dengan Arduino
  10. Inilah Ide:Cara Kerja Antarmuka Otak-Komputer