آموزش Espآموزش ESP32آموزش اینترنت اشیاپروژه های Esp

آموزش ساخت ربات 4 پا عنکبوتی با ESP32

طبیعت همواره یک منبع الهام فوق العاده برای پیشرفت های تکنولوژی بوده و مهندسان نیز به دنبال تکثیر مکانیزم های پیچیده در حیوانات بوده اند. یک ساخته قابل توجه ربات عنکبوت است که به دلیل چهارپا بودنش به ربات چهارپا نیز شناخته میشود. این پروژه خلاقانه رباتیک به دنبال تقلید حرکت و رفتار عنکبوت هاست. ربات عنکبوت، یک ربات 4 پای رونده است که از ماکت عنکبوت بیونیک که پاهای خود را برای حرکت استفاده میکند، الهام گرفته است. پاها به گونه ای تنظیم شده اند که میتوانند به شکل های مختلفی حرکت کنند. از جمله راه رفتن، دویدن و سنگ نوردی. جز جدانشدنی این پروژه میکروکنترلر ESP32 است که کنترل بی سیم و پیشرفت حرکات را ممکن میکند. ESP32 مثل یک پلتفرم ایده آل برای ربات عنکبوت عمل کرده و چابکی، تطبیق پذیری و توانایی حرکت ربات در زمین های سخت را افزایش میدهد. ربات عنکبوت با ویژگی هایی که نام برده شد، پتانسیل بالایی در انجام عملیات جست و جو و نجات، اکتشافات یا حتی کمک در کارهای منزل دارد.

مکانیزم ربات عنکبوت

مکانیزم ربات عنکبوت شامل چندین قطعه کلیدی و اصول مهم است که حرکت و کارایی آن را ممکن میسازند. ربات های عنکبوتی، زیرمجموعه ربات های پادار هستند که معمولا این ربات ها از ربات های چرخدار پیچیده تر بوده و در نتیجه قادر به عبور از زمین های پیچیده تری نیز هستند. ربات های چرخدار معمولا از موتورهای DC استفاده میکنند در حالیکه ربات های پادار معمولا از سرووموتورها بهره میگیرند.

یک تفاوت اصلی بین ربات های پادار و چرخدار، درجه آزادی آن هاست. ربات های چرخدار تنها یک درجه آزادی دارند درحالیکه ربات های پادار حرکات پیچیده تری را انجام میدهند.

درجه آزادی یک جسم توسط پارامترهای لازم برای مشخص کردن مکان همان جسم تعریف میشود. ربات عنکبوتی ما، در هر پای خود 2 سرووموتور دارد و از انجایی که درکل دارای 4 پاست، پس درمجموع از 8 سرووموتور استفاده میکند و درجه آزادی آن 8 است.

این پروژه سیم کشی و مونتاژ سختی ندارد اما درک کینماتیک پشت هر حرکت ربات بسیار پیچیده است. برای رسیدن به یک حرکت کنترل شده، ربات باید چندین حرکت را انجام داده تا درنهایت بتواند حرکت دلخواه نهایی را اجرا کند. این کار به وسیله اجرای Crawl gait انجام میشود. به این صورت که در حین حرکت یک پا در هواست و بالا گرفته شده و سه پای دیگر بر روی زمین هستند. معمولا برای اینکه ربات یک قدم به جلو بیاید، باید شش حرکت متمایز را انجام دهد.

حرکت روبه جلوی چهارپا

Gait الگو خاصی از حرکت پاها برای سوق دادن بدنه ربات به یک مقصد خاص است. در مورد ربات چهارپا، gait شامل بالا بردن یک پا در حالیکه سه پای دیگر روی زمین هستند، میشود. این الگو حرکتی، ثبات ربات را تضمین میکند. کلید اجرای درست این حرکت، مشخص کردن زمان اجرا و چگونگی حرکت هر پاست. این پروسه همان کینماتیک معکوس است. کینماتیک معکوس، به ما امکان محاسبه مقادیر لازم برای سرووموتورهایی که پاهای ربات را کنترل میکنند را میدهد تا بتوانیم با قرارگرفتن پاها در موقعیت های حساب شده به حرکت دلخواه برسیم.

کینماتیک معکوس نقش مهمی در به آرامی حرکت کردن ربات به جلو، ایفا میکند. با  قراردادن دستورالعمل های لازم در اختیار سرووموتورها، پای ربات میتواند به درستی مطابق میل ما حرکت کند و تعادل ربات هم حفظ شود.

مکانیزم ربات عنکبوت

تصویر بالا، ترتیب اجرای حرکات را برای به حرکت درآمدن ربات به سمت جلو نشان میدهد. خط چین ها بیانگر بالا بودن پا هستند.

