CC1101 چیست و چرا برای UGV عالی است؟ (مبتدی)
ماژول CC1101 یک ترانسیور (فرستنده-گیرنده) RF زیر ۳ دلار است که روی باندهای Sub-GHz مثل 433MHz، 868MHz و 915MHz کار میکند. این چیپ از تکنولوژی GFSK (Gaussian Frequency Shift Keying) استفاده میکند — یک روش دیجیتال انتقال داده که نسبت به OOK/ASK ساده مقاومت بهتری در برابر نویز دارد.
مزیت اصلی در مقایسه با LoRa: قیمت بسیار پایینتر (۳ دلار در مقابل ۱۰-۱۵ دلار LoRa) و سرعت بالاتر (تا ۵۰۰kbps). برای تلهمتری و کنترل UGV با برد ۵۰۰-۱۰۰۰ متر کاملاً کافی است. اتصال از طریق SPI انجام میشود و کتابخانه ELECHOUSE_CC1101 برای آردوینو آن را خیلی ساده میکند.
محصولی که میسازید
یک لینک دوطرفه CC1101 برای ارسال دستورات RC و دریافت تلهمتری (ولتاژ، سرعت) از UGV.
- هزینه رادیو: ۲ × ۳ دلار = ۶ دلار (زیر ۴۰۰ هزار تومان)
- برد: ۵۰۰-۱۰۰۰ متر با آنتن ساده
- سرعت: ۲۵۰kbps GFSK
قطعات لازم
| قطعه | قیمت تقریبی |
|---|---|
| ماژول CC1101 433MHz × ۲ | ۳ دلار × ۲ |
| Arduino Nano × ۲ | ۵ دلار × ۲ |
| Joystick Module × ۱ | ۱ دلار |
| آنتن سیمی ۱۷۳mm × ۲ | رایگان (سیم) |
سیمبندی CC1101 به Arduino Nano
CC1101 → Arduino Nano
VCC → 3.3V (مهم! CC1101 فقط 3.3V تحمل دارد)
GND → GND
MOSI → D11
MISO → D12
SCK → D13
CSn → D10
GDO0 → D2 (اختیاری - Interrupt)
GDO2 → D3 (اختیاری)
// آنتن λ/4 برای 433MHz:
// طول = 300/433/4 × 1000 = 173mm سیم مستقیم
کد TX (کنترلر جویاستیک)
#include <ELECHOUSE_CC1101_SRC_DRV.h>
const int JX = A0, JY = A1;
byte txBuf[4];
void setup() {
Serial.begin(9600);
ELECHOUSE_cc1101.Init();
ELECHOUSE_cc1101.SetMHZ(433.92); // فرکانس
ELECHOUSE_cc1101.SetModulation(0); // GFSK
ELECHOUSE_cc1101.SetDRate(9.6); // kbps
ELECHOUSE_cc1101.SetTxPower(10); // dBm (حداکثر 12)
}
void loop() {
txBuf[0] = 0xAA; // هدر
txBuf[1] = map(analogRead(JX),0,1023,0,255); // X
txBuf[2] = map(analogRead(JY),0,1023,0,255); // Y
txBuf[3] = txBuf[1] ^ txBuf[2]; // Checksum ساده
ELECHOUSE_cc1101.SendData(txBuf, 4);
delay(50); // 20Hz rate
}
کد RX (روی UGV)
#include <ELECHOUSE_CC1101_SRC_DRV.h>
byte rxBuf[64];
int len;
void setup() {
Serial.begin(9600);
ELECHOUSE_cc1101.Init();
ELECHOUSE_cc1101.SetMHZ(433.92);
ELECHOUSE_cc1101.SetModulation(0);
ELECHOUSE_cc1101.SetDRate(9.6);
ELECHOUSE_cc1101.SetRx(); // حالت دریافت
}
void loop() {
if(ELECHOUSE_cc1101.CheckRxFifo(100)) {
if(ELECHOUSE_cc1101.CheckCRC()) {
len = ELECHOUSE_cc1101.ReceiveData(rxBuf);
if(len>=4 && rxBuf[0]==0xAA) {
int xVal = rxBuf[1]; // 0-255
int yVal = rxBuf[2];
// تبدیل به سرعت موتور
int leftSpeed = map(yVal+xVal/2, 0, 383, -255, 255);
int rightSpeed = map(yVal-xVal/2, 0, 383, -255, 255);
// setMotors(leftSpeed, rightSpeed);
Serial.println("L:" + String(leftSpeed) + " R:" + String(rightSpeed));
}
}
ELECHOUSE_cc1101.SetRx(); // برگشت به Rx
}
}
چکلیست تست
| تست | نتیجه |
|---|---|
| CC1101 روی SPI شناسایی میشود؟ | Version = 0x14 در Serial |
| TX در Serial Monitor RX داده میفرستد؟ | بله در ۵۰ms |
| در ۱۰۰ متر کار میکند؟ | بله |
| RSSI در Serial قابل خواندن است؟ | ELECHOUSE_cc1101.getRSSI() |