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
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>
struct PacketData {
unsigned long hours;
unsigned long minutes;
unsigned long seconds;
};
radio.begin();
radio.setAutoAck(false);
radio.setDataRate(RF24_250KBPS);
radio.openWritingPipe(pipeOut);
data.minutes = 0;
data.seconds = 0;
}
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));
}
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
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 "U8glib.h"
#include <nRF24L01.h>
#include <RF24.h>
struct PacketData {
unsigned long hours;
unsigned long minutes;
unsigned long seconds;
};
int packetCountIndex = 0;
int packetCountTotal = 0;
int avgIndex = 0;
unsigned long avgTotal = 0;
{
Serial.begin(115200);
// Set up radio module
radio.begin();
radio.setDataRate(RF24_250KBPS);
radio.setAutoAck(false);
radio.openReadingPipe(1,pipeIn);
radio.startListening();
u8g.setFont(u8g_font_fur11);
memset( packetCounts, 0, sizeof(packetCounts) );
memset( avgs, 0, sizeof(avgs) );
}
unsigned long lastScreenUpdate = 0;
unsigned long lastAvgUpdate = 0;
unsigned long lastRecvTime = 0;
unsigned long drops = 0;
{
while ( radio.available() ) {
radio.read(&data, sizeof(PacketData));
packetsRead++;
lastRecvTime = millis();
}
}
char avgBuf[16];
char hmsBuf[16];
u8g.drawStr( 2, 24, ppsBuf);
u8g.drawStr( 2, 40, avgBuf);
u8g.drawStr( 2, 56, hmsBuf);
}
{
unsigned long now = millis();
if ( now - lastScreenUpdate < 100 )
return;
// moving average over 1 second
packetCountTotal -= packetCounts[packetCountIndex];
packetCounts[packetCountIndex] = packetsRead;
packetCountTotal += packetsRead;
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);
do {
draw();
}
while( u8g.nextPage() );
lastScreenUpdate = millis();
// moving average of 1 second moving average
avgTotal -= avgs[avgIndex];
avgs[avgIndex] = packetCountTotal;
avgTotal += packetCountTotal;
avgIndex = (avgIndex + 1) % AVG_SECONDS;
lastAvgUpdate = millis();
}
}
{
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