ربات عنکبوتی با esp32

برای تضمین پایداری ربات، لازم است که مرکز ثقل در چندضلعی پشتیبان قرار گیرد. چندضلعی پشتیبان، یک چندضلعی فرضی است که اگر مرکز ثقل در آن قرار گیرد، تعادل ربات حفظ خواهد شد و اگر مرکز ثقل خارج از چندضلعی پشتیبان بیفتد، ربات ناپایدار شده و ممکن است به زمین بیفتد. این مفهوم در تصویر پایین نشان داده شده است. تا زمانی که مرکز ثقل در چندضلعی پشتیبان قرار گرفته باشد، ربات متعادل است. این یک اصل مهم در حفظ تعادل ربات و جلوگیری از افتادن آن حین عملیات است.

قطعات لازم

  1. میکروکترلر ESP32
  2. 8 * سرووموتور دنده پلاستیکی SG90
  3. مبدل باک LM2596 DC-DC
  4. باتری لیتیم-یون 12 ولتی
  5. کلید
  6. سیم های جامپر
  7. برد بورد یا PCB
  8. پیچ و مهره و اسپیسر
قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

فایل های برش لیزری ربات عنکبوتی

برای دریافت فایل ها کلیک کنید

قسمت های آکریلیکی این ربات را در SolidWorks  طراحی کرده ایم. میتوانید فایل های .dxf را در لینک بالا بیابید. اگر مایل به ایجاد تغییراتی در فایل ها هستید، از فایل های .svg استفاده کنید. همچنین این قطعات به آسانی در سایت های فروش آنلاین مختلفی در دسترس هستند و کافی است ” قطعات ربات عنکبوت چهارپا” را جست و جو کرده و لینک های بسیاری را بیابید.

مونتاژ ربات عنکبوت

اجزای برش لیزری ربات عنکبوت

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

تنظیم موقعیت سرووها

قبل از شروع به مونتاژ، باید زاویه سرووموتورها را تنظیم کنیم. در غیر این صورت، ربات به درستی کار نخواهد کرد.

مونتاژ بازوی رباتیک

برای شروع، با دقت، بازوی سروو را به سروو متصل کنید. اگرچه که میتوانیم زاویه سرووموتور را به صورت دستی تنظیم و کالیبره کنیم، اما گاهی اوقات ممکن است کالیبراسیون دستی ممکن نبوده یا نتیجه درستی ندهد. درنتیجه شما برای کالیبره کردن سرووموتورهای خود از کد از پیش نوشته شده شماره 1 استفاده کنید. با استفاده از مداری که پایین تر ارائه شده، سرووموتورهای خود را به پایه های 21،19،33،25،27،14،12 و 13 متصل کنید. کد شماره 1 را روی ESP32 خود آپلود کرده تا پروسه کالیبراسیون را به آسانی انجام دهید. انجام ندادن این مرحله، ممکن است باعث عملکرد ناپایدار ربات شما گردد.

مونتاژ بازوی رباتیک

فندانسیون یک ربات پایدار و با عملکرد مناسب با مطمئن شدن از اتصالات و کالیبراسیون سرووها پایه ریزی میشود. بعد از تنظیم سرووموتورها، به مونتاژ پاها میرسیم.

مراحل مونتاژ پا

مراحل مونتاژ پا

گام 1 : یک بازوی سروو را برداشته و آن را روی پایه صفحه محوری قرار دهید. پیچ را از پشت صفحه محوری به بازوی سروو وارد کنید و تا جاییکه بازوی سروو به صفحه محوری محکم نشده، به محکم کردن پیچ ادامه دهید.

گام 2 : حال بازوی سروو دیگری را به بازوی سروو ایستاده وصل کنید. برای این کار، یک پیچ را از پشت بازوی سروو پا وارد کرده  و آن را به بازوی سروو متصل کنید. مطمئن شوید که اتصالات محکم و پایدار است.

گام 3 : با استفاده از پیچ 10 میلی متری M3 و مهره فیبر M3 پا را به مفصل پا متصل کنید و از محکم بودن اتصال آن ها مطمئن شوید.

گام 4 : با استفاده از پیچ 10 میلی متری M3 و یک مهره فیبر M3 ، پا را به بازوی سروو پا متصل کنید.

مراحل مونتاژ پا

گام 5 : درون نگهدارنده سروو، سروو دیگری قرار دهید.

گام 6 : انتهای بالایی سرووی دوم را در شیار سروو پایه قرار دهید.

گام 7 : نگهدارنده سروو را با 2 عدد پیچ 12 میلی متری M3 و 2 عدد مهره فیبر M3 به سوکت سروو پا متصل کنید.

