ماشین کنترلی ویدیویی با برد ESP32-S3
سلام بچهها! اگر همیشه دوست داشتید یک ماشین کنترلی بسازید که همزمان تصویر رو هم براتون به صورت زنده پخش کنه، این آموزش دقیقا برای شماست. ما تو آیسیمدار قصد داریم با استفاده از میکروکنترلر قدرتمند ESP32-S3، یک ماشین کنترلی دوربیندار جذاب بسازیم. این برد نسبت به نسخههای قبلی خیلی قویتر شده و میتونه ویدیوی روون و بدون تأخیری رو روی گوشی یا لپتاپت استریم کنه.
تو این پروژه، از درایورهای موتور مختلفی استفاده میکنیم تا بتونیم سرعت و مصرف باتری رو بهینهتر کنیم. چه تازهکار باشی و چه یک حرفهای دستبههویه، دو تا مسیر مختلف برای ساخت مدار این ماشین برات در نظر گرفتیم که بتونی با خیال راحت پروژهات رو پیش ببری و رباتت رو شخصیسازی کنی. پس قطعاتت رو آماده کن، هویه رو بزن به برق تا بریم سراغ ساخت این ماشین کنترلی خفن و قدمبهقدم با هم پیش بریم!
قطعات موردنیاز
- ماژول درایور موتور L298N
- ماژول درایور موتور DRV8833
- ماژول کاهنده ولتاژ LM2596
معرفی کلی ماشین دوربیندار ما
همونطور که گفتم، این پروژه در واقع یک نسخه ارتقایافته از ماشینهای کنترلی معمولیه. مغز متفکر این ماشین، برد ESP32-S3 هست که پردازش تصویر رو خیلی سریعتر و روونتر از نسلهای قبلی انجام میده. برای حرکت دادن چرخها هم قراره از درایور موتور DRV8833 استفاده کنیم؛ این درایور هم مصرف انرژی کمتری داره و هم اجازه میده ماشینت به سرعتهای بالاتری برسه.
بررسی شماتیک و انتخاب درایور موتور
روش اول: ساده و سریع (با درایور L298N)
پیشنهاد من اینه که اگر تازه شروع کردی، اول از این روش استفاده کنی. قطعاتش راحتتر به هم وصل میشن و خیلی سریع میتونی ماشینت رو راه بندازی و ازش لذت ببری.
روش دوم: حرفهای و بهینه (با درایور DRV8833)
اما اگر دنبال یک پروژه بهینهتر هستی که موتورها سریعتر بچرخند و البته وقت و حوصله لحیمکاری رو هم داری، این روش عالیه.
درایور DRV8833 از ترانزیستورهای ماسفت (MOSFET) مدرن استفاده میکنه و افت ولتاژش خیلی کمه (حدود 0.2 تا 0.4 ولت). در مقابل، مدل L298N تکنولوژی قدیمیتری داره و حدود 2 تا 4 ولت افت ولتاژ ایجاد میکنه. یعنی با DRV8833 ولتاژ بیشتری به موتورها میرسه، ماشینت کمتر داغ میکنه و باتری هم بیشتر دوام میاره.
البته چون شیلد آمادهای برای این ترکیب تو بازار کم پیدا میشه، باید خودت مدار رو جمع کنی. برای پیادهسازی این مدار میتونی از بردهای سوراخدار معمولی استفاده کنی یا اگر مهارتش رو داری، یک فیبر مدار چاپی (PCB) اختصاصی برای خودت طراحی کنی و بسازی.
انتخاب شاسی مناسب برای ماشین
یکی از خوبیهای این پروژه اینه که دستت کاملا بازه. میتونی از شاسیهای دو چرخ (2WD) یا چهار چرخ (4WD) استفاده کنی؛ مدار ما با هر دو مدل به خوبی کار میکنه.
شاسیهای پیشنهادی
- شاسیهای رباتیک طرح تانک یا شنیدار
- شاسیهای اکریلیک 4 چرخ (موجود در تمام فروشگاههای الکترونیک)
- شاسیهای ساده 2 چرخ به همراه یک چرخ هرزگرد
راهاندازی محیط برنامهنویسی
آمادهسازی و آپلود کدها روی برد
برای برنامهنویسی این برد، کدهای مربوط به ماشین کنترلی رو باید آماده کنی. فایلهای سورس پروژه شامل تنظیمات شبکه، کنترل موتورها و استریم تصویر هستند که باید همگی توی پوشه پروژهات قرار بگیرند.
پیشنهاد میکنم از نرمافزار VS Code و افزونه PlatformIO استفاده کنی. وقتی پوشه پروژه رو با این افزونه باز میکنی، خودش به صورت خودکار تمام کتابخونههای مورد نیاز رو دانلود و نصب میکنه. این روش خیلی بیدردسرتر از Arduino IDE هست و دیگه نگران تداخل نسخهها یا نصب دستی کتابخونهها نیستی.
شخصیسازی تنظیمات و پینها
حالا بریم سراغ تنظیمات! تو میتونی پینهای مربوط به موتورها و دوربین رو داخل فایل Config.h به دلخواه خودت تغییر بدی.
// WiFi credentials
#define WIFI_SSID "YOUR_SSID"
#define WIFI_PWD "YOUR_PASSWORD"
// Access Point mode
// + true = creates a WiFi network without internet connection
// the car IP will always be http://192.168.4.1:8000
// + false = connect to an existing WiFi with internet connection
// the car IP will be assigned by the router http://X.X.X.X:8000
#define WIFI_AP_MODE true
// Set minimum motor speed (0 to 255)
#define MIN_MOTOR_SPEED 80
// Enable debug (prints car speed and direction in the serial)
#define JOYSTICK_DEBUG false
// Set camera model
#define CAMERA_FREENOVE_ESP32S3_CAM
// #define CAMERA_MODEL_XIAO_ESP32S3
// #define CAMERA_MODEL_AI_THINKER
// Set JPEG quality (0 to 63 - lower means higher quality)
// NOTE: Higher image quality reduces CPU usage for compression.
#define JPEG_QUALITY 15
// Improve FPS by using double buffering (usually works perfectly
// for ESP32S3 family)
#define INCREASE_FPS true
// Customize PINS
#if defined(CAMERA_FREENOVE_ESP32S3_CAM)
#define PIN_M1_IN1 42
#define PIN_M1_IN2 41
#define PIN_M2_IN1 40
#define PIN_M2_IN2 39
#define PIN_FRONT_LED 3
#define PIN_RGB_LED 48
// NOTE: higher resolutions affect framerate
#define FRAME_SIZE FRAMESIZE_VGA
#elif defined(CAMERA_MODEL_XIAO_ESP32S3)
#define PIN_M1_IN1 1
#define PIN_M1_IN2 2
#define PIN_M2_IN1 3
#define PIN_M2_IN2 4
#define PIN_FRONT_LED 9
#define PIN_BOARD_LED 7
// NOTE: higher resolutions affect framerate
#define FRAME_SIZE FRAMESIZE_VGA
#elif defined(CAMERA_MODEL_AI_THINKER_V2)
#define PIN_M1_IN1 14
#define PIN_M1_IN2 47
#define PIN_M2_IN1 38
#define PIN_M2_IN2 39
#define PIN_FRONT_LED 40
#define PIN_RGB_LED 48
// NOTE: higher resolutions affect framerate
#define FRAME_SIZE FRAMESIZE_VGA
#elif defined(CAMERA_MODEL_AI_THINKER)
#define PIN_M1_IN1 14
#define PIN_M1_IN2 15
#define PIN_M2_IN1 12
#define PIN_M2_IN2 13
#define PIN_FRONT_LED 3
#define PIN_BOARD_LED 33
// NOTE: higher resolutions affect framerate
#define FRAME_SIZE FRAMESIZE_VGA
#else
#error "Camera model not selected"
#endif
اگر هم خواستی روی سرعت ماشین و رفتار موتورها کنترل دقیقتری داشته باشی، کافیه وارد فایل DCMotor.h بشی و پارامترهای سرعت رو همونطور که دوست داری تنظیم کنی.
#ifndef DCMOTOR_H
#define DCMOTOR_H
#include <Arduino.h>
class DCMotor
{
public:
DCMotor(uint8_t pinIn1, uint8_t pinIn2);
void backward(uint8_t speed = 100);
void forward(uint8_t speed = 100);
void setMinAbsSpeed(uint8_t absSpeed);
void stop();
private:
uint8_t pinIn1;
uint8_t pinIn2;
uint8_t absSpeed = 0;
uint8_t maxAbsSpeed = 255;
uint8_t minAbsSpeed = 50;
uint8_t ignoreAbsSpeed = 30;
void setSpeed(uint8_t speed);
};
#endif
روشهای کنترل ماشین (موس، کیبورد و دسته بازی)
کنترل با موس (جویاستیک مجازی)
به صورت پیشفرض، وقتی وارد صفحه وب ماشین میشی، یک جویاستیک مجازی روی تصویر میبینی که میتونی با موس خیلی راحت ماشین رو به هر سمتی هدایت کنی.
کنترل با کیبورد
اگر کنترل با کیبورد برات راحتتره، فقط کافیه هر زمان که خواستی کلید Enter رو بزنی. برای برگشتن به حالت موس هم دوباره همون Enter رو فشار بده.
- فعال و غیرفعال کردن: کلید Enter
- چپ و راست: کلیدهای A/D یا فلشهای ←/←
- جلو: کلید W یا ↑
- دندهعقب: کلید S یا ↓
- دوربین: کلید P یا C
- روشن کردن الایدیهای جلو: کلید L یا F
- حداکثر سرعت: کلیدهای 1 (سرعت 10) تا 0 (سرعت 100)
کنترل با دسته بازی (گیمپد)
میتونی از یک دسته بازی USB (مثل دستههای سازگار با پلیاستیشن 3) هم استفاده کنی! فقط کافیه دکمه Start رو روی دسته بزنی تا کنترل به گیمپد منتقل بشه.
- فعال و غیرفعال کردن: دکمه Start
- چپ و راست: آنالوگ سمت چپ
- جلو: دکمه R2
- دندهعقب: دکمه L2
- دوربین: دکمه مثلث (△)
- روشن کردن الایدیهای جلو: دکمه مربع (□)
چند نکته مهم درباره باتری و تغذیه
برای اینکه ماشینت بهترین عملکرد رو داشته باشه، پیشنهاد میکنم از باتریهای لیتیوم-یون 18650 با کیفیت بالا استفاده کنی (ولتاژ 3.7 تا 4.2 ولت، ظرفیت حداقل 2200 میلیآمپر و ضریب تخلیه یا همون دشارژ ریت حداقل 2C). بعضیها ترجیح میدن برای برد ESP32-S3 از یک تغذیه جداگانه (3.3 یا 5 ولت) و برای درایور موتورها از یک تغذیه قویتر (7.4 تا 8.4 ولت) استفاده کنن.
اما من شخصا ترجیح میدم فقط از یک منبع تغذیه استفاده کنم تا کلا یک کلید روشن/خاموش روی ماشین داشته باشم. فقط یادت نره که حتما از یک خازن مناسب برای گرفتن نویزهای الکتریکی که توسط درایور موتور تولید میشه، استفاده کنی تا تصویر دوربینت خط نیفته یا میکروکنترلر هنگ نکنه.
فایلهای شماتیک مدار
شماتیک قطعات این پروژه با استفاده از نرمافزار Fritzing طراحی شده. میتونی فایلهای مربوط به اتصالات و مدار رو بررسی کنی تا موقع سیمکشی و لحیمکاری سردرگم نشی.
- فایل فریتزینگ و سورس کدهای ماشین (esp32s3cam-rc-car.zip)
جمعبندی و نتیجهگیری
تا اینجا ماشین کنترلی دوربیندارت با ESP32-S3 آمادهست؛ از سیمکشی و درایور موتور تا استریم زنده تصویر و کنترل با جویاستیک. امیدوارم از این آموزش لذت برده باشی. اگه حین ساخت سوالی داشتی یا ماشینت رو ساختی، حتما نظرت رو تو بخش دیدگاهها بنویس.
فایلهای پیوست
تو میتونی اولین سازنده باشی!
اگه پروژه رو ساختی به اشتراک بزار و اعتبار هدیه بگیر
این آموزش با استانداردهای اختصاصی آیسیمدار بازنویسی و بهینهسازی شده و تمامی حقوق انتشار آن متعلق به این مجموعه است و در صورت کپی یا بازنشر پیگرد قانونی خواهد داشت.








































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