nRF24L01 Wireless RF Module – Belajar Arduino 101

Tahap Kesukaran

Pabila anda sudah menjejakkan kaki ke komunikasi wireless dalam Arduino, boleh dikatakan anda sudah berada pada tahap intermediate untuk Arduino dan Electronics.

Dalam Arduino, komunikasi wireless memerlukan kita ambil tahu tentang beberapa cara komunikasi peringkat cip dalam Arduino, seperti UART-Serial, SPI dan juga I2C.
(anda boleh rujuk artikel ini untuk mengetahui mengenai jenis-jenis komunikasi wireless).

Asas kepada Komunikasi Wireless hanyalah penghantaran data Binary 1010101 melalui Gelombang-Frequency dan juga Modulasi-Frequency dari satu chip Radio ke chip Radio penerima. Di peringkat Chip, chip hanya membaca Binary 101101 manakala di peringkat coding dan programming, pengguna boleh menggunakan HEX ASCII code dalam bentuk Byte yang lebih kompak dan lebih mudah untuk di baca dan di-debug.

2 Arduino berkomunikasi secara wireless adalah asas kepada Remote Control yang membolehkan anda gunakan dalam pelbagai applikasi seperti :

  • Robot control dan monitoring
  • RC Kapal Terbang, Drone, Kereta, Bot dan sebagainya
  • Wireless Sensor suhu, ketinggian, GPS, cahay dan sebagainya
  • Juga pelbagai applikasi auto dan robotik lain
REmote
Contoh Remote Control DIY dengan Arduino NANO dan Module nRF24L01+

Remote Control dengan nama lainnya hanyalah komunikasi Wireless antara 2 Microchip, dan terdapat pelbagai jenis komunikasi Wireless seperti berikut:

  • Bluetooth
  • WiFi
  • Radio Frequency

WiFi dan Bluetooth sebenarnya juga merupakan sejenis Radio Frequency Wireless tetapi mereka telah di protocolkan teknik penghantaran-penerimaan data untuk kegunaan yang lebih meluas.

Dalam Radio Frequency Wireless pula, berpecah kepada kelas-kelas frequency:

  • 27MHz – Untuk mainan kecil murah dan sudah tidak digunakan
  • 35MHz – Mainan RC Kapal Terbang tahun 90s – 2000 (tidak dibenarkan lagi)
  • 72MHz – Mainan RC Kapal Terbang tahun 90s – 2000 (tidak dibenarkan lagi)
  • 305Mhz – Kebiasannya untuk remote kipas rumah
  • 400MHz – Kebiasaannya untuk remote central lock kereta

nRF24L01+ menggunakan frequency terbaru, 2.4GHz yang mendapat kelulusan autority setempat dunia yang juga merupakan Band Frequency WiFi, tetapi menggunakan protocol yang berbeza. Kebanyakan frequency rendah sudah tidak dibenarkan lagi dan hanya boleh digunakan oleh askar dan penerima lesen dari autority setempat.

Xbee merupakan antara module yang paling efektif dalam komunikasi wireless Arduino serta kualiti yang menakjubkan. Namun, sebagai sebagai penggemar hobby DIY, harganya yang memakan RM100++ seunit, tidak lah begitu ekonomi. Apatah lagi, setiap projek untuk komunikasi wireless, pasti memerlukan 2 unit module Xbee bermakna Rm200++ sahaja harus di laburkan untuk module Xbee tidak termasuk shield-adapter untuk di pasang terus pada board Arduino.

Module nRF24L01+

small-nrf24-module.jpg
Module nRF. Chip nRF24 dapat dilihat di tengah-tengah.

Module nRF24L01+ ini sebenarnya adalah IC chipnya sendiri, yang sebenarnya telah banyak digunakan dalam mainan-mainan RC murah sekarang seperti drone dan helicopter, juga terdapat dalam beberapa applikasi komersil dan industri lain.