گام 8 : صفحه موازی پا را به انتهای دیگر پا با استفاده از پیچ 10 میلی متری M3 و مهره فیبر M3 متصل کنید.

مراحل مونتاژ پا

مونتاژ بدن

در این مرحله باید مراقب شماره قطعات باشید چون شماتیک براساس این شماره ها داده شده است. پس قبل از مونتاژ، لیستی را که نوشته ایم، مطالعه کنید.

لیست قطعات شماتیک 1 و 2

  1. صفحه بالایی بدن
  2. پیچ 10 میلی متری M3
  3. سرووموتور
  4. مهره M3
  5. مهره فیبر M3
  6. پیچ 12 میلی متری M3
  7. اسپیسر
  8. نگهدارنده سروو

گام 1 : مونتاژ را با اتصال 4 اسپیسر به صفحه پایی شروع کنید. از چهار پیچ 10 میلی متری M3 و چهار مهره صاف  M3 برای محکم کردن اسپیسرها در جای خود استفاده کنید.

گام 2 : چهار سرووموتور را روی شاسی صفحه بالایی قرار دهید و از تراز بودن آن ها مطمئن شوید.

گام 3 : برای هر سرووموتور، یک نگهدارنده گذاشته و از جاگیری درست و محکم آن ها مطمئن شوید.

گام 4 : هر کدام از سرووموتورها را با پیچ های 12 میلی متری M3 و مهره فیبر M3 به شاسی صفحه بالایی متصل کنید و مطمئن شوید که در جای خود محکم هستند.

گام 5 : حال هرکدام از پاها را به صفحه پایین متصل کنید. برای هر پا از یک پیچ 10 میلی متری M3 و مهره فیبر M3 استفاده کنید. پیچ را بیش از اندازه محکم نکنید چون ممکن است در سرووها خرابی ایجاد کند.

گام 6 : صفحه بالایی و پایینی بدن را با پیچ های 10 میلی متری M3 و مهره های M3 کاملا به هم محکم کنید.

گام 7 : حال که سرووها و پاها در جای خود قرار گرفته اند، به آرامی هر پا را با زاویه 45 درجه مطابق دستورالعمل بچرخانید. صفحه محوری بالای پا را با استفاده از پیچ های 10 میلی متری M3 و مهره های M3 (برای هر پا 2 پیچ و مهره) به سروو محوری متصل کنید.

گام 8 : درنهایت، بازوی سروو را با استفاده از پیچ به سروو مناسب کاملا محکم کنید.

بعد از مونتاژ، ربات به این شکل خواهد بود.

مدار ESP32 ربات عنکبوتی چهارپا با 8 سروو موتور

این مدار اتصال 8 سرووموتور لازم برای حرکت ربات در تمام جهات را به تصویر میکشد.

مدار ESP32 ربات عنکبوتی چهارپا با 8 سروو موتور

این ربات از چهار پا تشکیل شده که هر پا به دو سرووموتور متصل است. یک سروو مسئول چرخش محوری است ( سرووی محوری) و سرووموتورهای دیگر بالارفتن پای ربات را کنترل میکنند. ( سروو بالابر)

برای دستیابی به حرکت موردنظر، سرووموتورها با نظم و ترتیب خاصی متصل میشوند. این شیوه اتصال و ترتیب دقیق به الگو gait و حرکت موردنظر و همچنین الگوریتم کنترل استفاده شده بستگی دارد. با کنترل حرکت این سرووها، ربات حرکت پایدار و هماهنگی خواهد داشت.

ESP32 و سروو موتورها

ESP32 و سروو موتورها

پایه های PWM میکروکنترلر ESP32 را برای کنترل سرووها استفاده میکنیم. این پایه ها سیگنال PWM مورد نیاز برای تنظیم موقعیت هر سرووموتور را تولید میکنند.

سیم سیگنال ( معمولا سیم سفید یا زرد) هر سرووموتور را به یک پایه PWM میکروکنترلر متصل کنید.

Servo1 Pin 21 Servo5 Pin 27
Servo2 Pin 19 Servo6 Pin 14
Servo3 Pin 33 Servo7 Pin 12
Servo4 Pin 25 Servo8 Pin 13

ESP32 و منبع تغذیه

ترمینال مثبت منبع تغذیه را به پایه های VCC هر سرووموتور متصل کنید.

ترمینال منفی یا زمین منبع تغذیه را به پایه های زمین تمام سرووموتورها متصل کنید.

پایه GND میکروکنترلر را به پایه منفی یا زمین منبع تغذیه متصل کنید.

