Wednesday, 14 July 2021

Pengujian Jarak NRF24L01


Salam sejahtera kepada semua pembaca. 

Pengenalan. 
Projek ini bertujuan menilai jarak maksimum pemancaran dan penerimaan gelombang 2.4Ghz yang berkuasa rendah untuk penghantaran sesuatu data. Projek ini boleh digunakan untuk menilai Hardware Setup yang telah disediakan sebelum digunakan untuk penghantaran data sebenar mengguna hardware setup yang sama.
Transmitting dan receiving boleh ditambah baik dengan beberapa kaedah mengikut keadaan lokasi hardware berada seperti:- 
1. Ketinggian antenna dari paras tanah.
    - Lebih tinggi antenna dari tanah bermakna ia makin kurang halangan seperti pokok, bangunan dan sebagainya.
2. Jenis antenna.
   - Terdapat beberapa jenis antenna yang boleh digunakan mengikut keperluan. Contohnya antenna Yagi, berguna apabila kita tahu arah penalaan antenna yang membolehkan penerimaan atau pemancaran pada tahap yg optimum. Antenna omni yang berguna untuk penerimaan atau pemancaran gelombang pada kawasan yang lebih luas.
3. Kuasa pancaran.
  - Mempengaruhi jarak pemancaran dan penggunaan bekalan kuasa. Lebih kuat kuasa pancaran, lebih jauh capaian gelombang dan juga makin lebih penggunaan bekalan kuasa, ini bermakna bateri anda makin cepat lemah.


Biquad Omni Antenna


Omni Antenna

Parabolic antenna



Patch antenna



Yagi Antenna


Contoh cara pemasangan antenna mengikut keperluan.








Penyambungan




Coding

Transmitter

 
/*
Simple transmitter, just sends 12-byte packet continously
nRF24L01 library: https://github.com/gcopeland/RF24
 
nRF24L01 connections
 1 - GND
 2 - VCC 3.3V !!! Ideally 3.0v, definitely not 5V
 3 - CE to Arduino pin 9
 4 - CSN to Arduino pin 10
 5 - SCK to Arduino pin 13
 6 - MOSI to Arduino pin 11
 7 - MISO to Arduino pin 12
 8 - UNUSED
 
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
 
const uint64_t pipeOut =  0xE8E8F0F0E1LL;
 
// The sizeof this struct should not exceed 32 bytes
struct PacketData {
  unsigned long hours;
  unsigned long minutes;
  unsigned long seconds;
};
 
PacketData data;
 
RF24 radio(9, 10);
 
void setup() {
  radio.begin();
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.openWritingPipe(pipeOut);
 
  data.hours = 0;
  data.minutes = 0;
  data.seconds = 0;   
}
 
unsigned long lastTick = 0;
 
void loop() {
  unsigned long now = millis();
  if ( now - lastTick >= 1000 ) {
    data.seconds++;
    if ( data.seconds >= 60 ) {
      data.seconds = 0;
      data.minutes++;
    }
    if ( data.minutes >= 60 ) {
      data.minutes = 0;
      data.hours++;
    }
    lastTick = now;
  }
   
  radio.write(&data, sizeof(PacketData));   
}



Receiver

 
/*
Simple receiver to display how many packets per second are being received
nRF24L01 library: https://github.com/gcopeland/RF24
I2C OLED screen library: https://github.com/olikraus/u8glib
 
nRF24L01 connections
 1 - GND
 2 - VCC 3.3V !!! Ideally 3.0v, definitely not 5V
 3 - CE to Arduino pin 9
 4 - CSN to Arduino pin 10
 5 - SCK to Arduino pin 13
 6 - MOSI to Arduino pin 11
 7 - MISO to Arduino pin 12
 8 - UNUSED
 
OLED connections
 GND - GND
 VCC - VCC
 SDA - Arduino pin A4
 SCL - Arduino pin A5
 
*/
 
#include <SPI.h>
#include "U8glib.h"
#include <nRF24L01.h>
#include <RF24.h>
 
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);       // Fast I2C / TWI
 
const uint64_t pipeIn =  0xE8E8F0F0E1LL;
 
RF24 radio(9, 10);
 
// The sizeof this struct should not exceed 32 bytes
struct PacketData {
  unsigned long hours;
  unsigned long minutes;
  unsigned long seconds;
};
 
PacketData data;
 
/**************************************************/
 
int packetCounts[10];
int packetCountIndex = 0;
int packetCountTotal = 0;
 
#define AVG_SECONDS 10
 
int avgs[AVG_SECONDS];
int avgIndex = 0;
unsigned long avgTotal = 0;
 
void setup()
{
  Serial.begin(115200);
  // Set up radio module
  radio.begin();
  radio.setDataRate(RF24_250KBPS);
  radio.setAutoAck(false);
  radio.openReadingPipe(1,pipeIn);
  radio.startListening();
 
  u8g.setColorIndex(1);
  u8g.setFont(u8g_font_fur11);
 
  memset(&data, 0, sizeof(PacketData)); 
  memset( packetCounts, 0, sizeof(packetCounts) );
  memset( avgs, 0, sizeof(avgs) );
}
 
unsigned long packetsRead = 0;
unsigned long lastScreenUpdate = 0;
unsigned long lastAvgUpdate = 0;
unsigned long lastRecvTime = 0;
unsigned long drops = 0;
 
/**************************************************/
 
void recvData()

  while ( radio.available() ) {       
    radio.read(&data, sizeof(PacketData));
    packetsRead++;
    lastRecvTime = millis();
  }
}
 
/**************************************************/
 
char ppsBuf[16];
char avgBuf[16];
char hmsBuf[16];
 
void draw() {
  u8g.drawStr( 2, 24, ppsBuf);
  u8g.drawStr( 2, 40, avgBuf);
  u8g.drawStr( 2, 56, hmsBuf);
}
 
void updateScreen()

  unsigned long now = millis();
  if ( now - lastScreenUpdate < 100 )
    return;
   
  // moving average over 1 second
  packetCountTotal -= packetCounts[packetCountIndex];
  packetCounts[packetCountIndex] = packetsRead;
  packetCountTotal += packetsRead;
 
  packetCountIndex = (packetCountIndex + 1) % 10;
  packetsRead = 0;
 
  sprintf(ppsBuf, "PPS: %d", packetCountTotal);
  sprintf(avgBuf, "AVG: %ld", avgTotal / AVG_SECONDS);
  sprintf(hmsBuf, "%02ld:%02ld:%02ld", data.hours, data.minutes, data.seconds);
 
  u8g.firstPage();
  do {
    draw();
  }
  while( u8g.nextPage() );
 
  lastScreenUpdate = millis();
 
  if ( now - lastAvgUpdate >= 1000 ) {   
    // moving average of 1 second moving average
    avgTotal -= avgs[avgIndex];
    avgs[avgIndex] = packetCountTotal;
    avgTotal += packetCountTotal;
 
    avgIndex = (avgIndex + 1) % AVG_SECONDS;
    lastAvgUpdate = millis();
  }
}
 
/**************************************************/
 
void loop()
{
  recvData();
  updateScreen();
}
 
 

 

 

PENAFIAN : EAWAN, 9W2NFE sama sekali tidak akan bertanggungjawab diatas sebarang ketidaktepatan maklumat yang didapati dilaman blog ini dan segala kemungkinan yang timbul disebabkan ketidaktepatan maklumat tersebut. Segala pengambilan maklumat dan ujikaji yang dilakukan melalui laman blog ini adalah diatas risiko sendiri Sebarang kemuskilan atau pertanyaan boleh hubungi saya.

WHATAPPS MAFeS




No comments:

Post a Comment