ریموت کنترلر دوربرد با ماژول LoRa و آردوینو
برای کنترل رباتها، ماشینهای کنترلی یا پهپادها، معمولا اولین گزینههایی که به ذهن میرسه وایفای یا بلوتوثه؛ اما مشکل بزرگ این تکنولوژیها، برد کوتاه و مصرف انرژی بالاشونه. ساخت یه ریموت کنترلر دستساز که بتونه تا فاصله چند کیلومتری، بدون نیاز به اینترنت و با کمترین مصرف باتری کار کنه، دقیقا همون چیزیه که برای پروژههای حرفهای نیاز داری.
تیم آیسیمدار تو این آموزش صفر تا صد ساخت یه کنترلر رادیویی خفن بر پایه تکنولوژی LoRa رو بهت یاد میده. این تکنولوژی که مخفف Long Range هست، دقیقا برای ارسال داده تو فواصل طولانی طراحی شده. ما از ماژول قدرتمند RYLR998 استفاده میکنیم که خیلی راحت با دستورات متنی (AT Commands) کار میکنه و راهاندازیش با آردوینو به شدت سادهست.
برای اینکه پروژهمون شبیه یه محصول تجاری و جذاب بشه، یه قاب سهبعدی ارگونومیک هم براش طراحی کردیم که دو تا جویاستیک و یه نمایشگر OLED رو تو خودش جا میده. پس قطعاتت رو آماده کن تا با هم این ریموت کنترلر دوربرد و جذاب رو بسازیم.
- یه فرستنده خوشدست با قاب سهبعدی و نمایشگر OLED
- یه گیرنده برای کنترل بیدرنگ (Real-time) موتورها و سرووها
- ارتباط رادیویی پایدار با برد تئوری 10 کیلومتر تو فضای باز
- نحوه کارکرد تکنولوژی LoRa و برتری اون نسبت به وایفای و بلوتوث تو مسافتهای طولانی
- سیمکشی و راهاندازی ماژول RYLR998 با دستورات ساده AT
- ساخت مدار روی برد سوراخدار و جا دادن قطعات داخل قاب سهبعدی
- صفر تا صد کدنویسی فرستنده و گیرنده تو محیط نرمافزار آردوینو
قطعات موردنیاز
- برد آردوینو نانو
- ماژول لورا Reyax RYLR998 (2 عدد)
- نمایشگر OLED سایز 0.96 اینچ
- ماژول جویاستیک (2 عدد)
- باتری لیتیوم یون 18650 (2 عدد) به همراه جاباتری
- برد آردوینو اونو
- شیلد درایور موتور L293D
- قاب و دکمههای پرینت سهبعدی شده
طراحی بدنه و پرینت سهبعدی قاب
چیزی که این پروژه رو از یه مدار ساده و بههمریخته روی بردبورد متمایز میکنه، بدنه و طراحی ظاهری جذابشه.
به جای اینکه همه سیمها و قطعات رو تو یه جعبه پلاستیکی آماده بچپونیم، یه قاب اختصاصی دو تکه (پایه و درپوش) طراحی کردیم که همه قطعات خیلی تمیز و فیکس داخلش جا بگیرن. دو تا جویاستیک تو دو طرف قرار میگیرن، نمایشگر OLED دقیقا وسط قاب میشینه و فضای کافی برای آردوینو نانو، برد سوراخدار و باتریهای 18650 هم در نظر گرفته شده.
طراحی این قاب کاملا ارگونومیکه و جای انگشتها تو دو طرفش تعبیه شده تا دقیقا مثل یه ریموت کنترلر واقعی تو دستت جا بگیره. برای پرینت قطعات میتونی از این تنظیمات استفاده کنی:
- فیلامنت: PLA سفید
- تراکم (Infill): 10 درصد
- ساپورت (Support): نیازی نیست
- ارتفاع لایه (Layer Height): 0.2 میلیمتر
تراکم 10 درصدی برای این قاب کاملا کافیه؛ چون هم وزن نهایی رو پایین نگه میداره و هم استحکام لازم رو برای استفادههای روزمره بهت میده.
تکنولوژی LoRa چیه و چرا ماژول RYLR998؟
اول از همه، قبل از اینکه دست به هویه بشیم، بهتره با تکنولوژی بیسیمی که قلب تپنده این کنترلره (یعنی لورا) بیشتر آشنا بشیم.
کلمه LoRa مخفف Long Range یا همون دوربرده. این تکنولوژی برای ارسال بستههای دیتای کوچیک تو فواصل خیلی طولانی با کمترین مصرف انرژی طراحی شده. این دقیقا همون چیزیه که برای یه ریموت کنترلر بهش نیاز داریم؛ چون ما فقط میخوایم وضعیت دکمهها و جویاستیکها رو بفرستیم، نه دیتای سنگینی مثل صدا یا تصویر.
ما برای این پروژه ماژول Reyax RYLR998 رو انتخاب کردیم چون کار باهاش به شدت راحته و پایداری بالایی داره. این ماژول از دستورات AT بر بستر پورت سریال (UART) پشتیبانی میکنه. یعنی به جای درگیر شدن با کتابخونههای پیچیده رادیویی و سیمکشیهای سخت، میتونی با ارسال یه متن ساده مثل AT+SEND، دیتا رو بفرستی و بقیه کارهای پیچیده رو خود ماژول انجام میده.
از ویژگیهای خفن RYLR998 میشه به برد بالا، مصرف برق پایین و داشتن آنتن داخلی اشاره کرد که باعث میشه ظاهر پروژه خیلی تمیزتر بشه و دردسر کمتری داشته باشه. چون ولتاژ کاری این ماژول 3.3 ولت هست، برای اتصالش به آردوینو 5 ولتی، از یه مدار مقسم ولتاژ (Voltage Divider) ساده روی پین TX استفاده کردیم. در کل، این ماژول یکی از بهترین و بیدردسرترین انتخابها برای ساخت یه کنترلر رادیویی بیسیمه.
مونتاژ و سیمکشی فرستنده
حالا رسیدیم به بخش جذاب ماجرا؛ جایی که قراره همه قطعات کنار هم قرار بگیرن. قبل از شروع سیمکشی، بیا خیلی سریع منطق کارکرد سیستم رو بررسی کنیم تا نقشه مدار برات واضحتر بشه.
بخش فرستنده، وضعیت هر دو جویاستیک (محورهای X و Y و دکمهها) رو میخونه، اونها رو تو یه بسته دیتای کوچیک (String) جمع میکنه و با استفاده از دستور ساده AT+SEND، از طریق ماژول لورا میفرسته. بخش گیرنده هم این بسته رو دریافت میکنه و از اون مقادیر برای کنترل موتورها و سرووها استفاده میکنه. کل داستان همینه!
دو تا آردوینو و دو تا ماژول RYLR998 که از طریق امواج لورا با هم حرف میزنن. حالا بریم سراغ ساخت مدار فرستنده. اول: برش برد سوراخدار
برای شروع، باید برد سوراخدارت رو دقیقا بر اساس این ابعاد برش بزنی:
- Top margin: 10 mm
دوم: نصب جویاستیکها
وقتی بردت آماده شد، پیچهای M3 رو از سوراخهایی که سمت چپ و راست برد ایجاد کردی رد کن. این سوراخها برای نصب جویاستیکها هستن.
هر ماژول جویاستیک رو روی پیچها قرار بده و از زیر با مهره و پیچگوشتی محکمشون کن. حواست باشه که جویاستیکها کاملا تراز و سفت بشن، چون موقع بازی و استفاده فشار زیادی بهشون وارد میشه. سوم: سوار کردن آردوینو نانو
حالا پینهدرهای مادگی رو تو بخش وسط برد قرار بده و لحیم کن. بعدش آردوینو نانو رو روی این پینهدرها سوار کن. استفاده از پینهدر مادگی به جای لحیم کردن مستقیم آردوینو خیلی کار هوشمندانهایه؛ چون اگه بعدا خواستی آردوینو رو عوض کنی یا جداگانه پروگرامش کنی، خیلی راحت از جاش درمیاد.
چهارم: سیمکشی قطعات طبق نقشه
حالا با توجه به نقشه مداری که برات گذاشتیم، تمام اتصالات رو با دقت و حوصله لحیم کن.
نکته خیلی مهم: مدار مقسم ولتاژ
این یکی از همون نکاتیه که خیلیها نادیدهاش میگیرن و قطعاتشون میسوزه! آردوینو نانو با ولتاژ 5 ولت کار میکنه، یعنی پین TX اون سیگنال 5 ولتی میفرسته. اما ماژول لورا با ولتاژ 3.3 ولت کار میکنه و اگه 5 ولت رو مستقیم به پین RX اون وصل کنی، احتمالا برای همیشه باهاش خداحافظی میکنی.
راهحل چیه؟ استفاده از یه مدار مقسم ولتاژ ساده با دو تا مقاومت: با مقاومتهای 10 و 22 کیلواهم، ولتاژ خروجی حدود 3.44 ولت میشه که برای ماژول لورا کاملا ایمنه. تو فقط برای مسیر پین TX آردوینو به پین RX ماژول لورا به این مدار نیاز داری.
مسیر برگشت (یعنی پین TX لورا به پین RX آردوینو) نیازی به مقاومت نداره، چون آردوینو سیگنال 3.3 ولت رو به درستی تشخیص میده. مرحله آخر: مونتاژ نهایی داخل قاب
وقتی تمام لحیمکاریها و سیمکشیها تموم شد، یه تست سریع بگیر. آردوینو رو با کابل USB روشن کن، سریال مانیتور رو باز کن و ببین آیا ماژول لورا به دستورات AT جواب OK میده یا نه.
اگه همهچیز ردیف بود، برد آماده رو با احتیاط داخل پایه قاب قرار بده. سر جویاستیکها باید از سوراخهای دو طرف بیرون بزنن، نمایشگر OLED دقیقا تو جایگاه وسطش بشینه و کلید کشویی هم با شیارش تراز بشه.
در نهایت درپوش رو بذار و پیچهاش رو ببند. ایول! سختافزار بخش فرستندهات با موفقیت آماده شد.
آپلود کدهای آردوینو
حالا که سختافزار کامل شده، وقتشه که با نوشتن کدها به این کنترلر جون بدیم.
کتابخونههای مورد نیاز
قبل از آپلود کد، باید یه کتابخونه مهم رو تو نرمافزار آردوینو نصب کنی. از منوی Sketch به مسیر Include Library برو و Manage Libraries رو باز کن. حالا این مورد رو جستجو و نصب کن:
- کتابخونه U8g2 نوشته olikraus: این کتابخونه برای راهاندازی نمایشگر OLED استفاده میشه. دلیل اینکه از کتابخونه معروف Adafruit استفاده نکردیم اینه که چیپ نمایشگر ما SH1106 هست و کتابخونه U8g2 به بهترین شکل ازش پشتیبانی میکنه.
کدهای برنامه فرستنده
/*
* ============================================================
* Code by: Shahbaz Hashmi Ansari
* LoRa RC TRANSMITTER — Arduino Nano
* Reyax RYLR998 LoRa Module (915MHz, AT Commands)
* Dual Analog Joystick + 0.96" SH1106 OLED (I2C)
* 3D Printed Custom Enclosure + 2x 18650 Battery
* ============================================================
*/
#include <SoftwareSerial.h>
#include <U8g2lib.h>
#include <Wire.h>
SoftwareSerial loraSerial(2, 3);
U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
#define JOY_L_X A0
#define JOY_L_Y A1
#define JOY_R_X A2
#define JOY_R_Y A3
#define JOY_L_BTN 4
#define JOY_R_BTN 5
#define DEAD_ZONE 60
unsigned long lastSend = 0;
unsigned long lastDisplay = 0;
unsigned long txCount = 0;
bool loraOK = false;
char payload[32];
char loraCmd[64];
char buf[22];
void sendAT(const char* cmd, int waitMs = 300) {
loraSerial.println(cmd);
delay(waitMs);
while (loraSerial.available()) loraSerial.read();
}
bool sendATCheck(const char* cmd, int waitMs = 500) {
loraSerial.println(cmd);
delay(waitMs);
char resp[20] = "";
int i = 0;
while (loraSerial.available() && i < 19)
resp[i++] = loraSerial.read();
return strstr(resp, "+OK") != NULL;
}
const char* getDir(int x, int y) {
bool fwd = y < (512 - DEAD_ZONE);
bool bwd = y > (512 + DEAD_ZONE);
bool lft = x < (512 - DEAD_ZONE);
bool rgt = x > (512 + DEAD_ZONE);
if (fwd && lft) return "FWD-L";
if (fwd && rgt) return "FWD-R";
if (bwd && lft) return "BWD-L";
if (bwd && rgt) return "BWD-R";
if (fwd) return "FWD";
if (bwd) return "BWD";
if (lft) return "LEFT";
if (rgt) return "RIGHT";
return "IDLE";
}
// ── Splash ──
void showSplash() {
u8g2.firstPage();
do {
u8g2.drawRBox(0, 0, 128, 26, 4);
u8g2.setDrawColor(0);
u8g2.setFont(u8g2_font_7x13B_tr);
u8g2.drawStr(8, 10, "roboattic Lab");
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(22, 22, "x REYAX");
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(10, 38, "LoRa RC Controller");
u8g2.drawStr(22, 50, "RYLR998 Module");
u8g2.drawHLine(0, 55, 128);
u8g2.setFont(u8g2_font_5x7_tr);
u8g2.drawStr(18, 63, "Initializing...");
} while (u8g2.nextPage());
delay(2500);
}
// ── LoRa Status Screen ──
void showLoraStatus() {
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(0, 10, "Module Status");
u8g2.drawHLine(0, 13, 128);
u8g2.setFont(u8g2_font_6x10_tr);
if (loraOK) {
u8g2.drawStr(0, 26, "\x10 RYLR998 [OK]");
} else {
u8g2.drawStr(0, 26, "! RYLR998 [FAIL]");
}
u8g2.drawStr(0, 38, " Addr : 1");
u8g2.drawStr(0, 48, " Net : 6");
u8g2.drawStr(0, 58, " Band : 915 MHz");
} while (u8g2.nextPage());
delay(2000);
}
// ── Draw mini joystick crosshair ──
void drawJoyCross(int cx, int cy, int jx, int jy) {
u8g2.drawFrame(cx, cy, 14, 14);
u8g2.drawHLine(cx, cy + 7, 14);
u8g2.drawVLine(cx + 7, cy, 14);
int dx = map(jx, 0, 1023, 1, 13);
int dy = map(jy, 0, 1023, 1, 13);
u8g2.drawBox(cx + dx - 1, cy + dy - 1, 3, 3);
}
// ── Main HUD — Clean product-like UI ──
void updateHUD(int speed, int steer, const char* lDir, const char* rDir,
bool lBtn, bool rBtn, int rawLX, int rawLY, int rawRX, int rawRY) {
u8g2.firstPage();
do {
u8g2.drawBox(0, 0, 128, 11);
u8g2.setDrawColor(0);
u8g2.setFont(u8g2_font_5x7_tr);
u8g2.drawStr(2, 8, "LORA RC TX");
snprintf(buf, sizeof(buf), "#%lu", txCount);
u8g2.drawStr(128 - (strlen(buf) * 5) - 2, 8, buf);
u8g2.setDrawColor(1);
u8g2.drawVLine(64, 11, 42);
// ══════ LEFT PANEL — DRIVE ══════
u8g2.setFont(u8g2_font_5x7_tr);
u8g2.drawStr(2, 20, "DRIVE");
u8g2.drawHLine(2, 22, 26);
// Direction label (bold)
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(2, 33, lDir);
// Speed bar
u8g2.setFont(u8g2_font_5x7_tr);
u8g2.drawStr(2, 42, "SPD");
u8g2.drawFrame(20, 36, 26, 7);
u8g2.drawBox(20, 36, map(speed, 0, 100, 0, 26), 7);
snprintf(buf, sizeof(buf), "%d%%", speed);
u8g2.drawStr(48, 42, buf);
// Mini joystick visualizer (left)
drawJoyCross(48, 18, rawLX, rawLY);
// ══════ RIGHT PANEL — STEER ══════
u8g2.setFont(u8g2_font_5x7_tr);
u8g2.drawStr(68, 20, "STEER");
u8g2.drawHLine(68, 22, 30);
// Direction label
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(68, 33, rDir);
// Steer bar (center-origin: left/right from midpoint)
u8g2.setFont(u8g2_font_5x7_tr);
u8g2.drawStr(68, 42, "STR");
u8g2.drawFrame(86, 36, 26, 7);
u8g2.drawVLine(99, 36, 7); // center mark
if (steer > 0)
u8g2.drawBox(99, 36, map(steer, 0, 100, 0, 13), 7);
else if (steer < 0)
u8g2.drawBox(99 + map(steer, 0, -100, 0, -13), 36,
map(abs(steer), 0, 100, 0, 13), 7);
// Mini joystick visualizer (right)
drawJoyCross(114, 18, rawRX, rawRY);
// ══════ BOTTOM STATUS BAR ══════
u8g2.drawHLine(0, 53, 128);
u8g2.setFont(u8g2_font_5x7_tr);
// Button indicators
u8g2.drawStr(2, 63, "L");
if (lBtn)
u8g2.drawBox(10, 56, 8, 7);
else
u8g2.drawFrame(10, 56, 8, 7);
u8g2.drawStr(22, 63, "R");
if (rBtn)
u8g2.drawBox(30, 56, 8, 7);
else
u8g2.drawFrame(30, 56, 8, 7);
// TX indicator
u8g2.drawStr(100, 63, "TX");
u8g2.drawDisc(118, 59, 3);
} while (u8g2.nextPage());
}
void setup() {
Serial.begin(9600);
loraSerial.begin(9600);
pinMode(JOY_L_BTN, INPUT_PULLUP);
pinMode(JOY_R_BTN, INPUT_PULLUP);
u8g2.begin();
showSplash();
Serial.println(F("================================="));
Serial.println(F(" LoRa RC TX - roboattic Lab"));
Serial.println(F("================================="));
delay(500);
loraOK = sendATCheck("AT");
Serial.println(loraOK ? F("RYLR998: OK!") : F("RYLR998: FAIL!"));
sendAT("AT+ADDRESS=1");
sendAT("AT+NETWORKID=6");
sendAT("AT+BAND=915000000");
sendAT("AT+CRFOP=22");
Serial.println(F("Addr:1 Net:6 915MHz 22dBm"));
showLoraStatus();
Serial.println(F("Transmitting..."));
}
void loop() {
analogRead(JOY_L_X); delay(1); int rawLX = analogRead(JOY_L_X);
analogRead(JOY_L_Y); delay(1); int rawLY = analogRead(JOY_L_Y);
analogRead(JOY_R_X); delay(1); int rawRX = analogRead(JOY_R_X);
analogRead(JOY_R_Y); delay(1); int rawRY = analogRead(JOY_R_Y);
bool lBtn = (digitalRead(JOY_L_BTN) == LOW);
bool rBtn = (digitalRead(JOY_R_BTN) == LOW);
int corrLX = 1023 - rawLY;
int corrLY = 1023 - rawLX;
int corrRX = 1023 - rawRY;
int corrRY = 1023 - rawRX;
int lxOut = map(corrLX, 0, 1023, 0, 255);
int lyOut = map(1023 - corrLY, 0, 1023, 0, 255);
int rxOut = map(corrRX, 0, 1023, 0, 255);
int ryOut = map(1023 - corrRY, 0, 1023, 0, 255);
const char* lDir = getDir(corrLX, corrLY);
const char* rDir = getDir(corrRX, corrRY);
int speed = map(abs(lyOut - 127), 0, 127, 0, 100);
int steer = map(rxOut, 0, 255, -100, 100);
if (millis() - lastSend >= 150) {
lastSend = millis();
txCount++;
snprintf(payload, sizeof(payload), "%d,%d,%d,%d,%d,%d",
lxOut, lyOut, rxOut, ryOut,
lBtn ? 1 : 0, rBtn ? 1 : 0);
snprintf(loraCmd, sizeof(loraCmd), "AT+SEND=2,%d,%s",
strlen(payload), payload);
while (loraSerial.available()) loraSerial.read();
loraSerial.println(loraCmd);
if (txCount % 5 == 0) {
Serial.print(F("TX >> ")); Serial.println(payload);
}
}
// ── Update OLED every 150ms ──
if (millis() - lastDisplay >= 150) {
lastDisplay = millis();
updateHUD(speed, steer, lDir, rDir, lBtn, rBtn,
corrLX, corrLY, corrRX, corrRY);
}
}
نحوه آپلود کد روی برد
برای آپلود کد، قدمبهقدم این کارها رو انجام بده:
- آردوینو نانو رو با کابل به سیستم وصل کن.
- کدهای بالا رو تو نرمافزار آردوینو کپی کن.
- از منوی Tools بخش Board، گزینه Arduino Nano رو انتخاب کن.
- تو بخش Processor (اگه نیاز بود) گزینه ATmega328P (Old Bootloader) رو بزن.
- پورت COM مربوط به آردوینو رو انتخاب کن.
- دکمه Upload رو بزن.
- صبر کن تا پیام Done uploading رو پایین صفحه ببینی.
بعد از اینکه کد آپلود شد، سریال مانیتور (Serial Monitor) رو باز کن و سرعت (Baud rate) رو روی 9600 تنظیم کن. باید یه همچین پیامی رو ببینی:
=================================
LoRa RC TX - RoboAtticLab
=================================
RYLR998: OK!
Address: 1 Net: 6 915MHz 22dBm
Transmitting...
TX >> 127,255,127,127,0,0
اگه پیام OK+ رو دیدی، یعنی ماژول لورا به درستی سیمکشی شده و همهچیز برای کار آمادهست.
ساخت بخش گیرنده سیستم
طراحی گیرنده رو تو این پروژه خیلی ساده و پایه در نظر گرفتیم. هدفمون فقط اینه که بهت نشون بدیم ارتباط بیسیم لورا به درستی کار میکنه و میتونه موتورها و قطعات واقعی رو حرکت بده.
برای گیرنده، از یه برد آردوینو اونو، یه شیلد درایور موتور L293D و یه ماژول لورا RYLR998 استفاده کردیم. سیمکشی ماژول لورا دقیقا مثل فرستندهست: پین VDD به 3.3 ولت، پین GND به GND، پین TX به پین D2 و پین RX هم از طریق همون مقسم ولتاژی که یاد گرفتی به D3 وصل میشه. دو تا موتور گیربکسدار رو به خروجی موتورهای شیلد و یه سروو موتور هم به پین مخصوص سروو وصل کن.
برنامه گیرنده به این صورته که هر زمان دیتایی از فرستنده بیاد، آردوینو مقادیر جویاستیک رو میخونه و موتورها و سرووها رو بر اساس اون میچرخونه. برای ایمنی بیشتر، یه تایمر 500 میلیثانیهای هم تو کدها گذاشتیم تا اگه یه موقع سیگنال قطع شد، موتورها به طور خودکار خاموش بشن و رباتت فرار نکنه!
این مدار ساده برای تست اولیه عالیه، اما تو میتونی اون رو برای پروژههای خفنتری مثل ماشین کنترلی، قایق یا حتی پهپاد توسعه بدی.
تست نهایی و جمعبندی
به همین سادگی، کنترلر رادیویی دوربرد تو آماده شد! حالا برو تو فضای باز و تا جایی که میتونی از گیرنده دور شو. اینجاست که تازه متوجه میشی این ماژول کوچیک چقدر قدرتمند و فوقالعادهست.
چیزی که به عنوان یه تست ساده ارتباط بیسیم شروع شد، به لطف قاب پرینت سهبعدی و نمایشگر OLED، تبدیل به یه ریموت کنترلر حرفهای شد. بهترین قسمتش هم این بود که ماژول لورا تمام دیتای ارتباطی رو بدون کوچیکترین باگ یا قطعی مدیریت کرد. ویدیوی عملکرد پروژه رو میتونی تو همین بخش ببینی.
تیم آیسیمدار همیشه از دیدن خلاقیتهای شما لذت میبره. اگه این کنترلر رو ساختی، حتما تو بخش نظرات برامون عکس بفرست؛ مخصوصا اگه ازش برای کنترل رباتهای دیگه استفاده کردی، قابش رو شخصیسازی کردی یا کدهای جدیدی بهش اضافه کردی. اگه تو مراحل ساخت جایی گیر کردی یا سوالی داشتی، تو کامنتها بپرس تا خیلی زود راهنماییت کنیم.
راستی، حتما تو کامنتها برامون بنویس که دوست داری با این ریموت کنترلر چه دستگاهی رو کنترل کنی؛ ماشین کنترلی، پهپاد یا قایق. ایدههات رو به اشتراک بذار تا شاید پروژه بعدی آیسیمدار بر اساس پیشنهاد تو باشه. خوشحال میشیم این آموزش رو برای دوستای الکترونیککارت هم بفرستی. امیدواریم از ساخت این کنترلر حرفهای لذت برده باشی!
تو میتونی اولین سازنده باشی!
اگه پروژه رو ساختی به اشتراک بزار و اعتبار هدیه بگیر
این آموزش با استانداردهای اختصاصی آیسیمدار بازنویسی و بهینهسازی شده و تمامی حقوق انتشار آن متعلق به این مجموعه است و در صورت کپی یا بازنشر پیگرد قانونی خواهد داشت.








































گفتگوهای کاربران
هنوز نظری ثبت نشده؛ تو شروع کن!
هنوز نظری ثبت نشده؛ تو شروع کن!