پایه Vin میکروکنترلر را به کمک کلید به ترمینال مثبت منبع تغذیه متصل کنید.

هنگام کار با چند سرووموتور، توان مورد نیاز از آنچه که ESP32 میتواند برای ربات فراهم کند، بیشتر میشود. در نتیجه به یک منبع تغذیه خارجی نیاز داریم. هرچند باید مطمئن شویم که ولتاژ ورودی از 5 ولت بیشتر نشود تا آسیبی به ESP32 نرسد.

اگر از یک باتری با ولتاژ بالاتر استفاده میکنید، از یک مدار کاهش ولتاژ ( مبدل باک DC-DC) برای کاهش آن تا 5 ولت استفاده کنید. خروجی مدار کاهش ولتاژ را هم به ESP32 و هم به سرووموتورها متصل کنید تا منبع تغذیه امن و مطمئن داشته باشیم.

لطفا توجه داشته باشید که اتصالات پایه های خاص و کدنویسی آن ها ممکن است باتوجه به مدل بورد ESP32 و سرووموتورهای شما تغییر کند. لازم است که حتما دیتاشیت و شرح پایه قطعاتی که استفاده میکنید را بررسی کرده تا ولتاژهای مورد نیاز و اتصالات پایه ها را به درستی انجام دهید. به علاوه، مطمئن شوید که اتصالات و منبع تغذیه را مدیریت میکنید تا از وارد شدن هر گونه آسیبی به قطعات جلوگیری شود.

توضیحات کد ربات عنکبوتی چهارپا با ESP32

ربات ما با کنترل از راه دور کار نمیکند. بلکه برای پیاده کردن حرکات مختلف مانند حرکت به جلو، عقب، چپ و راست از توابع خاصی استفاده میکند. این توابع براساس همان Crawl gait هسیتند. الگو crawl gait تبدیل به یک برنامه شده و دورن ESP32 تعبیه شده است. این برنامه دستورالعمل هایی را برای به حرکت درآودرن پاهای ربات در جهت دلخواه به سرووموتورها میدهد. به کمک crawl gait، ربات عنکبوت میتواند حرکات کنترل شده و هماهنگی را اجرا کند.

لازم است پیش از مونتاژ، کد شماره 1 را اجرا کنید. همان گونه که پیشتر گفتیم، این کد برای کالیبره کردن و تنظیم درست زوایای سرووموتورها نوشته شده است. با اجرای این کد، عملکرد و جاگیری درست سرووموتورها را تضمین میکنیم و از هرگونه چالش یا مشکل احتمالی در مراحل بعدی مونتاژ جلوگیری میکنیم.

توجه : همیشه پیش از آپلود کد بر روی ESP32 خود، کلید را خاموش کرده و منبع تغذیه خارجی را قطع کنید. انجام این کار ضروری است زیرا با این کار بین پایه Vin میکروکنترلر و پایه VCC سروو، از نظر الکتریکی ایزولاسیون ایجاد کرده و ایمنی قطعات در پروسه آپلود کد را تضمین میکنیم.

همواره به یاد داشته باشید که پیش از آپلود کد روی ESP32، این کار را انجام دهید و ESP32 و سرووها را از نظر الکتریکی ایزوله کرده و از هر گونه خرابی یا چالش ناخواسته جلوگیری کنید.

کد شماره 1

#include <ESP32_Servo.h>    // include servo library
// Define 8 Servos
Servo myServo1; // Front Left Pivot Servo
Servo myServo2; // Front Left Lift Servo
Servo myServo3; // Back Left Pivot Servo
Servo myServo4; // Back Left Lift Servo
Servo myServo5; // Back Right Pivot Servo
Servo myServo6; // Back Right Lift Servo
Servo myServo7; // Front Right Pivot Servo
Servo myServo8; // Front Right Lift Servo
void setup() {
  // Attach servos to Arduino Pins
  myServo1.attach(21);
  myServo2.attach(19);
  myServo3.attach(33);
  myServo4.attach(25);
  myServo5.attach(27);
  myServo6.attach(14);
  myServo7.attach(12);
  myServo8.attach(13);
  myServo1.write(90);
  myServo2.write(90);
  myServo3.write(90);
  myServo4.write(90);
  myServo5.write(90);
  myServo6.write(90);
  myServo7.write(90);
  myServo8.write(90);
}
void loop() {
}

کد شماره 2 شامل تمام حرکات لازم سرووموتورها برای کاربردی شدن ربات است. بدون این کد، نمی توانیم پروژه را با موفقیت به اتمام برسانیم. پس این قطعه کد برای عملکرد مناسب ربات ضروری است.

به علاوه در این کد، برای هر بلوک کامنت یا توضیحاتی نوشته شده که مانند یک راهنما بوده و با کمک آن ها میتوان به آسانی متوجه شد که هر بلوک کد به کدام حرکت مربوط است. همچنین اگر مایل به ایجاد تغییرات یا اصلاحاتی در کد هستید، این کامنت ها به شما در درک هدف و کابرد هر بلوک کمک میکنند.

کد شماره 2

#include <ESP32_Servo.h>    // include servo library
This line includes the ESP32_Servo library, which provides functions for controlling servo motors using the ESP32 microcontroller.
// Define the delay between function calls (in milliseconds)
const unsigned long FUNCTION_DELAY = 2000; // 2 seconds

این خط یک ثابت سراسری به نام FUNCTION_DELAY را تغریف میکند که بیانگر فاصله زمانی بین هر فراخوانی  بر حسب میلی ثانیه است.

// Define 8 Servos
Servo myServo1; // Front Left Pivot Servo
Servo myServo2; // Front Left Lift Servo
Servo myServo3; // Back Left Pivot Servo
Servo myServo4; // Back Left Lift Servo
Servo myServo5; // Back Right Pivot Servo
Servo myServo6; // Back Right Lift Servo
Servo myServo7; // Front Right Pivot Servo
Servo myServo8; // Front Right Lift Servo

این بلوک 8 شی از myServo1 تا myServo8 را از کلاس Servo تعریف کرده که هر کدام بیانگر یک سرووموتور با کارایی خاص ( محوری یا بالابر) و یک پای خاص از ربات عنکبوت هستند.

void setup() {
  // Attach servos to Arduino Pins
  myServo1.attach(21);
  myServo2.attach(19);
  myServo3.attach(33);
  myServo4.attach(25);
  myServo5.attach(27);
  myServo6.attach(14);
  myServo7.attach(12);
  myServo8.attach(13);
  center_servos();
  Serial.println("center");
  delay(2000);
}

تابع setup یکبار و آن هم هنگامی که میکروکنترلر آغاز به کار میکند، اجرا میشود. این تابع با استفاده از متد ()attatch هر شی تعریف شده از کلاس Servo را به پایه مربوطه آردوینو متصل میکند. تابع ()center_servos برای قرارگرفتن سرووها در موقعیت مرکزی خود فراخوانی میشود و پس از آن یک تاخیر 2 میلی ثانیه ای برای پایداری بیشتر به کد افزوده شده است.

void loop() {
   // Move Forward 10 step
  for (int i = 0; i < 10; i++) {
    moveLegServos_Forward();
  }
  center_servos();
  delay(FUNCTION_DELAY);
    // Move Backward 10 step
  for (int i = 0; i < 10; i++) {
    moveLegServos_Backward();
  }
  center_servos();
  delay(FUNCTION_DELAY);
    // Move Right 10 step
  for (int i = 0; i < 10; i++) {
    moveLegServos_Right();
  }
  center_servos();
  delay(FUNCTION_DELAY);
    // Move Left 10 step
  for (int i = 0; i < 10; i++) {
    moveLegServos_Left();
  }
  center_servos();
  delay(FUNCTION_DELAY);
   //  dance 10 step
  for (int i = 0; i < 10; i++) {
    dance();
  }
  center_servos();
  delay(FUNCTION_DELAY);
   // pushup 10 step
  for (int i = 0; i < 10; i++) {
    pushup();
  }
  center_servos();
  delay(FUNCTION_DELAY);
}

این بلوک کد، شامل تابع ()loop است که بعد از تابع ()setup  به صورت مداوم اجرا میشود. این تابع خودش شامل چند حلقه for است که تعداد گام های یک حرکت خاص را کنترل میکنند. در هر تکرار، تابع حرکتی مربوطه فراخوانی میشود. توابع حرکتی را مشاهده میکنید:

()MoveLegServos_Forward(), moveLegServos_Backward(), moveLegServos_Right(), moveLegServos_Left(),pushup(), dance

بعد از هر حرکت، تابع  ()center_servos فراخوانی شده تا سرووها به جای اصلی خود بازگردند. همچنین بین حرکات به اندازه FUNCTION_DELAY فاصله زمانی بر حسب میلی ثانیه وجود دارد.

       // Move Spider Robot Forward Function
void moveLegServos_Forward() {
  // Control the servo actions for each leg
  // Left side leg - Leg 1
  moveLeg_Left_Forward(myServo8, myServo7, myServo8);
  // Left side leg - Leg 4
  moveLeg_Left_Forward(myServo2, myServo1, myServo2);
  // Left side leg - Legs 1 and 4
  for (int angle = 0; angle <= 90; angle += 2) {
    myServo7.write(angle);
    myServo1.write(angle);
    delay(10);
  }
  // Right side leg - Leg 2
  moveLeg_Right_Forward(myServo6, myServo5, myServo6);
  // Right side leg - Leg 3
  moveLeg_Right_Forward(myServo4, myServo3, myServo4);
  // Right side leg - Legs 2 and 3
  for (int angle = 180; angle >= 90; angle -= 2) {
    myServo5.write(angle);
    myServo3.write(angle);
    delay(10);
  }
}

این بلوک کد، تابع ()moveLegServos_Forward را تعریف میکند. این تابع، عملکرد سروو را برای حرکت روبه جلو ربات کنترل میکند. توابع ()moveLeg_Left_Forward و ()moveLeg_Right_Forward را برای کنترل حرکت هر پا فراخوانی میکند و به آرامی زوایای سرووها را برای کنترل حرکات پا به گونه ای که ربات به جلو حرکت کند را تنظیم میکند.

      // Move Spider Robot Backward Function
void moveLegServos_Backward() {
   // Control the servo actions for each leg
  // Left side leg - Leg 1
  moveLeg_Left_Backward(myServo2, myServo1, myServo2);
  // Left side leg - Leg 4
  moveLeg_Left_Backward(myServo8, myServo7, myServo8);
  // Left side leg - Legs 1 and 4
  for (int angle = 180; angle >= 90; angle -= 2) {
    myServo1.write(angle);
    myServo7.write(angle);
    delay(10);
  }
  // Right side leg - Leg 2
  moveLeg_Right_Backward(myServo4, myServo3, myServo4);
  // Right side leg - Leg 3
  moveLeg_Right_Backward(myServo6, myServo5, myServo6);
  // Right side leg - Legs 2 and 3
  for (int angle = 0; angle <= 90; angle += 2) {
    myServo3.write(angle);
    myServo5.write(angle);
    delay(10);
  }
}

این بلوک کد، تابع ()moveLegServos_Backward را تعریف میکند. این تابع، عملکرد سروو را برای حرکت ربات به عقب کنترل کرده و توابع ()moveLeg_Left_Backward و ()moveLeg_Right_Backward را برای کنترل حرکت هر پا فراخوانی میکند. این تابع به آرامی زوایای سرووموتور را برای کنترل حرکات پا به گونه ای که ربات به عقب حرکت کند را تنظیم میکند.

        // Move Spider Robot Right Function
 void moveLegServos_Right() {
  // Control the Right turn servo actions for each leg
  moveLeg_Right(myServo8, myServo7, myServo1); // Leg 4
  moveLeg_Right(myServo6, myServo5, myServo7); // Leg 3
  moveLeg_Right(myServo4, myServo3, myServo5); // Leg 2
  moveLeg_Right(myServo2, myServo1, myServo3); // Leg 1
}
       // Move Spider Robot Left Function  
void moveLegServos_Left() {
  // Control the Left turn servo actions for each leg
  moveLeg_Left(myServo8, myServo7, myServo1); // Leg 4
  moveLeg_Left(myServo6, myServo5, myServo7); // Leg 3
  moveLeg_Left(myServo4, myServo3, myServo5); // Leg 2
  moveLeg_Left(myServo2, myServo1, myServo3); // Leg 1
}

در این بلوک کد، توابع ()moveLegServos_Right و ()moveLegServos_Left, عملکرد سروو را برای حرکت ربات به سمت راست و چپ کنترل میکنند. این توابع حرکات سرووهای پا را برای رفتن به سمت راست یا چپ هماهنگ میکنند.

هر تابع خودش یکی از توابع ()moveLeg_Left یا ()moveLeg_Right را برای هر پا فراخوانی میکند. 8 شی تعریف شده از کلاس Servo آرگومان های این توابع هستند.

       //  Spider Robot dance Function
void dance(){
    // Move the selected servos from 0 to 180 degrees
  for (int angle = 0; angle <= 180; angle += 2) {
    myServo1.write(angle);
    myServo3.write(angle);
    myServo5.write(angle);
    myServo7.write(angle);
    delay(10);  // Delay between each angle change (adjust as needed)
  }
  // Move the selected servos from 180 to 0 degrees
  for (int angle = 180; angle >= 0; angle -= 2) {
    myServo1.write(angle);
    myServo3.write(angle);
    myServo5.write(angle);
    myServo7.write(angle);
    delay(10);  // Delay between each angle change (adjust as needed)
  }
}
         //  Spider Robot pushup Function    
void pushup(){
    // Move the selected servos from 0 to 180 degrees
  for (int angle = 0; angle <= 180; angle += 2) {
    myServo2.write(angle);
    myServo4.write(angle);
    myServo6.write(angle);
    myServo8.write(angle);
    delay(10);  // Delay between each angle change (adjust as needed)
  }
  // Move the selected servos from 180 to 0 degrees
  for (int angle = 180; angle >= 0; angle -= 2) {
    myServo2.write(angle);
    myServo4.write(angle);
    myServo6.write(angle);
    myServo8.write(angle);
    delay(10);  // Delay between each angle change (adjust as needed)
  }
}

این بلوک کد، توابع ()pushup و ()dance را تعریف میکنند. این توابع عملکرد سروو را برای انجام حرکت شنا و رقص کنترل میکنند. این تابع زاویه سرووهای myServo1, myServo3, myServo5 و myServo7 را برای رقص و زاویه سرووهای myServo2، myServo4، myServo6 و myServo8 را برای حرکت شنا از 0 تا 180 درجه تغییر میدهند.

         // Move Spider Robot Forward logic
void moveLeg_Left_Forward(Servo& liftServo, Servo& pivotServo , Servo& oppositePivotServo) {
  // Move the lift servo from 90 to 180
  for (int angle = 90; angle <= 180; angle += 2) {
    liftServo.write(angle);
    delay(10);
  }
  // Move the pivot servo from 90 to 0
  for (int angle = 90; angle >= 0; angle -= 2) {
    pivotServo.write(angle);
    delay(10);
  }
  // Move the lift servo from 180 to 90
  for (int angle = 180; angle >= 90; angle -= 2) {
    liftServo.write(angle);
    delay(10);
  }
}
void moveLeg_Right_Forward(Servo& liftServo, Servo& pivotServo , Servo& oppositePivotServo) {
  // Move the lift servo from 90 to 180
  for (int angle = 90; angle <= 180; angle += 2) {
    liftServo.write(angle);
    delay(10);
  }
  // Move the pivot servo from 90 to 180
  for (int angle = 90; angle <= 180; angle += 2) {
    pivotServo.write(angle);
    delay(10);
  }
  // Move the lift servo from 180 to 90
  for (int angle = 180; angle >= 90; angle -= 2) {
    liftServo.write(angle);
    delay(10);
  }
}
        // Move Spider  Robot Backward logic
void moveLeg_Left_Backward(Servo& liftServo, Servo& pivotServo, Servo& oppositePivotServo) {
  // Move the lift servo from 90 to 180
  for (int angle = 90; angle <= 180; angle += 2) {
    liftServo.write(angle);
    delay(10);
  }
  // Move the pivot servo from 90 to 180
  for (int angle = 90; angle <= 180; angle += 2) {
    pivotServo.write(angle);
    delay(10);
  }
  // Move the lift servo from 180 to 90
  for (int angle = 180; angle >= 90; angle -= 2) {
    liftServo.write(angle);
    delay(10);
  }
}
void moveLeg_Right_Backward(Servo& liftServo, Servo& pivotServo, Servo& oppositePivotServo) {
  // Move the lift servo from 90 to 180
  for (int angle = 90; angle <= 180; angle += 2) {
    liftServo.write(angle);
    delay(10);
  }
  // Move the pivot servo from 90 to 0
  for (int angle = 90; angle >= 0; angle -= 2) {
    pivotServo.write(angle);
    delay(10);
  }
  // Move the lift servo from 180 to 90
  for (int angle = 180; angle >= 90; angle -= 2) {
    liftServo.write(angle);
    delay(10);
  }
}

این بلوک کد شامل چهار تابع ()moveLeg_Left_Forward()، moveLeg_Left_Backward()، moveLeg_Right_Forward و ()moveLeg_Right_Backward است.

()moveLeg_Left_Forward : این تابع مسئول به حرکت درآوردن پای چپ به سمت جلوست. سه شی را به عنوان پارامتر یا آرگومان میپذیرد : liftServo، pivotServo و oppositePivotServo. این تابع ابتدا liftServo را از 90 تا 180 درجه و هر دفعه با 2 درجه افزایش زاویه به حرکت درمی آورد. سپس pivotServo را از 90 تا 0 درجه با همان قدرنسبت حرکت داده و سپس liftServo را دوباره از 180 درجه به 90 درجه می آورد. با استفاده از delay(10) بین حرکات فاصله 10 میلی ثانیه ای ایجاد کرده ایم.

()moveLeg_Right_Forward : این تابع مسئول به حرکت درآوردن پای راست ربات به سمت جلوست و ساختاری مشابه با تابع قبل دارد، اما یک حرکت اضافه نسبت به آن انجام میدهد. پس از حرکت دادن liftServo و pivotServo به صورت توضیح داده شده، oppositePivotServo را از 0 تا 90 درجه حرکت میدهد. هدف از این حرکت اضافی، هماهنگی حرکات پا برای درنهایت جلو رفتن ربات است.

()moveLeg_Left_Backward : این تابع مسئول عقب بردن پای چپ ربات است. این تابع ساختاری مشابه با ()moveLeg_Left_Forward دارد، اما در افزایش زاویه و جهت کمی تغییر ایجاد شده است. PivotServo از 90 تا 180 درجه و liftServo از 180 تا 90 درجه حرکت میکنند. این تغییرات باعث حرکت کردن پا در جهت مخالف میشوند.

()moveLeg_Right_Backward : این تابع مسئول عقب بردن پای راست ربات است و ساختاری مشابه با تابع قبل دارد، اما یک حرکت اضافه نسبت به آن انجام میدهد. پس از به حرکت درآوردن liftServo  و pivotServo به شکلی که توضیح داده شد، oppositePivotServo از 90 به 0 درجه حرکت میکند.

             // Move Spider  Robot Right logic
void moveLeg_Right(Servo& liftServo, Servo& pivotServo , Servo& oppositePivotServo) {
  // Move the lift servo from 90 to 180
  for (int angle = 90; angle <= 180; angle += 2) {
    liftServo.write(angle);
    delay(10);
  }
  // Move the pivot servo from 90 to 0
  for (int angle = 90; angle >= 0; angle -= 2) {
    pivotServo.write(angle);
    delay(10);
  }
  // Move the opposite pivot servo from 0 to 90
  for (int angle = 0; angle <= 90; angle += 2) {
    oppositePivotServo.write(angle);
    delay(10);
  }
  // Move the lift servo from 90 to 180
  for (int angle = 180; angle >= 90; angle -= 2) {
    liftServo.write(angle);
    delay(10);
  }
}
          // Move Spider  Robot Left logic
void moveLeg_Left(Servo& liftServo, Servo& pivotServo , Servo& oppositePivotServo) {
  // Move the lift servo from 90 to 180
  for (int angle = 90; angle <= 180; angle += 2) {
    liftServo.write(angle);
    delay(10);
  }
  // Move the pivot servo from 90 to 180
  for (int angle = 90; angle <= 180; angle += 2) {
    pivotServo.write(angle);
    delay(10);
  }
  // Move the opposite pivot servo from 180 to 90
  for (int angle = 180; angle >= 90; angle -= 2) {
    oppositePivotServo.write(angle);
    delay(10);
  }
  // Move the lift servo from 180 to 90
  for (int angle = 180; angle >= 90; angle -= 2) {
    liftServo.write(angle);
    delay(10);
  }
}

این بلوک کد شامل دو تابع ()moveLeg_Right و ()moveLeg_Left است.

()moveLeg_Right : این تابع مسئول حرکت یا چرخش به سمت راست پای راست است و سه پارامتر یا آرگومان liftServo، pivotServo و oppositePivotServo را میپذیرد. تابع ابتدا liftServo را 2 درجه 2 درجه از 90 تا 180 درجه میبرد. سپس pivotServo را با همان قدرنسبت از 90 تا 0 درجه حرکت میدهد و oppositePivotServo را هم از 0 تا 90 میبرد. در نهایت liftServo  را دوباره از 180 درجه به 90 درجه برمیگرداند. با استفاده از delay(10) بین حرکات فاصله 10 میلی ثانیه ای ایجاد کرده ایم.

()moveLeg_Left : این تابع مسئول چرخش یا حرکت به چپ پای چپ ربات است و ساختاری مشابه با تابع قبلی دارد اما تغییراتی در افزایش زوایا و جهات با آن دارد. PivotServo از 90 تا 180 درجه و oppositePivotServo از 180 تا 90 درجه حرکت میکنند. این تغییرات باعث حرکت پای چپ در جهت عکس میشوند.

      // All Servos Centor function  
void center_servos() {
  myServo1.write(90);
  myServo2.write(90);
  myServo3.write(90);
  myServo4.write(90);
  myServo5.write(90);
  myServo6.write(90);
  myServo7.write(90);
  myServo8.write(90);
}

این بلوک کد، تابع ()center_servos را تعریف میکند که با 90 درجه کردن زوایه تمام سرووها، آن ها را به موقعیت مرکزی یا مبدا حرکت خود میبرد.

به طور کلی، این کد یک چهارچوب ساده برای کنترل ربات عنکبوتی با ESP32 و سروو موتور ها را فراهم کرده است.

موارد موجود در فایل : سورس کامل

3 (2 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *