nRF24L01 Module Wireless RF Termurah | Arduino Malaysia

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.

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

Belah kiri merupakan module nRF24L01+ bersama SMA Antenna dan Power-Amplifier yang dapat mencapai jarak sehingga 1km, manakala belah kanan merupakan 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

Berikut merupakan pin-pin pada Module nRF24L01+.
(Kedua-dua jenis module mempunyai 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.

Penggunaan komunikasi SPI membolehkan data di hantar-terima pada kelajuan sehingga 2MB/s.

Power dan Voltan

Kebanyakan chip-chip wireless seperti nRF24 ini serta WiFi dan Bluetooth, menggunakan voltan input 3.3V yang membolehkan output Power dikawal dengan mudah supaya tidak melanggar peraturan autority setempat.

  • Voltan : 3.3V DC
  • Arus : 150mA

PERHATIAN! :
Pin voltan 3.3V pada sesetengah Arduino-compatible, tidak mampu menyalurkan Arus yang mencukupi. Dan ini kadang-kadang menyebabkan nRF24 tidak dapat berfungsi dengan baik.

Namun, sehingga hari ini, kami masih belum menghadapi masalah ini pada board Arduino UNO serta NANO.

Walaubagaimanapun, jika projek anda adalah sensitif pada pengaliran data yang jitu, adalah di sarankan untuk memberi kuasa pada chip nRF24 ini melalui sumber lain dan bukan dari pin 3.3V pada Arduino.
(lihat contoh module regulator di bawah)

Microchip ini sangat sensitif pada kuasa Arus. Kawalan voltan input yang lemah dan tidak stabil akan mengganggu transmisi data, dan ada kemungkinan module tidak berfungsi terus.

im130731002_3

Contoh sejenis Step-Down Voltage Regulator kecil yang boleh memberi arus sehingga 3A, berasaskan chip LM2596.

Module Step-Down Regulator ini boleh didapati di URL berikut:

Antara beberapa isu yang anda mungkin hadapi dengan module ini adalah seperti berikut, bergantung pada tempat pembelian:

  • Input Voltage Noise
    Noise yang walaupun sedikit dan kecil banyak mempengaruhi module nRF24L01+ ini terutamanya module yang mempunyai PCB antenna zig-zag. Kebanyakan module bersama PA+LNA+ SMA Antenna adalah lebih stabil, tetapi cost-nya adalah lebih hampir 2X berbanding module kecil PCB antenna.
  • Supply Current tidak mencukupi
    Adalah digalakkan menggunakan power supply berasingan, atau lebih mudah module voltage regulator berasingan untuk memberi kuasa voltan pada module nRF24L01+

Library Kawalan dari TMRH20

Selesai dari segi pemahaman Hardware.

Paling penting selepas hardware adalah kaedah coding software module ini dalam Arduino.

Bagi yang mahir, mereka pasti akan menggunakan codigng sendiri berasaskan algorythm untuk kawalan SPI. Algorythm asas SPI ini adalah agak sukar untuk beginners fahami.

Namun bagi beginners, anda tidak perlu risau, kerana tuan TMRH20 telah bersusah payah untuk develop open source library bagi memudahkan programming nRF24L01+ dalam Arduino.

Anda boleh dapati library nRF24L01+ dalam URL berikut:

Bagi meneruskan pemahaman tentang kaedah coding module ini dalam Arduino, anda boleh rujuk pada konsep kaedah pembahagian coding seperti rajah berikut:

cover-photo-ide

Asas pembahagian kawasan coding, MatGyver.my

DEFINING AREA

Dalam Defining Area, ada 6 komponen yang perlu dimasukkan:
(contoh coding penuh ada di bahagian bawah artikel ini)

  1. Include Library berkenaan
  2. Nyatakan Pipe Identity/Address
  3. Struktur Packet Data yang akan dihantar
  4. Declare Pin CE dan CSN untuk SPI control
  5. Berikan Pre-Fix kepada struktur data anda
  6. Declare Variable-variable lain yang berkenaan dengan project anda

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>
#include <nRF24L01.h>
#include <RF24.h>

Masukkan juga library-library lain untuk kawalan-kawalan lain seperti SoftwareSerial, Servo, DHT11 dan lain-lain.

2. Pipe Identity/Address
Module nRF24 menggunaan Alamat/Address Pipe yang unik yang boleh diubah oleh programmer. Walaupun berkomunikasi dalam channel frequency yang sama, namun, unit yang tiada Kod Address yang sama dengan Address transmitter tidak dapat menerima signal tersebut.

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; //pipe identity/address

(Nota kaki: const adalah bermaksud constant dan tidak berubah datanya.
uint64_t bermaksud 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 address 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 leibh.

Untuk panduan memahami nombor Hex, boleh rujuk artikel di bawah:

  • Panduan Nombor Hex

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 korang
};

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.

Untuk beginners, kami sarankan anda hantar maklumat nombor 0~255 sahaja, dan jika perlu, gunakan nombor-nombor tersebut untuk diolah dibahagian Receiver jika perlu.
(satu contoh projek mudah Remote Control berasaskan module nRF24L01+ akan diberikan di hujung aritkel ini)

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); //pin CE & CSN

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 anda dalam Defining Area juga, seperti int, char, float dan sebagainya.

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

#include <SPI.h>
#include <nRF24L01.h> //TMrH20
#include <RF24.h> //TMrH20

const uint64_t pipeOut = 0xE8E8F0F0E1LL; //pipe identity/address

RF24 radio(9, 10); //pin CE & CSN

struct DataSaya { //nama data anda
 byte axis1; //label data pertama
 byte axis2; //label data kedua
};

DataSaya data; //label data pada MyData

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 Remote Control Mudah

nRF24 DIY Remote Control - CF

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

 

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.

One thought on “nRF24L01 Module Wireless RF Termurah | Arduino Malaysia

  1. Pingback: nRF24L01+ : DIY Remote Control Mudah | Project MatGyver.my | MatGyver - DIY & Hobby Blog

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 )

Google+ photo

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

Twitter picture

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

Facebook photo

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

Connecting to %s