nRF24 DIY Remote Control
Kiri : module nRF24L01+ bersama SMA Antenna dan Power-Amplifier yang dapat mencapai jarak sehingga 1km, Kanan : module nRF24L01+ yang hanya mempunyai PCB-Antenna, boleh mencapai jarak <50m.

Chip ini telah di-module-kan dengan kompak untuk kesesuaian penggunaannya bersama Arduino. Anda boleh lihat 2 jenis module nRF24L01+ yang mempunyai jarak pengendalian yang berbeza:

Digabungkan dengan Libray nRF24 yang telah dibangunkan oleh TMRH20, ia telah mempermudahkan lagi golongan beginners untuk belajar mengapplikasi module Radio dalamhobby dan prototype mereka.

Sambungan Wiring Pada Arduino

Module nRF24L menggunakan kaedah komunikasi SPI-Serial untuk berkomunikasi dan berinteraksi dengan Arduino atau MicroController lain.

Berikut merupakan pin-pin pada Module nRF24L01+.
(Kedua-dua jenis module mempunyai kedudukan pin yang sama)

nRF24 PCB2
Module nRF24L01+ termurah dengan PCB Antenna boleh capai jarak <50m
nRF24 PCB
Module nRF24L01+ bersama SMA Antenna dan Low Noise Amplifier boleh capai jarak sehingga 1km!

Bagi sambungan pada Arduino, ikut rajah berikut:

Sambungan Pada Arduino
Menggunakan 7 wire sambungan, 2 untuk Power 3.3V dan Ground, 3 untuk SPI (MOSI, MISO, SCK) dan 2 lagi untuk kawalan Data (CE & CSN).

Asas SPI menggunakan 3 wayar iaitu MOSI, MISO dan SCK (clock). Manakala pin CE mengubah kondisi chip dari Receiver ke Transmitter atau sebaliknya. Pin CSN pula boleh di kawal oleh Arduino untuk memilih sambungan SPI yang ingin dikomunikasi.

Rujuk Pin Layout Arduino UNO di atas untuk semak kedudukan pin SPI (MOSI, MISO, SCK). Untuk Board lain seperti MEGA, ia mempunyai Layout-Pin yang berbebeza. Sumber https://www.theengineeringprojects.com/

Komunikasi Serial-SPI boleh mencapai kelajuan sehingga 8MB/s membolehkan data di hantar-terima melalui Radio pada kelajuan sehingga 2MB/s.

Power dan Voltan

Kebanyakan chip-chip wireless seperti nRF24 ini serta WiFi atau Bluetooth, MEMERLUKAN Supply Input 3.3V untuk beroperasi. Supply 3.3V KEPADA module nRF24 PERLU mencukupi dan perlu bebas dari NOISE.

  • Voltan : 3.3V DC
  • Arus : 150mA

BEBERAPA ISU VOLTAGE BERKAITAN nRF24:

Input Voltage Noise

Kebanyakan supply Pin 3.3V pada Arduino UNO / NANO / MEGA tidak mempunyai Transistor/IC Voltage Regulator yang stabil. Ini menyebabkan Voltage supply pada Pin 3.3V mempunyai banyak NOISE yang boleh mengganggu OPERASI Module Radio nRF24.

Supply Current TIDAK Mencukupi

Kebanyakan Pin 3.3V pada Arduino, hanya mampu supply 100mA current. Module nRF24 memerlukan current sekurang-kurangnya 150mA untuk berfungsi dengan baik.

POWER MODULE nRF24:

Power Module ini adalah penyelesaian kepada kebanyakan isu Module nRF24 yang tidak berfungsi atau masalah transmisi data yang tidak stabil.

Module nRF24 Power Module mempunyai circuit Voltage Regulator dan Stabilizer
Module nRF24 dipasang pada unit Power Module

Module nRF24 Power Module ini boleh didapati di E-Commerce MatGyver di URL berikut:

Library RF24 dari TMRH20

Programming atau Coding bagi Module nRF24 atau komunikasi Serial-SPI, adalah antara kategori yang amat kompleks.

Oleh itu, kami amat sarankan menggunakan Library Radio dari TMRH20 untuk kawalan Radion nRF24.

