56. Komunikasi Menggunakan Modul Wireless NRF24L01-2.4 GHz
56. Komunikasi Menggunakan Modul Wireless NRF24L01-2.4 GHz

Modul Wirreless NRF24L01 adalah modul yang dapat membantu mikrokontroler untuk dapat berkomunikasi satu sama lain secara nirkabel dengan jarak yang jauh. Modul ini dapat diaplikasikan pada proyek seperti memantau data sensor dari jarak jauh, mengendalikan robot, otomatisasi rumah, dll.

Frekuensi Radio

Modul transceiver (pemancar dan penerima) nRF24L01+ dirancang untuk bekerja pada pita frekuensi ISM (Industrial, Scientific, and Medical radio band) 2,4 GHz di seluruh dunia dan menggunakan modulasi GFSK untuk transmisi data. Kecepatan transfer data yaitu sbb: 250kbps, 1Mbps, dan 2Mbps.

Garis Besar Perangkat Keras Modul Wireless NRF24L01

Apa itu pita ISM 2,4 GHz?

Pita frekuensi ISM 2,4 GHz adalah salah satu pita yang dicadangkan secara internasional untuk penggunaan perangkat berdaya rendah tanpa harus ada izin. Contohnya adalah telepon tanpa kabel, perangkat Bluetooth, perangkat komunikasi jarak dekat (NFC), dan jaringan komputer nirkabel (WiFi) semuanya menggunakan frekuensi ISM.

Konsumsi Daya

Tegangan kerja modul adalah dari 1,9 hingga 3,6V tetapi pin Input nya toleran 5 volt , sehingga kita dapat dengan mudah menghubungkannya ke Arduino atau mikrokontroler dengan I/O 5V tanpa menggunakan konverter level logika.

Modul ini mendukung daya output yang dapat diprogram yaitu. 0 dBm, -6 dBm, -12 dBm atau -18 dBm dan mengkonsumsi arus sekitar 12 mA selama transmisi pada 0 dBm, yang bahkan lebih rendah dari satu LED. Modul ini mengkonsumsi arus 26 uA pada mode standby dan 900 nA pada mode power down. Modul ini cocok untuk aplikasi berdaya rendah.

SPI Interface

Modul transceiver nRF24L01+ berkomunikasi melalui Serial Peripheral Interface ( SPI ) 4-pin dengan kecepatan data maksimum 10Mbps . Semua parameter seperti saluran frekuensi (125 saluran yang dapat dipilih), daya keluaran (0 dBm, -6 dBm, -12 dBm atau -18 dBm), dan kecepatan data (250kbps, 1Mbps, atau 2Mbps) dapat dikonfigurasi melalui antarmuka SPI.

Bus SPI menggunakan konsep Master dan Slave, dalam aplikasi yang paling umum mikrokontroler adalah Master dan modul transceiver nRF24L01+ adalah Slave. Berbeda dengan bus I2C jumlah slave pada bus SPI terbatas, pada mikrokontroler (contoh: Arduino Uno) Anda dapat menggunakan maksimal dua slave SPI (dua modul transceiver nRF24L01+).

Versi Modul Wireless NRF24L01

Versi pertama menggunakan antena on-board. Versi ini memungkinkan versi breakout yang lebih ringkas. Namun, dengan antena yang lebih kecil mengakibatkan jangkauan transmisi lebih rendah. Dengan versi ini, Anda dapat berkomunikasi sejauh 100 meter .Tentu saja itu di luar ruangan yang terbuka. Adapun jangkauan di dalam ruangan akan sedikit melemah terutama untuk menembus dinding.

Versi kedua hadir dengan konektor SMA dan duck antenna tetapi bukan itu perbedaan sebenarnya. Perbedaan sebenarnya adalah versi ini hadir dengan chip RFX2401C khusus yang mengintegrasikan PA, LNA, dan sirkuit switching pemancar-penerima (transmit-receive switching circuitry). Chip yang dapat memperluas jangkauan dengan duck antenna ini dapat membantu modul mencapai jangkauan transmisi yang jauh yaitu > 1000m .

PA/LNA NRF24L01

PA (Power Amplifier) menguatkan  sinyal yang ditransmisikan dari chip nRF24L01+.  Fungsi LNA (Low-Noise Amplifier) adalah untuk memproses sinyal yang sangat lemah dan acak dari antena (biasanya pada orde mikrovolt atau di bawah -100 dBm) dan menguatkannya (biasanya sekitar 0,5 hingga 1V). LNA terdapat pada jalur penerimaan dan PA terdapat pada jalur pengirim, keduanya terhubung dengan antena melalui duplexer (allows bi-directional (duplex) communication over a single path), yang memisahkan dua sinyal dan mencegah output PA yang relatif kuat membebani input LNA yang sensitif.

Cara Kerja Modul nRF24L01+

Frekuensi saluran RF NRF24L01

Modul transceiver nRF24L01+ yang mengirim dan menerima data pada frekuensi tertentu disebut Channel . Agar dua atau lebih modul transceiver dapat berkomunikasi satu sama lain, maka mereka harus berada di channel yang sama.  Channel ini bisa berupa frekuensi berapa saja di dalam pita ISM 2,4 GHz atau lebih tepatnya bisa antara 2,400 hingga 2,525 GHz (2400 hingga 2525 MHz). Setiap channel menempati bandwidth kurang dari 1MHz. Ini memberi kita 125 saluran dengan jarak 1MHz. Jadi, modul ini dapat menggunakan 125 channel berbeda yang memungkinkan memiliki jaringan 125 modem yang bekerja secara independen dalam satu tempat.

Frekuensi saluran RF dari saluran yang Anda pilih diatur sesuai dengan rumus berikut:

Freq (Terpilih) = 2400 + CH (Terpilih)

Misalnya, jika Anda memilih 108 sebagai saluran untuk transmisi data, frekuensi saluran RF saluran Anda akan menjadi 2508MHz (2400 + 108).

Saluran ini menempati bandwidth kurang dari 1MHz pada kecepatan data udara 250kbps dan 1Mbps. Namun pada kecepatan data udara 2Mbps, bandwidth 2MHz digunakan (lebih lebar dari resolusi pengaturan frekuensi saluran RF). Jadi, untuk memastikan saluran yang tidak tumpang tindih dan mengurangi cross-talk dalam mode 2Mbps, Anda perlu menjaga jarak 2MHz di antara dua saluran.

Multiceiver Network NRF24L01

Multiceiver adalah Multiple Transmitters Single Receiver . Di mana setiap saluran RF dibagi menjadi 6 saluran data paralel yang disebut Pipa Data / Data Pipe. Dengan kata lain, pipa data adalah saluran logika di dalam saluran RF fisik. Setiap pipa data memiliki alamat fisiknya sendiri (Data Pipe Address) dan dapat dikonfigurasi. Hal ini dapat digambarkan seperti gambar di bawah ini.

Untuk menyederhanakan diagram di atas, bayangkan penerima utama bertindak sebagai hub penerima yang mengumpulkan informasi dari 6 node pemancar yang berbeda secara bersamaan. Hub Penerima dapat berhenti menerima data kapan saja dan bertindak sebagai pemancar. Tapi ini hanya bisa dilakukan satu pipa/simpul pada satu waktu.

Protokol ShockBurst NRF24L01

Modul transceiver nRF24L01+ menggunakan struktur paket yang dikenal sebagai Enhanced ShockBurst. Struktur paket sederhana ini dipecah menjadi 5 bagian yang berbeda, yang diilustrasikan di bawah ini.

Struktur baru ini sangat bagus karena sejumlah alasan: 

Pertama, ini memungkinkan panjang variabel payload dapat bervariasi dari 1 hingga 32 byte. Kedua, struktur ini menyediakan setiap paket yang dikirim menggunakan ID paket, yang memungkinkan perangkat penerima untuk menentukan apakah sebuah pesan itu merupakan pesan baru atau pesan yang telah dikirim ulang (dan dengan demikian dapat diabaikan). Terakhir, dan yang paling penting, setiap pesan dapat meminta acknowledgement/pengakuan (ACK) untuk dikirim ketika diterima oleh perangkat lain.

Penanganan Paket Data Otomatis/Automatic Packet Handling nRF24L01+

Di sini pemancar memulai komunikasi dengan mengirimkan paket data ke penerima. Setelah seluruh paket ditransmisikan, ia menunggu (sekitar 130 us) hingga paket ACK diterima. Ketika penerima menerima paket, ia mengirimkan paket ACK ke pemancar. Saat menerima paket ACK, pemancar mengaktifkan sinyal interupsi (IRQ) untuk menunjukkan bahwa data baru telah tersedia.

Jika pemancar tidak mendapatkannya dalam waktu Auto-Retransmit-Delay (ARD), paket ditransmisikan ulang. Ketika paket yang ditransmisikan kembali diterima oleh penerima, paket ACK ditransmisikan yang pada gilirannya menghasilkan interupsi pada pemancar.

Jika paket ACK hilang, maka setelah waktu Auto-Retransmit-Delay selesai, Tx mentransmisi ulang paket. Sekarang ketika penerima menerima paket yang berisi ID paket yang sama seperti sebelumnya, ia membuangnya dan mengirimkan paket ACK lagi.

Pinout NRF24L01

.

Meningkatkan Jangkauan Wireless nRF24L01

Kurangi Noise pada Catu Daya

Sirkuit RF yang menghasilkan sinyal Frekuensi Radio (RF), sangat sensitif terhadap noise catu daya. Jika tidak dikendalikan, noise catu daya dapat secara signifikan mengurangi jangkauan yang bisa Anda dapatkan. Untuk mencegah noise ini memasuki sistem, disarankan untuk menempatkan kapasitor filter 10f pada catu daya sedekat mungkin secara fisik dengan modul nRF24L01+. Untuk mengatasi noise ini, anda juga bisa menggunakan adapter di samping. Adapter ini bisa digunakan untuk kedua jenis modul nRF24L01(dengan antena terintegrasi dan eksternal).

Ubah Frekuensi Channel Anda

Sumber noise yang potensial lainnya untuk sirkuit RF adalah dari lingkungan luar, terutama jika Anda memiliki jaringan yang letaknya berdekatan dan memiliki channel yang sama atau gangguan dari perangkat elektronik lain. Untuk mencegah sinyal ini menjadi masalah, sebaiknya gunakan 25 saluran tertinggi modul nRF24L01+ Anda. Alasan untuk ini adalah WiFi menggunakan sebagian besar saluran yang lebih rendah.

Kecepatan Data Lebih Rendah

nRF24L01+ memberikan sensitivitas penerima tertinggi pada kecepatan 250Kbps yaitu -94dBm. Namun pada kecepatan data 2MBps, sensitivitas penerima turun menjadi -82dBm. Dalam hal ini, Anda tahu bahwa penerima pada 250 Kbps hampir 10 kali lebih sensitif daripada pada 2 Mbps. Itu berarti penerima dapat men-decode kode sinyal 10 kali lebih rendah. Jadi, menurunkan kecepatan data dapat secara signifikan meningkatkan jangkauan yang dapat Anda capai. Selain itu, untuk sebagian besar proyek, kecepatan 250 Kbps sudah lebih dari cukup.

Daya Keluaran Lebih Tinggi

Mengatur daya keluaran maksimum juga dapat meningkatkan jangkauan komunikasi. nRF24L01+ memungkinkan Anda memilih salah satu daya keluaran yaitu. 0 dBm, -6 dBm, -12 dBm atau -18 dBm. Memilih daya keluaran 0 dBm akan mengirimkan sinyal yang lebih kuat melalui udara.

Percobaan 71: Akses Komunikasi Menggunakan Modul Wireless nRF24L01 2.4GHz

.

NRF24L01 yang terhubung pada Arduino NANO:

.
.
.

.

NRF24L01 yang terhubung pada Arduino MEGA:

  1. Hubungkan CE dengan pin D9 ATMEGA 328
  2. Hubungkan CSN dengan pin D8 ATMEGA 328
  3. Hubungkan SI dengan pin D11 ATMEGA 328
  4. Hubungkan SO dengan pin D12 ATMEGA 328
  5. Hubungkan SCK dengan pin D13 ATMEGA 328
  6. Hubungkan board ATMEGA 328 dengan Komputer menggunakan kabel USB.
  7. (Bagian 1) Bukalah IDE Arduino, kemudian ketikkan kode program/sketch atau buka file RECEIVER_NRF_MEGA (RECEIVER) dan TRANSMITTER_NRF_NANO (TRANSMITTER). Program ini mengirim data dari Transmitter ke Receiver.
  8. (Bagian 2) Bukalah IDE Arduino, kemudian ketikkan kode program/sketch atau buka file TRANSMITTER_RECEIVER_NRF_NANO (TRANSMITTER & RECEIVER) dan RECEIVER_TRANSMITTER_NRF_MEGA (TRANSMITTER & RECEIVER). Program ini mengirim string secara bersamaan.
  9. (Bagian 3) Bukalah IDE Arduino, kemudian ketikkan kode program/sketch atau buka file TRANSMITTER_RECEIVER_NRF_NANO_PB_LED(TRANSMITTER & RECEIVER  -->PUSH BUTTON) dan RECEIVER_TRANSMITTER_NRF_MEGA_PB_LED(TRANSMITTER & RECEIVER  -->PUSH BUTTON) . Program ini akan mengirim data saat push button ditekan.
  10. Compile menggunakan verify button (tanda ceklist pada IDE arduino) untuk mengecek ada atau tidaknya error/kesalahan dalam pengetikan.
  11. Upload program ke arduino dengan cara, pilih File > Upload to I/O board, atau tekan tombol tanda panah pada jendela IDE arduino.

Bagian 1

Code RECEIVER_NRF_MEGA (RECEIVER) :

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
//PAKAI MEGA
//create an RF24 object
RF24 radio(53, 49);  // CE, CSN utk mega, JIKA DIGANTI UNO MAKA TINGGAL MENYESUAIKAN SAJA PIN CE DAN CSN NYA

//address through which two modules communicate.
const byte address[6] = "00001";

void setup()
{
  while (!Serial);
    Serial.begin(9600);
  
  radio.begin();
  
  //set the address
  radio.openReadingPipe(0, address);
  
  //Set module as receiver
  radio.startListening();
}

void loop()
{
  //Read the data if available in buffer
  if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }

//  const char text[] = "Hello AVR";
//  radio.write(&text, sizeof(text));
  
  delay(1000);
}

Code TRANSMITTER_NRF_NANO (TRANSMITTER):

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//PAKAI NANO
//create an RF24 object
RF24 radio(9, 8);  // CE, CSN

//address through which two modules communicate.
const byte address[6] = "00001";

void setup()
{
  radio.begin();
  
  //set the address
  radio.openWritingPipe(address);
  
  //Set module as transmitter
  radio.stopListening();
}
void loop()
{
  //Send message to receiver
  const char text[] = "Hello World";
  radio.write(&text, sizeof(text));
  
  delay(1000);
}


.

Bagian 2

Code TRANSMITTER_RECEIVER_NRF_NANO (TRANSMITTER & RECEIVER):

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//PAKAI NANO
//create an RF24 object
RF24 radio(9, 8);  // CE, CSN

//address through which two modules communicate.
const byte address[6] = "00001";

void setup()
{
 while (!Serial);
  Serial.begin(9600);
  radio.begin();
 
}
void loop()
{
   //set the address
  radio.openWritingPipe(address);
  
  //Set module as transmitter
  radio.stopListening();
  //Send message to receiver
  const char text[] = "Hello Hello DATA dari NANO";
  radio.write(&text, sizeof(text));
  delay(1000);
  
  //set the address
  radio.openReadingPipe(0, address);
  
  //Set module as receiver
  radio.startListening();
  if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }
  
  delay(1000);
}

Code RECEIVER_TRANSMITTER_NRF_MEGA (TRANSMITTER & RECEIVER):

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
//PAKAI MEGA
//create an RF24 object
RF24 radio(53, 49);  // CE, CSN utk mega, JIKA DIGANTI UNO MAKA TINGGAL MENYESUAIKAN SAJA PIN CE DAN CSN NYA

//address through which two modules communicate.
const byte address[6] = "00001";
//#define PB1 6
void setup()
{
  while (!Serial);
    Serial.begin(9600);

  
  radio.begin();

  
}

void loop()
{
  //Read the data if available in buffer
  //set the address
  radio.openReadingPipe(0, address);
  
  //Set module as receiver
  radio.startListening();
  if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }

  delay(1000);
//   set the address
  radio.openWritingPipe(address);
  
  //Set module as transmitter
  radio.stopListening();
  const char text[] = "Hello MEGA";
  radio.write(&text, sizeof(text));
  
  delay(1000);
}

.

Video Demo:


.

Bagian 3

Code TRANSMITTER_RECEIVER_NRF_NANO_PB_LED(TRANSMITTER & RECEIVER  -->PUSH BUTTON):

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//PAKAI NANO
//create an RF24 object
RF24 radio(9, 8);  // CE, CSN

//address through which two modules communicate.
const byte address[6] = "00001";
#define PB1 6
void setup()
{
 while (!Serial);
  Serial.begin(9600);
  radio.begin();
  pinMode(PB1, INPUT);
  digitalWrite(PB1, HIGH);
 
}
void loop()
{
  if (digitalRead(PB1) == LOW) {
     //set the address
    radio.openWritingPipe(address);
    
    //Set module as transmitter
    radio.stopListening();
    //Send message to receiver
    const char text[] = "Hello Hello dari 1";
    radio.write(&text, sizeof(text));
    delay(100);
  }
  
  //set the address
  radio.openReadingPipe(0, address);
  
  //Set module as receiver
  radio.startListening();
  if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }
  
  
}

Code RECEIVER_TRANSMITTER_NRF_MEGA_PB_LED(TRANSMITTER & RECEIVER  -->PUSH BUTTON):

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
//PAKAI MEGA
//create an RF24 object
RF24 radio(53, 49);  // CE, CSN utk mega, JIKA DIGANTI UNO MAKA TINGGAL MENYESUAIKAN SAJA PIN CE DAN CSN NYA

//address through which two modules communicate.
const byte address[6] = "00001";
#define PB1 6
void setup()
{
  while (!Serial);
    Serial.begin(9600);

  pinMode(PB1, INPUT);
  digitalWrite(PB1, HIGH);
  radio.begin();

  
}

void loop()
{
  if (digitalRead(PB1) == LOW) {
    //   set the address
    radio.openWritingPipe(address);
    
    //Set module as transmitter
    radio.stopListening();
    const char text[] = "Hello dari MEGA";
    radio.write(&text, sizeof(text));
    
      //Read the data if available in buffer
    //set the address
    radio.openReadingPipe(0, address);
    delay(100);
  }

  
  //Set module as receiver
  radio.startListening();
  if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }
}

.

Video Demo:


.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *