دستکش کنترل حرکتی چیست؟ (مبتدی)
به جای استفاده از جویاستیک یا دکمه، در این پروژه حرکت دست شما مستقیماً UGV را کنترل میکند. یک MPU-6050 روی دستکش نصب میشود و زاویه کج شدن دست را اندازه میگیرد. این زاویه با LoRa SX1278 (ماژول زیر ۱۰ دلار، برد تا ۱km) به گیرنده روی UGV ارسال میشود.
دست را جلو کج کنید → UGV جلو میرود. چپ کج کنید → UGV چپ میرود. صاف نگه دارید → توقف. این کنترل بسیار شهودی است و بدون نیاز به یادگیری دکمهها کار میکند.
محصولی که میسازید
یک دستکش کنترل UGV با LoRa بیسیم — کنترل با حرکت دست.
- هزینه TX: MPU-6050 + Arduino + SX1278 = ۲۰ دلار
- برد: ۵۰۰m-۱km
- تأخیر: زیر ۵۰ms
کد TX — دستکش
#include <LoRa.h>
#include <Wire.h>
#include <MPU6050.h>
MPU6050 mpu;
void setup() {
Wire.begin();
mpu.initialize();
LoRa.begin(433.175E6);
LoRa.setSpreadingFactor(7); // SF7 برای تأخیر کم
LoRa.setSignalBandwidth(250E3); // BW250 سریعتر
LoRa.setTxPower(17);
}
void loop() {
int16_t ax,ay,az,gx,gy,gz;
mpu.getMotion6(&ax,&ay,&az,&gx,&gy,&gz);
// زاویه Pitch (جلو/عقب) و Roll (چپ/راست):
float pitch = atan2(-ax, sqrt((long)ay*ay+(long)az*az)) * 180/M_PI;
float roll = atan2(ay, az) * 180/M_PI;
// تبدیل به فرمان:
char cmd = 'S';
if(pitch < -15) cmd = 'F'; // جلو
else if(pitch > 15) cmd = 'B'; // عقب
else if(roll < -20) cmd = 'L'; // چپ
else if(roll > 20) cmd = 'R'; // راست
LoRa.beginPacket();
LoRa.write(cmd);
LoRa.write((int8_t)constrain(abs(pitch),0,90)); // سرعت
LoRa.endPacket();
delay(50); // 20Hz
}
کد RX — UGV
#include <LoRa.h>
const int L_F=6,L_B=7,R_F=8,R_B=9;
const int ENA=10, ENB=11;
unsigned long lastCmd;
void setup() {
LoRa.begin(433.175E6);
LoRa.setSpreadingFactor(7);
LoRa.setSignalBandwidth(250E3);
int pins[]={L_F,L_B,R_F,R_B};
for(int p:pins) { pinMode(p,OUTPUT); }
pinMode(ENA,OUTPUT); pinMode(ENB,OUTPUT);
}
void loop() {
int sz = LoRa.parsePacket();
if(sz >= 2) {
char cmd = LoRa.read();
int spd = map(LoRa.read(), 0, 90, 100, 255);
lastCmd = millis();
analogWrite(ENA, spd); analogWrite(ENB, spd);
if(cmd=='F') { digitalWrite(L_F,1);digitalWrite(L_B,0);digitalWrite(R_F,1);digitalWrite(R_B,0); }
else if(cmd=='B') { digitalWrite(L_F,0);digitalWrite(L_B,1);digitalWrite(R_F,0);digitalWrite(R_B,1); }
else if(cmd=='L') { digitalWrite(L_F,0);digitalWrite(L_B,1);digitalWrite(R_F,1);digitalWrite(R_B,0); }
else if(cmd=='R') { digitalWrite(L_F,1);digitalWrite(L_B,0);digitalWrite(R_F,0);digitalWrite(R_B,1); }
else { digitalWrite(L_F,0);digitalWrite(L_B,0);digitalWrite(R_F,0);digitalWrite(R_B,0); }
}
// Failsafe
if(millis()-lastCmd > 300) { digitalWrite(L_F,0);digitalWrite(L_B,0);digitalWrite(R_F,0);digitalWrite(R_B,0); }
}
چکلیست تست
| تست | نتیجه |
|---|---|
| دست را ۱۵° جلو → UGV جلو؟ | ☐ |
| دست صاف → توقف؟ | ☐ |
| Failsafe در ۳۰۰ms توقف؟ | ☐ |
| در ۱۰۰ متر فاصله کار میکند؟ | ☐ |