Library ini merupakan antara yang paling efficient dan lebih mudah untuk difahami.

Anda boleh dapati library RF24 dari Arduino IDE Downloads manager atau dari URL berikut:

Memahami Library RF24

Bagi meneruskan pemahaman tentang kaedah coding menggunakan Library RF24, rujuk carta pembahagian Coding yang berikut:

cover-photo-ide
Asas pembahagian kawasan coding, MatGyver.my

BAHAGIAN DEFINING AREA

Rupa keseluruhan coding dalam Defining Area adalah seperti berikut:
(copy/paste untuk mudahkan)

#include <SPI.h>       //masukkan library SPI, nRF menggunakan komunikasi SPI
#include <nRF24L01.h>  //masukkan library nRF24L01
#include <RF24.h>      //masukkan library RF24L

const uint64_t pipeOut = 0x9888F6F6E1LL; //address/alamat unik ditentukan oleh pengguna

RF24 radio(9, 10); 
//Untuk Arduino UNO : pin CE(9) & CSN(10)
//MOSI(11) , SCK(13) , MISO(12)
//Untuk Arduino MEGA : pin CE(48) & CSN(49)
//MOSI(50) , SCK(51) , MISO(52)

//Struktur Data-Array yang akan di transmit setiap cycle
//data dinamakan MyData
struct MyData {
 byte but1;            //BUTTON 1 STATUS  (byte = 1 byte) 
 //byte but2;          //0 ~255 (byte = 1 byte) 
 //int pot;            //0~1024 (int = 2 byte) 
 //float temperature;  //(float = 4 byte) 
};               // Jumlah size data 32 byte maksimum

MyData data; //prefix "data" diletakkan kepada setiap individu-array dalam MyData

#1 Include Library

Dalam Defining Area, 3 library berikut perlu dimasukkan:
(Nota: nRF24L01+ menggunakan SPI communication untuk berhubung dengan Arduino di peringkat chip)

  • SPI.h Library (library sedia-ada)
  • nRF24L01.h Library (library dari TMRH20)
  • RF24.h Library (library dari TMRH20)
#include <SPI.h>       //masukkan library SPI, nRF menggunakan komunikasi SPI
#include <nRF24L01.h>  //masukkan library nRF24L01
#include <RF24.h>      //masukkan library RF24L

#2 Pipe Identity/Address

Module nRF24 menggunaan Alamat/Address Pipe yang unik yang boleh diubah oleh programmer. 2 unit TRANCEIVER nRF24 hanya boleh berkomunikasi apabila KEDUA-DUAnya mempunyai ADDRESS PIPE yang SAMA.

Satu Unit Module nRF24 boleh menerima data dari 6 Address Pipe berlainan dalam 1 channel yang sama dalam Receiver-Mode.

Syntax untuk menetapkan Addresss Pipe adalah seperti berikut:

const uint64_t pipeOut = 0xE8E8F0F0E1LL; //address/alamat unik ditentukan oleh pengguna

(Nota kaki: const adalah bermaksud constant dan tidak berubah datanya.
uint64_t bermaksud jenis data integer yang tiada negative-value dengan size 64 bit.

Identiti Pipe di atas ditulis dalam 64bit.

const uint64_t pipeOut = 0xE8E8F0F0E1LL

Dalam Address di atas, nombor  E8E8F0F0E1 merupakan alamat unik. Address ini boleh menjadi apa-apa value sekalipun, yang penting ia ditulis dalam format ASCII HEX iaitu 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F.  Pilih saja mana-mana 10 huruf/nombor yang anda suka.

0x

dipermulaan adalah code yang menyatakan kita menggunakan coding Hex.

LL

dihujung pula code yang memberitahu Arduino, nombor Hex ini adalah panjang dan memerlukan penggunaan CPU yang lebih.

#3 Data Packet & Size Packet (Structure)

Letakkan semua data di bawah satu packet dan namakan packet tersebut. Size data keseluruhan tidak boleh melebihi 32byte.

Penggunakan data-packet membolehkan kondisi beberapa channel kawalan dihantar-terima serentak dalam satu hantaran.

Di bawah adalah contoh kaedah penulisan coding data-packet.

struct DataSaya {
 //senarai data anda
};

atau struktur penuh seperti berikut:

struct DataSaya {
 byte depanbelakang; //channel 1
 byte kirikanan; //channel 2
 byte naikturun; //channel 3
 byte chan4; //channel 4
 byte chan5; //channel 5
 byte chan6; //channel 6
 byte chan7; //channel 7
};

Perhatikan contoh struktur data di atas, mempunyai jumlah 7 byte (7 channel total). Maksudnya, masih ada lagi 25 byte lagi kekosongan lebihan dari 32byte keseluruhan.

PERHATIAN!: Setiap satu channel/byte boleh menyimpan atau hantar maklumat digital nombor dari 0~255.

#4 Declare Pin CE & CSN untuk SPI Control

Pin SPI control untuk RF24 perlu di-declare. Contoh di bawah menggunakan pin 9 sebagai pin CE dan Pin 10 sebagai pin CSN.

RF24 radio(9, 10); 
//Untuk Arduino UNO : pin CE(9) & CSN(10)
//MOSI(11) , SCK(13) , MISO(12)
//Untuk Arduino MEGA : pin CE(48) & CSN(49)
//MOSI(50) , SCK(51) , MISO(52)

#5 Berikan Pre-Fix untuk nama Data

Tidak perlu tapi berguna, berikan nama pada Set-Struktur-Data korang seperti berikut, Pre-Fix “data digunakan. ia memudahkan untuk kita manage syntax dan cara penghantaran maklumat:

DataSaya data;

#6 Declare Variable-variable yang lain

Jangan lupa untuk declare semua variable-variable project anda dalam Defining Area juga, seperti int, char, float dan sebagainya.

VOID SETUP AREA

Dalam Void Setup Area, terdapat 9 algorythm yang harus ditulis untuk module nRF24L01+ ini. Rujuk berikut:

1. Setup semua pinMode()
Setiap kali menulis Void Setup, selalu pastikan semua pin yang berkenaan di setup dulu, tidak kira Pin Digital mahupun Analog.

pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(6, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);

pinMode(A0, INPUT);
pinMode(A1, INPUT);

2. Mulakan radio.begin()
Serupa dengan Serial, communication radio perlu ada .begin()

radio.begin();

3. Set Power Amplifier (PA) Level untuk module nRF
Ada 4 setting pada untuk kekuatan power module nRF24 yang akan mengawal kekuatan dB output serta power (W)

  • RF24_PA_MIN
  • RF24_PA_LOW
  • RF24_PA_HIGH
  • RF24_PA_MAX

Maksud setiap syntax di atas adalah seperti berikut:

table-range-1
Untuk module nRF24L01+ bersama zig-zag PCB antenna.
table-range-2
Untuk module nRF24L01+ bersama PA+LNA+SMA Antenna.

Cara menulis syntax PA level adalah seperti berikut:

radio.setPALevel(RF24_PA_HIGH );

4. Set Channel Frequency (0~124)

Syntax untuk menukar channel frequency module nRF24L01+ dalam library TMrh20 adalah seperti berikut:

radio.setChannel(35);

Value 35 adalah nombor channel frequency yang boleh ditukar dari 0~125. Kebanyakan Router Wifi menggunakan channel-channel dari 0~100, oleh itu kami sarankan anda gunakan channel dari 100~125 untuk mengurangkan sebarang noise dari frequency lain.

Setiap channel adalah tambahan 1MHz bermula dari 2400Mhz (2.4Ghz) pada channel 0, jika channel 1 dipilih, maka channel frequency menjadi 2401Mhz. Maksimum adalah channel 125 yang akan menjadi 2525Mhz (2.525Ghz).

5. Set AutoAck
AutoAck adalah satu fungsi pada module nRF24L01+ dimana Unit-Receiver akan menghantar satu signal Acknowledge pulang kepada Unit-Transmitter bagi mengatakan data penuh telah diterima.

Namun, buat kebanyakan projek, fungsi ini tidak perlu digunakan.
Hanya biarkan setting pada ‘false’ sahaja sudah memadai.

radio.setAutoAck(false);

Jika anda ingin menggunakan fungsi ini dengan ‘true’ kami sarankan anda buat kajian lebih terperinci di URL berikut:

6. Set Data Transfer Rate
Bagi kebiasaan projek Remote Control, adalah memadai dengan menggunakan data-rate-transfer pada kelajuan 250KBps agar tiada signal loss.

radio.setDataRate(RF24_250KBPS);

Dengan penghantaran data yang kecil, 250KBps, penghantaran data adalah lebih cepat dan jitu.

Beberapa setting kelajuan penghantaran data yang lain adalah seperti berikut:

  • 1Mbps : RF24_1MBPS
  • 2Mbps : RF24_2MBPS

Namun, ia tidak digalakkan kecuali jika anda sudah mahir.

7. Open Reading/Writing Pipe
Bagi Unit-Transmitter, syntax penulisan untuk setting module nRF24 bagi mengHANTAR data adalah seperti berikut:

radio.openWritingPipe(pipeOut);

Bagi Unit-Receiver pula, syntax penulisan untuk setting module nRF24 bagi meNERIMA data adalah seperti berikut:

radio.openReadingPipe(1,pipeIn);

Perhatikan, No. 1 di tulis menandakan pipe nombor 1 digunakan. Unit-Receiver boleh menerima data sehingga 6 Pipe/module.

8. Start Listening (untuk Receiver mode)
Bagi Unit-Penerima, syntax ‘Listening‘ perlu di adakan.

radio.startListening();

9. .read / .write Data
.write digunakan pada Unit-Transmitter bagi menghantar data.
Syntax ini hanya perlu ditulis sekali sahaja dan tidak perlu ditulis berulang kali. Ini adalah kelebihan menggunakan kaedah Data-Packet MyData.

radio.write(&data, sizeof(MyData));

.read digunakan pada Unit-Receiver bagi menerima data dan digabungkan dengan radio.available

while ( radio.available() ) {        //check jika ada sebarang input dari Transmitter     
   radio.read(&data, sizeof(MyData)); //read data dan susun dalam array MyData
 }

VOID LOOP AREA
Bagi memahami kaedah coding di bahagian Void Loop, kami sarankan anda ikuti conto projek ringkan di URL di bawah untuk melihat bagaimana coding penuh untuk satu unit-Transmitter dan satu unit-Receiver dilaksanakan.

AUXILLARY AREA
Auxillary area tidak digunakan bergantung dengan kaedah programming anda.

UPDATE! :

Penggunaan bersama Arduino MEGA 

Apabila menggunakan board Arduino MEGA bersama module nRF24L01+ , terdapat 2 perkara yang perlu diteliti:

#1 Sambungan SPI

Pin-pin SPI pada Arduino MEGA adalah berbeza kedudukan berbanding UNO dan NANO.
(Rujuk gambar berikut)

mega2560_r3_label-small-v22028229

Kedudukan pin SPI adalah:
MISO – Pin 50
MOSI – Pin 51
SCK – Pin 52
CSN/SS – Pin 53 (atau mana-mana lain)
CE – mana-mana pin digital pilihan anda

#2 Declare pin CSN/SS sebagai OUTPUT

Pin CSN/SS yang tidak dideclare sebagai OUTPUT, akan menyebabkan pin tersebut mempunyai kondisi yang berubha-ubah sepanjang beroperasi. Apa yang terjadi, module nRF24L01+ tidak akan dapat menghantar transmisi dengan konsisten dan anda akan mendapat signal yang putus-putus

Contoh Project Remote Control Mudah

end.

Disclaimer: Tentang MatGyver.my

Artikel-artikel di MatGyver.my ditulis khas untuk DIY-ers dan Hobbyist yang tiada latar belakang Electronics Engineering mahupun Mechanical Engineering. Setiap artikel MatGyver.my diolah dan digubah semudah yang mungkin bertujuan untuk mempermudahkan pemahaman dan penggunaan sesuatu komponen teknikal untuk aktiviti DIY. Artikel-artikel di MatGyver.my tidak sesuai untuk pembaca yang memerlukan info yang terlalu detail dan sangat mendalam sehingga boleh mendapat segulung Ijazah Sarjana Muda Electronics Engineering atau Mechanical Engineering.

Namun, kami alu-alukan anda-anda yang hebat untuk memberi penjelasan yang lebih terperinci pada mana-mana persoalan yang timbul tentang 2 topik utama di atas.

end.

Published by Mat Gyver

Peneraju Komuniti Digital Maker Malaysia. Pembangunan Komuniti diUtamakan.

2 thoughts on “nRF24L01 Wireless RF Module – Belajar Arduino 101

  1. assalamualaikum, saya mahu tanya beberapa soalan

    1. kalau untuk test nrf24 saya working ke tak (tak rosak), saya menggunakan char text [32]={0}; pada receiver untuk hantar “hello world”. part ni dah berjaya.. cume.. boleh saya tahu detail maksud *32 ni tak, ada limit huruf ke untuk send?

    2. lepas tu, saya try send data from device (DHT11), part ni saya ada problem untuk sync kan timing sebab maybe bukan character yang perlu di send, untuk send nombor saya masih tak jumpa contoh, boleh saya tahu bagaimana/ tips untuk selesaikan masalah ini?

    Like

    1. #1 Code asas transmitter untuk menghantar data adalah
      radio.write(&data, sizeof(MyData));
      Di sini ada 2 info data yang perlu disediakan (data, size data).
      Yang cikpuan gunakan menggunakan text[] kemungkinan cikpuan referdari sini
      https://howtomechatronics.com/tutorials/arduino/arduino-wireless-communication-nrf24l01-tutorial/

      ini coding text:
      char text[32] = “”;
      radio.read(&text, sizeof(text));

      Dalam nrf24, ia hanya mampu menghantar 32 byte data dalam satu masa. Jadi dalam kes cikPuan 32 itu bermakna 32 byte yang bersamaan 32 huruf. Space kosong dan juga symbol adalah dikira sebagai 1 byte data juga.

      Jika nak hantar lebih dari 32 huruf, perlu bina special coding sendiri yang mana coding tersebut akan cerakinkan contoh 100 huruf kepada 32 block block yang berbeza (ini memang rumit dan perlukan expertise dalam programming).
      Bila receiver terima beberapa block berbeza, receiver juga perlu ada special code untuk gabung semula semua block untuk dibina semula ayat penuh 100 huruf.

      #2 Menghantar data temperature dari DHT11.
      Refer pada blog post kami yang berikut
      https://matgyver.my/2018/08/25/nrf24l01-diy-remote-control-mudah-project-matgyver-my/

      Akan ada bahagian coding seperti dibawah:

      struct MyData {
      byte but1;
      };

      Tukar kan kepada,

      struct MyData {
      float temperature_saya;
      };

      Tukar untuk kedua-dua set coding transmitter dan receiver.
      Untuk pengetahuan tambahan.
      1byte =1 byte
      1 float = 4 byte

      Contoh coding dibawah ada 8 set float bermakna jumlah 32 byte data.

      struct MyData {
      float temperature_1;
      float temperature_2;
      float temperature_3;
      float temperature_4;
      float temperature_5;
      float temperature_6;
      float temperature_7;
      float temperature_8;
      };

      Like

Tinggalkan Jawapan

Masukkan butiran anda dibawah atau klik ikon untuk log masuk akaun:

WordPress.com Logo

Anda sedang menulis komen melalui akaun WordPress.com anda. Log Out /  Tukar )

Facebook photo

Anda sedang menulis komen melalui akaun Facebook anda. Log Out /  Tukar )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: