یکی از جالب ترین و دم دستی ترین ماژول های توسعه موجود، ESP32CAM است که در این تاریخ با قیمت حدود ۱۸۰ هزارتومان در بازار به وفور هست. از یک ESP32 و دوربین معمولاً ۲مگاپیکسل OV2640 و یک LED پرنور تشکیل شده ، دوربین را می توانید از سوکت درآورده و با دوربین دیگری جایگزین بفرمایید.
بصورت خیلی متداول برای ساخت انواع دوربین های نظارتی و ربات ها استفاده می شود. بجز دوربین و چراغ و وای فای و بلوتوث ، ده GPIO به شما می دهد که البته برخی با چیز دیگری مشترک هستند اما کار را می توان روی این بورد توسعه راه انداخت و به نسبت قیمت و اینکه یک ESP32 دوربین دار دارید خیلی بصرفه است.
من در اینجا بعنوان مثال برای ساخت یک ربات رونده که اینترفیس وب و اتصال WiFi داشته باشد و خیلی راحت بتوان ساخت استفاده کرده ام و توضیحات و کد را در ادامه ذکر خواهم کرد. اگر مقداری در این زمینه ها اطلاعات و تجربه داشته باشید و مثلاً قبلاً روی آردوینو کد آپلود کرده باشید نباید مشکلی در پیاده سازی وجود داشته باشد. با Arduino IDE کد را باز می کنید و با تنظیمات ذکر شده روی یک ESP32CAM میریزید و به شما یک صفحه کنترل وب و تعدادی پایه می دهد که به قطعات وصل کنید.
من اینجا این کد را روی یک ESP32CAM ریخته و به یک شاسی و ۴موتور و گیربکس DC وصل کرده ام، شما ممکن است به هر چیز یا طراحی دیگری وصل بفرمایید ، این کد روی ESP32CAM به شما یک شبکه وای فای و اینترفیس کنترلی وب و دوربین و چراغ و ۳ خروجی PWM و ۴ خروجی HIGH/LOW دیجیتال می دهد.
ابتدا تنظیمات مورد نیاز و نحوه ریختن کامپایل کد و ریختن برنامه روی ESP32CAM را توضیح می دهم ، بعد در ادامه درباره قطعاتی که معمولاً مورد نیاز است و من در طرح ذکر شده در تصویر بالا استفاده کردم توضیح خواهم داد و در پایان نکات مربوط به کد را ذکر می کنم.
این مدل ماژول ESP32-CAM طرح Ai-Thinker پورت USB یا میکرو USB مستقیم ندارد و برای برنامه ریزی باید از یک مبدل سریال به USB (از ۴۰ هزارتومان) یا شیلد پروگرامر ESP32CAM (حدود قیمت ۸۰هزارتومان) استفاده بفرمایید.
من الان مدتی است از شیلد پروگرامر استفاده می کنم و با توجه به قیمت کم ، کار را واقعاً راحت تر می کند.
اما برای استفاده از مبدل سریال به USB ، طبق تصویر ذیل متصل بفرمایید :
روی Arduino IDE باید قبلاً کتابخانه های ESP32 را نصب کرده باشید. اگر نکرده اید این راهنما را ببینید.
سپس فایل ESP32CAMROBO.ino را در Arduino IDE باز کرده ، در زبانه myconfig.h فایل myconfig.h را ویرایش کرده و مشخصات شبکه وایرلس خود را وارد بنمایید.
و با این تنظیمات روی ESP32CAM آپلود کنید :
در مورد اینکه پس از بالا آمدن چه IP می گیرد ، واقعیتش من بدلیل اینکه از پایه های مشترک با سریال هم در این کد استفاده کرده ام همه print ها و دیباگ ها را کامنت کردم! خودم از روی access point آدرس IP را پیدا می کنم یا از یک ابزار ping sweep هم می توانید استفاده بفرمایید.
* دقت بفرمایید هنوز در این کد و pinout استفاده شده پس از روشن شدن، چرخ های محور چپ یک ثانیه می چرخند.
کد اصلی که فقط دوربین است : https://github.com/easytarget/esp32-cam-webserver
کد تغییر یافته که برای ربات مناسب است و خروجی PWM و دیجیتال دارد (این کد را باید بگیرید) :
https://github.com/alghaspour/ESP32CAM-ROBO
درحقیقت چند خط به کد اصلی esp32-cam-webserver نسخه easytarget اضافه شده است.
پایه هایی که در اختیار شما قرار می گیرد بشرح زیر هستند :
پایه های 14و 1 و 2 و 3 خروجی دیجیتال HIGH/LOW که در اینجا برای IN1 تا IN4 درایور موتور استفاده شده است.
پایه های 12 و 13 برای PWM با رزولوشن ۱۶بیت برای کنترل سروو موتورها که برجک را می چرخانند.
پایه 15 برای برای PWM با رزولوشن ۸ بیت که ENA و ENB درایور موتور به آن وصل شده است.
در فایل ESP32CAMROBO.ino :
خطوط 197 تا 199 :
int servoTilt = 90; int servoPan = 90; int motorPWM = 250;
خطوط 696 تا 725 داخل تابع setup :
/****************************/
/* Pins & PWM Setup for ROBO*/ // Pin 12 & 13 for Turret ledcSetup(2, 50, 16); //channel, freq, resolution ledcAttachPin(12, 2); // pin, channel ledcSetup(3, 50, 16); ledcAttachPin(13, 3); // Pin 15 for Motors PWM ledcSetup(4, 50, 8); ledcAttachPin(15, 4); // Set Servos in default position uint32_t duty = (((float(90)/180.0) *2000)/20000.0*65536.0) + 1634; // convert 0-180 degrees to 0-65536 ledcWrite(2, duty); //Tilt ledcWrite(3, duty); //Pan ledcWrite(4, 250); // Motor PWM - ENA & ENB // Pins 14,2,1,3 pinMode(14, OUTPUT); //IN1 pinMode(2, OUTPUT); //IN2 pinMode(1, OUTPUT); //IN3 pinMode(3, OUTPUT); //IN4
/****************************/
همانطور که ملاحظه می فرمایید به کثیف ترین روش ممکن یکضرب شماره pin نوشته ام و متغیرها را جای دیگر تعریف نکرده ام و ... ، حقیقت این است برای یک موضوع کم و ساده ای مثل این همین روش راحت تر است.
دقت بفرمایید رزولوشن PWM سروو موتورها ۱۶بیتی است و از یک فرمول و متغیر uint32_t duty برای مپ کردن ۰ تا ۱۸۰ درجه سرووموتور به مقدار ۰ تا ۶۵۵۳۶ این رزولوشن استفاده شده است. اما PWM موتورها ۸ بیتی است و بین همان ۰ تا ۲۵۵ می توان مستقیم مقدار داد.
همچنین کانال های صفر و یک PWM روی ESP32CAM توسط دوربین استفاده شده اند و باید کانال های دیگری را استفاده بفرمایید و البته ذکر کردم PWM و فرکانس و رزولوشن و کانال آن در ESP داستان دارد که بهتر است اگر علاقه دارید و می خواهید در پروژه های مختلف استفاده کنید یک جستجو و مطالعه در اینباره بفرمایید.
در فایل app_httpd.cpp :
خطوط 70 تا 72 :
extern int servoTilt; extern int servoPan; extern int motorPWM;
خطوط 372 تا 428 :
else if(!strcmp(variable, "tilt")) { servoTilt=val; uint32_t duty = (((float(val)/180.0) *2000)/20000.0*65536.0) + 1634; // convert 0-180 degrees to 0-65536 ledcWrite(2,duty); // set channel to pos } else if(!strcmp(variable, "pan")) { servoPan=val; uint32_t duty = (((float(val)/180.0) *2000)/20000.0*65536.0) + 1634; // convert 0-180 degrees to 0-65536 ledcWrite(3,duty); // set channel to pos } else if(!strcmp(variable, "motorspwm")) { if(0 < val <= 255) { motorPWM=val; ledcWrite(4, val); } } else if(!strcmp(variable, "forward")) { digitalWrite(14, HIGH); digitalWrite(2, LOW); digitalWrite(1, HIGH); digitalWrite(3, LOW); } else if(!strcmp(variable, "backward")) { digitalWrite(14, LOW); digitalWrite(2, HIGH); digitalWrite(1, LOW); digitalWrite(3, HIGH); } else if(!strcmp(variable, "right")) { digitalWrite(14, HIGH); digitalWrite(2, LOW); digitalWrite(1, LOW); digitalWrite(3, HIGH); } else if(!strcmp(variable, "left")) { digitalWrite(14, LOW); digitalWrite(2, HIGH); digitalWrite(1, HIGH); digitalWrite(3, LOW); } else if(!strcmp(variable, "stop")) { digitalWrite(14, LOW); digitalWrite(2, LOW); digitalWrite(1, LOW); digitalWrite(3, LOW); }
در فایل index_ov2640.h :
این فایل در حقیقت HTML اینترفیس وب است. من با توجه به اینکه از دوربین OV2640 استفاده می کنم فقط همین را ادیت کردم اما در پوشه نمونه برای دوربین OV3660 هم هست (index_ov3660.h). تغییرات مشخص است و در html براحتی پیدا می کنید.
همانطور که قبلاً عرض کردم شما یک کنترلر دوربین و چراغ دار دارید که ۳ پایه آن خروجی PWM و ۴ پایه خروجی دیجیتال می دهند. برای هر سناریویی از ساخت ربات تا سیستم های کنترل گیت ورودی می توانید استفاده بفرمایید. در اینجا ما روی یک ربات رونده استفاده کرده ایم.
در ایران ESP32CAMهای طرح Ai-Thinker به قیمت از ۱۷۰ تا حتی اگر مشتری و فروشنده غریب باشند ۳۵۰ هزارتومان به وفور یافت می شود. قیمت متعادل و مرسوم در پاییز ۱۴۰۱ حدود ۱۹۰ هزارتومان (به همراه یک دوربین ۲مگاپیکسلی OV2640) است و یک جای کارت حافظه و چراغ نسبتاً پرنور هم روی خودش دارد .
دوربین را می توانید براحتی عوض کنید اما در کد هم باید دوربین استفاده شده را تنظیم بفرمایید. این کد برای دوربین متداول OV2640 تنظیم شده است و نیازی به تغییر ندارد.
دقت بفرمایید یکسری پایه ها مشترکاً استفاده شده یا مثلاً کانال های ۰ و ۱ PWM برای دوربین استفاده شده و ... ، در بخش توضیحات کد در این مورد توضیح داده ام.
این مدل البته درگاه USB ندارد و برای برنامه ریزی توضیحات را در بخش نحوه کامپایل کد و ریختن برنامه روی ESP32CAM داده ام.
ماژول های مختلف دیگری هم هستند که براساس ESP32 دوربین و امکانات دیگری دارند. مثلاً :
در بازار براکت های Pan & Tilt مختلف هست. اگر نبود و پیدا نکردید می توانید با چوب سبک یا فوم خودتان بسازید.مواردی که در بازار هستند هم اختصاصاً برای ESP32CAM طراحی نشده اند و باید خودتان به نحوی ماژول را روی آن ها سوار بفرمایید.
پایه به شاسی پیچ می شود و دو عدد servo motor وظیفه چرخش ۱۸۰ افقی و عمودی را برعهده دارند.
موتورهای Servo SG90 (یا مدل های مشابه مثل SG92R) بازه حرکتی ۱۸۰ درجه دارند و بوسیله PWM براحتی کنترل می شوند، زور زیادی ندارد و زیرفشار چرخ دنده های آن آسیب می بیند اما کار راه انداز و ارزان و ۱۸۰ درجه است.
من در این کد از کتابخانه Servo استفاده نکرده ام زیرا کار با آن ها راحت است و عملاً خیلی نیازی به کتابخانه نیست. روی میکروکنترلرهای ESP برای استفاده از PWM، فرکانس و رزولوشن اهمیت دارند. هم روی ESP8266 هم روی ESP32 بخصوص اگر روی سروو موتور کار می کنید نکاتی هست که یک سرچ بفرمایید و توضیحات و مثال ها را مطالعه کنید.
در این مدل ها سیم قهوه ای منفی و سیم قرمز مثبت و سیم زرد سیگنال از میکروکنترلر است.
من در اینجا از ۳ تخته چوب و فوم و قطعات پلاستیکی ساخت ربات که در بازار به وفور هستند استفاده کرده ام.
انواع و اقسام قطعات و طرح های دیگه هم هست و انتخاب و طراحی این بخش عملاً کار شماست.
اما در دنیا ، اگر robot chassis سرچ بفرمایید شاسی و موتور/گیربکس آماده با اشکال و قیمت های مختلف هست. در ایران شما چیزی را که بخواهید به سختی و با قیمت بیشتر ، اگر باشه ، پیدا می کنید.
موتور گیربکس استفاده شده در این طرح در بازار به موتور گیربکس های زرد مشهور هستند. البته رنگ های دیگر و شفت فلزی و نسخه های حرفه ای تری از همین طرح هم هست. نسخه یک شفت در یکطرف و دو شفت در دو طرف دارند.
در هنگام انتخاب دقت بفرمایید هر چقدر دور در دقیقه بیشتر شود سرعت بیشتر اما گشتاور کمتر می شود و زور کمتری سر چرخ است. من اینجا از ۴ موتور/گیربکس k15 که (بدون بار) حدود ۱۰۰ دور در دقیقه است به حدود قیمت ۳۰هزارتومان استفاده کرده ام.
شفت این مدل موتور/گیربکس ها اصطلاحاً کونیک خور است، چرخ های استفاده شده نیز کونیک خور بوده اند و نیازی به شفت واسط و مبدل شفت و ... نبوده است.
برای تامین برق و دستور به موتورهای DC از درایور استفاده می شود، اصولاً نباید مواردی مثل موتور DC را که ممکن است آمپر بالایی بکشند مستقیماً به پایه های میکروکنترلر وصل و تغذیه کرد زیرا باعث آسیب به میکروکنترلر می شوند.
یکی از معروفترین ماژول های درایور L298N است که به وفور در بازار به قیمت ۶۰ تا ۹۰ تومان (در این تاریخ) در دسترس می باشد. این ماژول برای کنترل جهت یک H-Bridge و برای کنترل سرعت پایه PWM در اختیار شما میگذارد و دو موتور را همزمان می توان به آن وصل کرد.
پایه ENA پایه PWM تعیین سرعت چرخش موتور شماره یک بوسیله میزان ولتاژ اعمال شده به موتور و IN1 و IN2 تعیین جهت و تغذیه موتور شماره یک هستند که به بورد توسعه و میکروکنترلر وصل می شوند و OUT1 و OUT2 هم اتصال به پایه های موتور هستند. برای موتور دو هم به همین ترتیب.
در تصویر بالا که نمونه اتصال یک آردوینو اونو به درایور L298N است دقت بفرمایید که پایه VIN +5v هم روی درایور هست که می توان از آن برق ۵ ولت گرفت. یعنی یک خروجی ۵ ولت هم دارد. مثلاً در همین نمونه ای که من ساخته ام و در این مقاله تصاویرش هست می شد حتی از رگولاتور استفاده نکرد و از L298N برای ESP32CAM برق کرفت. مثل تصویر بالا که برق آردوینو را از همین L298N گرفته است.
برای اطلاعات و توضیحات بیشتر مثلاً اینجا و اینجا را مطالعه بفرمایید.
اما من یک مبدل ولتاژ و رگولاتور جدا گذاشتم، بدلیل اینکه ESP32CAM دو آمپر برق بدون نوسان (حداقل ۴.۶ ولت - استاندارد ۵ ولت) می خواهد و همچنین سروو موتورها نیز از همین رگولاتور برق می گیرند و اگر از L298N زیاد آمپر بکشید داغ می کند و بازدهی آن کم می شود.
در این ربات که من بعنوان نمونه برای این پروژه ساخته ام هر دو پایه PWM روی ماژول (ENA و ENB) به یک پایه ESP32 متصل شده اند و من ۴ موتور DC را به ماژول متصل کرده ام.
این ماژول تا ۲آمپر توانایی تامین برق موتورها را دارد و تا ۴ موتور زیر بار سبک من امتحان کردم و جواب داده، البته هرچقدر آمپر بیشتری بکشید بیشتر داغ می کند و با داغ شدن کارایی آن هم کم می شود. به همین دلیل من یک هیت سینک هم خودم روی IC آن نصب کردم.
در این پیاده سازی سخت افزاری از ۳ باتری سری شده 18650 استفاده کرده ام که خروجی حدود ۱۲ ولت می دهند، خروجی برق مستقیم به L298N وصل شده و یک اتصال هم برای یک رگولاتور کاهنده LM2596S وصل شده است که از همین تامین برق ESP32CAM و Servo Motorها را هم بگیرم.
باتری های 18650 باتری های قلمی لیتیوم-یون (Li-ion) قابل شارژ هستند که بصورت استاندارد ۳.۷ ولت به شما برق می دهند. در این سری هایی که من گرفتم در شارژ کامل تا ۴.۲ ولت برق می دهد.
!!! باتری های لیتیوم-یون خطرناک هستند و به ندرت ممکن است منفجر شوند و آتش بگیرند. !!!
درخصوص ایمنی باتری های لیتیوم-یون این موارد را مطالعه بفرمایید. نباید پوشش آن ها آسیب ببیند یا خیلی زیاد داغ شوند یا با روش های غیراستاندارد و بدون محافظ شارژ آن ها را شارژ کرد.
عدد ۱۸۶۵۰ در حقیقت به ابعاد باتری اشاره دارد.
بهتر است باتری هایی با ظرفیت discharge current سه هزار میلی آمپر به بالا بگیرید که بتوانید آمپر مورد نیاز مجموعه را تامین کنید.
از یک قاب ۲تایی و یک قاب یک عددی باتری ۱۸۶۵۰ استفاده و سه باتری را بصورت سری لحیم کرده ام و سر راه منفی یک کلید راکر برای قطع و وصل برق (خاموش-روشن کردن ربات) قرار دادم.
خروجی این مجموعه حدود ۱۲ ولت است و می توان مستقیما به درایور موتور L298N وصل کرد اما برای تامین برق ESP32CAM و سروو موتورها نیاز به برق ۵ ولت دارید.
همچنین از یک ماژول رگولاتور DC به DC کاهنده 3 آمپر LM2596S استفاده کرده ام که حدود 25هزارتومان قیمت دارد و کارایی مناسبی هم دارد. ولتاژ ورودی: 3 تا 40 ولت و ولتاژ خروجی: 1.25 تا 35 ولت و جریان خروجی : 2 آمپر (حداکثر 3 آمپر در صورت خنک سازی) ارایه می دهد.
دقت بفرمایید باید به outها یک مولتی متر وصل کنید و پیچ برنجی روی مولتی ترن را اینقدر بچرخانید تا ولتاژ شروع به تغییر کند و بعد روی ۵ ولت (من ۵.۱۵ ولت تنظیم می کنم) تنظیم بفرمایید.