ماشین کنترلی وایفای با هدایت ژیروسکوپ موبایل
ماشینهای کنترلی همیشه جذابن، اما وقتی بتونی اونها رو با حرکت دادن گوشیت (سنسور ژیروسکوپ) کنترل کنی، همهچیز خیلی هیجانانگیزتر میشه! انگار که یه فرمان واقعی تو دستت گرفتی و با چرخوندنش، ماشین به چپ و راست میپیچه. تو این پروژه قراره یه ماشین رباتیک بسازیم که هم با دکمههای معمولی روی موبایل و هم با تکون دادن گوشی هدایت میشه.
مغز متفکر این مدار، برد قدرتمند و جمعوجور ESP32 هست که از طریق وایفای به موبایلت متصل میشه و دستورات حرکتی رو با سرعت بالا دریافت میکنه. برای اینکه ماشینمون ظاهر حرفهای و مرتبی داشته باشه، شاسی و قطعات بدنه رو با پرینتر سهبعدی میسازیم.
پس اگه دوست داری یه گجت کنترلی مدرن و بیسیم برای خودت بسازی، قطعات و ابزارها رو روی میز کارت بچین تا تو آیسیمدار قدمبهقدم بریم سراغ مونتاژ و راهاندازی این پروژه فوقالعاده.
آمادهسازی قطعات بدنه با چاپ سهبعدی
بدنه این ماشین رباتیک از چند قطعه پلاستیکی ساده تشکیل شده که با پرینتر سهبعدی ساخته میشن. این قطعات طوری طراحی شدن که موتورها، چرخها و مدار الکترونیکی رو خیلی محکم و تمیز کنار هم نگه دارن تا ماشین تو حرکتهای سریع تعادلش رو از دست نده. قطعات اصلی که نیاز داریم اینها هستن:
- شاسی اصلی ماشین: این قطعه همون اسکلت اصلی رباته که موتورها، برد ESP32 و باتری روش سوار میشن.
- گیره موتورها: برای اینکه موتورها سفت و محکم سر جای خودشون روی شاسی قفل بشن و تکون نخورن.
این قطعات تو محیط Tinkercad طراحی شدن و میتونی خیلی راحت با فیلامنت PLA اونا رو روی هر پرینتر سهبعدی معمولی چاپ کنی. وقتی کار پرینت تموم شد، لبههای اضافی رو یه کم تمیز کن و قبل از مونتاژ، مطمئن شو که موتورها و چرخها بهخوبی سر جاشون چفت میشن. حالا که بدنه آمادهست، میتونیم بریم سراغ نصب قطعات.
نکاتی برای تهیه شاسی ربات
برای این پروژه از یه شاسی اختصاصی استفاده کردیم که باید چاپ سهبعدی بشه. اما اگه خودت پرینتر سهبعدی نداری، اصلا جای نگرانی نیست؛ میتونی خیلی راحت فایلهای طراحی رو به شرکتهای خدمات چاپ سهبعدی بدی تا برات بسازنش.
استفاده از شاسیهای آماده بازار هم ممکنه، اما وقتی خودت قطعات رو پرینت بگیری، دستت برای تغییرات بازتره و میتونی دقیقا جای پیچها و ابعاد رو مطابق با قطعات الکترونیکی خودت شخصیسازی کنی.
روند کار هم خیلی سادهست. کافیه فایلهای STL پروژه رو دانلود کنی و بفرستی برای پرینت. معمولا متریالهایی مثل PLA برای ساخت شاسی رباتها هم مقاومت خوبی دارن و هم از نظر وزن سبک هستن.
ما تو این پروژه از فیلامنت PLA استفاده کردیم، ولی تو میتونی بسته به سلیقه خودت رنگ و جنس دیگهای رو انتخاب کنی. مراحل کلی کار به این صورته:
- دانلود فایلهای سهبعدی شاسی
- انتخاب یه خدماتدهنده پرینت سهبعدی مطمئن
- ارسال فایلها و انتخاب تکنولوژی چاپ (مثل FDM)
- تعیین رنگ و جنس فیلامنت
- تأیید تنظیمات تراکم (Infill) برای استحکام بیشتر
- تحویل گرفتن قطعات آماده و تمیز کردن لبهها
- شروع مونتاژ فیزیکی ماشین
بعد از آماده شدن شاسی، بریم سراغ بخش هیجانانگیز یعنی وصل کردن موتورها!
مونتاژ موتورها، چرخها و شاسی
- اول به ترمینالهای هر موتور گیربکسدار دو تا سیم لحیم کن. حواست باشه لحیمکاری تمیز و محکم باشه و سیمها اونقدر بلند باشن که راحت به درایور موتور برسن.
- حالا موتورها رو داخل گیرههای چاپ سهبعدی قرار بده؛ طوری که بدنه موتور کاملا کیپ هولدر بشه.
- گیرهها رو (که موتورها داخلشون هستن) تو شیارهای مخصوص روی شاسی جا بزن. دقت کن که شفت موتورها حتما به سمت بیرون ماشین باشه تا چرخها روشون نصب بشن.
- برای اینکه همهچیز سفت و محکم بشه، یه مقدار چسب حرارتی دور گیرهها بزن تا روی شاسی فیکس بشن.
- چرخها رو روی شفت موتورها فشار بده تا کاملا سفت بشن و سر جای خودشون قرار بگیرن.
- حالا یه بردبورد کوچیک رو با استفاده از چسب دوطرفه روی شاسی بچسبون. یه کم فشارش بده تا خیالت راحت بشه کنده نمیشه.
- ماژول درایور موتور رو هم تو یه سمت بردبورد قرار بده و با یه قطره چسب حرارتی محکمش کن.
- در نهایت، سیمهای موتور رو به ترمینالهای خروجی درایور موتور وصل کن و پیچهاشون رو سفت کن تا سیمها در نرن.
سیمکشی قطعات الکترونیکی و برد
بریم سراغ بخش جذاب ماجرا! حالا باید قطعات الکترونیکی رو دقیقا طبق نقشه به هم وصل کنیم.
1. اتصال درایور موتور
درایور موتور L298N وظیفه داره سرعت و جهت حرکت چرخها رو کنترل کنه. پایههای این ماژول رو باید به پینهای برد ESP32 وصل کنی:
- پایه ENA به پین D6
- پایه IN1 به پین D7
- پایه IN2 به پین D8
- پایه ENB به پین D9
- پایه IN3 به پین D10
- پایه IN4 به پین D0
سیمهای موتوری هم که قبلا لحیم کرده بودی، باید الان تو ترمینالهای خروجی درایور موتور L298N پیچ شده باشن.
2. اتصالات منبع تغذیه
برای روشن کردن برد XIAO ESP32-S3 از یه باتری لیتیومپلیمر 3.7 ولتی استفاده میکنیم که مستقیم به کانکتور باتری روی خود برد وصل میشه. خبر خوب اینه که این میکروکنترلر سیستم مدیریت شارژ داخلی داره و میتونی هر وقت باتری ضعیف شد، راحت با کابل تایپسی شارژش کنی.
از طرفی، درایور موتور برق خودش رو از یه پک باتری خارجی (مثل دو تا باتری 18650) میگیره تا زور کافی برای چرخوندن موتورها رو داشته باشه.
نکته خیلی مهم: حتما مطمئن شو که پین گراند (GND) برد ESP32 و درایور موتور به هم وصل باشن تا کل مدار یک گراند مشترک و یکپارچه داشته باشه.
وقتی تمام اتصالات رو انجام دادی، یه بار دیگه همهچیز رو با دقت چک کن تا اشتباهی نشده باشه. اگه سیمکشیها درست بود، میتونیم بریم سراغ آپلود کدها.
آپلود کدهای برنامه و تنظیمات شبکه
حالا باید کدهای نرمافزاری رو روی برد XIAO ESP32-S3 آپلود کنیم تا ماشین بتونه از طریق شبکه وایفای، دستورات حرکتی موبایلت رو دریافت و اجرا کنه.
1. نصب نرمافزار آردوینو و پکیج ESP32
- آخرین نسخه نرمافزار Arduino IDE رو روی کامپیوترت نصب کن.
- نرمافزار رو باز کن تا پکیج بردهای ESP32 رو بهش اضافه کنیم.
- برو به مسیر File و بعد Preferences.
- در قسمت Additional Board Manager URLs، این لینک رو وارد کن:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
- حالا برو به مسیر Tools، بخش Board و گزینه Boards Manager رو انتخاب کن.
- کلمه ESP32 رو جستجو و پکیج مربوط به اون رو نصب کن.
2. انتخاب برد و پورت
- دوباره تو نرمافزار آردوینو باید برد خودمون رو مشخص کنیم.
- از منوی Tools و بخش Board برو به ESP32 Arduino و گزینه XIAO ESP32S3 رو انتخاب کن.
- بعدش از قسمت Tools و بخش Port، همون پورتی که برد با کابل بهش وصل شده رو تیک بزن.
3. کپی کردن کدهای پروژه
// --- L298N Motor Driver Pins (Seeed XIAO ESP32-S3) ---
#define ENA 43
#define MOTOR_IN1 44
#define MOTOR_IN2 7
#define ENB 8
#define MOTOR_IN3 9
#define MOTOR_IN4 1
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
int speedCar = 200;
int speed_Coeff = 3;
const char* ssid = "Wifi Car";
WebServer server(80);
void goAhead() {
digitalWrite(MOTOR_IN1, HIGH);
digitalWrite(MOTOR_IN2, LOW);
analogWrite(ENA, speedCar);
digitalWrite(MOTOR_IN3, HIGH);
digitalWrite(MOTOR_IN4, LOW);
analogWrite(ENB, speedCar);
}
void goBack() {
digitalWrite(MOTOR_IN1, LOW);
digitalWrite(MOTOR_IN2, HIGH);
analogWrite(ENA, speedCar);
digitalWrite(MOTOR_IN3, LOW);
digitalWrite(MOTOR_IN4, HIGH);
analogWrite(ENB, speedCar);
}
void goRight() {
digitalWrite(MOTOR_IN1, LOW);
digitalWrite(MOTOR_IN2, HIGH);
analogWrite(ENA, speedCar + 50);
digitalWrite(MOTOR_IN3, HIGH);
digitalWrite(MOTOR_IN4, LOW);
analogWrite(ENB, speedCar);
}
void goLeft() {
digitalWrite(MOTOR_IN1, HIGH);
digitalWrite(MOTOR_IN2, LOW);
analogWrite(ENA, speedCar + 50);
digitalWrite(MOTOR_IN3, LOW);
digitalWrite(MOTOR_IN4, HIGH);
analogWrite(ENB, speedCar);
}
void goAheadRight() {
digitalWrite(MOTOR_IN1, LOW);
digitalWrite(MOTOR_IN2, HIGH);
analogWrite(ENA, speedCar / speed_Coeff);
digitalWrite(MOTOR_IN3, LOW);
digitalWrite(MOTOR_IN4, HIGH);
analogWrite(ENB, speedCar);
}
void goAheadLeft() {
digitalWrite(MOTOR_IN1, LOW);
digitalWrite(MOTOR_IN2, HIGH);
analogWrite(ENA, speedCar);
digitalWrite(MOTOR_IN3, LOW);
digitalWrite(MOTOR_IN4, HIGH);
analogWrite(ENB, speedCar / speed_Coeff);
}
void goBackRight() {
digitalWrite(MOTOR_IN1, HIGH);
digitalWrite(MOTOR_IN2, LOW);
analogWrite(ENA, speedCar / speed_Coeff);
digitalWrite(MOTOR_IN3, HIGH);
digitalWrite(MOTOR_IN4, LOW);
analogWrite(ENB, speedCar);
}
void goBackLeft() {
digitalWrite(MOTOR_IN1, HIGH);
digitalWrite(MOTOR_IN2, LOW);
analogWrite(ENA, speedCar);
digitalWrite(MOTOR_IN3, HIGH);
digitalWrite(MOTOR_IN4, LOW);
analogWrite(ENB, speedCar / speed_Coeff);
}
void stopRobot() {
digitalWrite(MOTOR_IN1, LOW);
digitalWrite(MOTOR_IN2, LOW);
analogWrite(ENA, 0);
digitalWrite(MOTOR_IN3, LOW);
digitalWrite(MOTOR_IN4, LOW);
analogWrite(ENB, 0);
}
// ✅ Command is handled IMMEDIATELY when HTTP request arrives
void HTTP_handleRoot(void) {
if (server.hasArg("State")) {
String command = server.arg("State");
Serial.println(command);
if (command == "F") goAhead();
else if (command == "B") goBack();
else if (command == "L") goLeft();
else if (command == "R") goRight();
else if (command == "I") goAheadRight();
else if (command == "G") goAheadLeft();
else if (command == "J") goBackRight();
else if (command == "H") goBackLeft();
else if (command == "S") stopRobot();
else if (command == "0") speedCar = 100;
else if (command == "1") speedCar = 117;
else if (command == "2") speedCar = 134;
else if (command == "3") speedCar = 151;
else if (command == "4") speedCar = 168;
else if (command == "5") speedCar = 185;
else if (command == "6") speedCar = 204;
else if (command == "7") speedCar = 220;
else if (command == "8") speedCar = 225;
else if (command == "9") speedCar = 300;
}
server.send(200, "text/html", "");
}
void setup() {
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(MOTOR_IN1, OUTPUT);
pinMode(MOTOR_IN2, OUTPUT);
pinMode(MOTOR_IN3, OUTPUT);
pinMode(MOTOR_IN4, OUTPUT);
Serial.begin(115200);
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid);
IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(myIP);
server.on("/", HTTP_handleRoot);
server.onNotFound(HTTP_handleRoot);
server.begin();
}
void loop() {
server.handleClient(); // Only job: listen for incoming requests
}
4. تنظیمات اتصال به وایفای
تو کدهایی که کپی کردی، یه بخش مربوط به تنظیمات وایفای وجود داره:
const char* ssid = "YOUR_WIFI_NAME";
const char* password = "YOUR_WIFI_PASSWORD";
اینجا باید نام شبکه وایفای خونه و رمز عبورش رو جایگزین کنی. دقیقا مثل این الگو:
const char* ssid = "MyHomeWiFi";
const char* password = "mypassword123";
برد ESP32 از طریق این شبکه به موبایلت متصل میشه تا فرمانهای کنترلی ژیروسکوپ رو بخونه و موتورها رو هدایت کنه.
5. آپلود نهایی کدها
- برد رو با یه کابل تایپسی سالم به سیستم وصل کن.
- روی دکمه Upload تو نرمافزار آردوینو کلیک کن.
- صبر کن تا کدها کامپایل بشن و کامل روی میکروکنترلر قرار بگیرن.
وقتی آپلود با موفقیت تموم شد، ماشین کنترلی تو آمادهست تا دستورات حرکتی رو از اپلیکیشن موبایل دریافت کنه و به حرکت دربیاد.
نتیجهگیری و راهاندازی ماشین کنترلی
خسته نباشی! الان دیگه یه ماشین کنترلی وایفای هیجانانگیز داری که هم میتونی با دکمههای روی صفحه موبایل کنترلش کنی و هم با تکون دادن گوشی (مثل فرمان ماشین واقعی) هدایتش کنی. این ترکیب جذاب از سنسور ژیروسکوپ موبایل و ارتباط بیسیم ESP32، حسابی میتونه سرگرمت کنه و یه تجربه رانندگی متفاوت بهت بده.
با ساخت این پروژه، هم کار با موتورها و درایورها رو تمرین کردی و هم با تنظیمات شبکه وایفای تو میکروکنترلرها آشنا شدی. میتونی تو قدمهای بعدی، سنسورهای دیگهای مثل اولتراسونیک هم بهش اضافه کنی تا خودش موانع رو تشخیص بده.
اگه تو مراحل سیمکشی، آپلود کدها یا وصل شدن به اپلیکیشن به مشکلی خوردی، حتما تو بخش نظرات همین پست برامون بنویس تا با هم حلش کنیم. یادت نره این آموزش رو با دوستای عشق رباتیکت هم به اشتراک بذاری. ما تو تیم آیسیمدار همیشه منتظر دیدن پروژههای خلاقانه شما هستیم! ممنون که تا آخر این آموزش با ما همراه بودی. به ساختن و یادگرفتن ادامه بده!
فایلهای پیوست
تو میتونی اولین سازنده باشی!
اگه پروژه رو ساختی به اشتراک بزار و اعتبار هدیه بگیر
این آموزش با استانداردهای اختصاصی آیسیمدار بازنویسی و بهینهسازی شده و تمامی حقوق انتشار آن متعلق به این مجموعه است و در صورت کپی یا بازنشر پیگرد قانونی خواهد داشت.








































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