UGV و کنترل LoRa یعنی چه؟ (برای مبتدی)
UGV مخفف Unmanned Ground Vehicle است — یک وسیله زمینی بدون سرنشین که از راه دور کنترل میشود. از رباتهای جستجو و نجات تا وسایل نقلیه اتوماتیک انبار همه UGV هستند. ارزانترین راه شروع یک شاسی فلزی ۴ چرخ با ۴ موتور گیربکسدار است.
LoRa (Long Range) یک پروتکل رادیویی است که میتواند در فرکانس ۴۳۳ یا ۸۶۸ مگاهرتز با توان خروجی پایین (۱۰۰ میلیوات) تا ۱ کیلومتر در شهر و ۵+ کیلومتر در فضای باز ارتباط برقرار کند. این برای کنترل UGV بسیار مناسب است — خیلی بهتر از Bluetooth که فقط ۱۰ متر برد دارد. محبوبترین ماژول آن Ra-02 (SX1278) است که در ایران بهراحتی پیدا میشود.
در این پروژه دو برد آردوینو دارید: یکی فرستنده با جویاستیک روی زمین، و یکی گیرنده روی ربات که LoRa دستورات جویاستیک را بین آنها منتقل میکند.
محصولی که میسازید
یک ربات UGV 4WD که با یک جویاستیک دستی (روی Arduino Nano) از طریق رادیو LoRa تا ۱ کیلومتر کنترل میشود.
- زمان ساخت: ۳ تا ۵ ساعت
- هزینه: ۸۰۰ هزار تا ۱.۵ میلیون تومان
- برد کنترل: ۵۰۰m شهری — ۱km+ فضای باز
قطعات لازم (BOM) — فرستنده
| قطعه | تعداد |
|---|---|
| Arduino Nano | ۱ |
| ماژول LoRa Ra-02 (SX1278) 433MHz | ۱ |
| جویاستیک دوگانه (Dual Joystick Module) | ۱ |
| باتری 9V | ۱ |
قطعات لازم — گیرنده (روی ربات)
| قطعه | تعداد |
|---|---|
| Arduino Nano | ۱ |
| ماژول LoRa Ra-02 (SX1278) 433MHz | ۱ |
| درایور موتور L298N | ۱ یا ۲ |
| شاسی 4WD با موتور گیربکس TT | ۱ کیت |
| باتری LiPo 7.4V 2S یا 4×AA | ۱ |
اتصال Ra-02 به Arduino Nano
| پین Ra-02 | پین Arduino Nano |
|---|---|
| VCC | 3.3V (مهم: نه 5V!) |
| GND | GND |
| SCK | D13 |
| MOSI | D11 |
| MISO | D12 |
| NSS/CS | D10 |
| RST | D9 |
| DIO0 | D2 |
⚠ Ra-02 فقط 3.3V تحمل دارد. پینهای MOSI/SCK/CS از 5V آردوینو به 3.3V نیاز به مقسم ولتاژ دارند یا از Arduino Pro Mini 3.3V استفاده کنید.
کد فرستنده
#include <SPI.h>
#include <LoRa.h>
const int JOY_X = A0; // چپ/راست
const int JOY_Y = A1; // جلو/عقب
void setup() {
Serial.begin(9600);
if (!LoRa.begin(433E6)) { Serial.println("LoRa init failed!"); while(1); }
LoRa.setSpreadingFactor(7);
LoRa.setSignalBandwidth(125E3);
Serial.println("Transmitter ready");
}
void loop() {
int x = analogRead(JOY_X); // 0-1023
int y = analogRead(JOY_Y); // 0-1023
LoRa.beginPacket();
LoRa.print(x); LoRa.print(","); LoRa.print(y);
LoRa.endPacket();
Serial.print("Sent X="); Serial.print(x);
Serial.print(" Y="); Serial.println(y);
delay(50); // ۲۰ بار در ثانیه
}
کد گیرنده (روی ربات)
#include <SPI.h>
#include <LoRa.h>
// L298N پینها
const int IN1=5, IN2=6, IN3=7, IN4=8, ENA=3, ENB=11;
void setMotors(int left, int right) {
left = constrain(left, -255, 255);
right = constrain(right, -255, 255);
analogWrite(ENA, abs(left)); analogWrite(ENB, abs(right));
digitalWrite(IN1, left > 0); digitalWrite(IN2, left < 0);
digitalWrite(IN3, right > 0); digitalWrite(IN4, right < 0);
}
void setup() {
Serial.begin(9600);
for (int p : {IN1,IN2,IN3,IN4,ENA,ENB}) pinMode(p, OUTPUT);
if (!LoRa.begin(433E6)) { Serial.println("LoRa failed!"); while(1); }
LoRa.setSpreadingFactor(7);
LoRa.setSignalBandwidth(125E3);
}
void loop() {
int pktSize = LoRa.parsePacket();
if (pktSize) {
String data = "";
while (LoRa.available()) data += (char)LoRa.read();
int comma = data.indexOf(',');
int x = data.substring(0, comma).toInt();
int y = data.substring(comma + 1).toInt();
// تبدیل جویاستیک به سرعت موتور
int fwd = map(y, 0, 1023, -255, 255);
int turn = map(x, 0, 1023, -150, 150);
setMotors(fwd + turn, fwd - turn);
}
}
چکلیست تست
| تست | نتیجه |
|---|---|
| Serial Monitor فرستنده X,Y نمایش میدهد؟ | بله |
| ربات به جویاستیک پاسخ میدهد؟ | بله |
| در فاصله ۱۰۰ متر کار میکند؟ | بله |
| هنگام قطع ارتباط ربات توقف میکند؟ | timeout اضافه کنید |