RFM95W و پارامترهای LoRa چیست؟ (مبتدی)
ماژول RFM95W ساخت HopeRF بر پایه چیپ SX1276 از Semtech است — همان چیپی که در LoRaWAN استفاده میشود. این ماژول روی باند 868MHz (استاندارد اروپا) یا ۹۱۵MHz (آمریکا) کار میکند و از طریق SPI با آردوینو ارتباط برقرار میکند.
سه پارامتر اصلی LoRa که باید درک شوند: SF (Spreading Factor، 6-12) — هرچه بیشتر = برد بیشتر، سرعت کمتر؛ BW (Bandwidth، 7.8-500kHz) — هرچه باریکتر = برد بیشتر، سرعت کمتر؛ CR (Coding Rate، 4/5-4/8) — تصحیح خطا. برای تلهمتری UAV در برد ۵-۱۰km، SF=10، BW=125kHz، CR=4/8 توصیه میشود.
محصولی که میسازید
لینک تلهمتری برای UAV با RFM95W 868MHz — برد تا ۵km با SF10.
- هزینه: ۲ × ۱۰ دلار = ۲۰ دلار
- برد (SF10): ۳-۵km
- نرخ داده: ~۱kbps (کافی برای GPS+bat)
جدول مقایسه SF برای انتخاب
| SF | سرعت | برد تقریبی | کاربرد |
|---|---|---|---|
| SF7 | ~5.5kbps | ۱-۲km | کنترل سریع |
| SF9 | ~1.76kbps | ۳-۴km | تلهمتری معمول |
| SF10 | ~980bps | ۴-۶km ✓ | تلهمتری UAV |
| SF12 | ~250bps | ۱۰-۱۵km | GPS ردیاب دور |
کد کامل TX (UAV)
#include <RH_RF95.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
RH_RF95 rf95(10, 2); // CS=10, INT=2
SoftwareSerial gps(4,5);
TinyGPSPlus gpsObj;
void setup() {
rf95.init();
rf95.setFrequency(868.1);
rf95.setSpreadingFactor(10);
rf95.setSignalBandwidth(125000);
rf95.setCodingRate4(8);
rf95.setTxPower(20); // دبام
gps.begin(9600);
}
void loop() {
while(gps.available()) gpsObj.encode(gps.read());
char buf[80];
sprintf(buf, "G,%.6f,%.6f,%.1f,%d,%.2f",
gpsObj.location.lat(), gpsObj.location.lng(),
gpsObj.altitude.meters(),
gpsObj.satellites.value(),
analogRead(A0)*16.8/1023.0 // ولتاژ 4S
);
rf95.send((uint8_t*)buf, strlen(buf));
rf95.waitPacketSent();
delay(2000);
}
کد RX (GCS)
#include <RH_RF95.h>
RH_RF95 rf95(10, 2);
void setup() {
Serial.begin(115200);
rf95.init();
rf95.setFrequency(868.1);
rf95.setSpreadingFactor(10);
rf95.setSignalBandwidth(125000);
rf95.setCodingRate4(8);
}
void loop() {
if(rf95.available()) {
uint8_t buf[80]; uint8_t len=sizeof(buf);
if(rf95.recv(buf, &len)) {
buf[len]=0;
Serial.print((char*)buf);
Serial.print(" RSSI="); Serial.println(rf95.lastRssi());
}
}
}