ساخت ربات گربه رقصنده با آردوینو (آموزش کامل)
محتویات
به آخرین پروژه انجام شده ما خوش آمدید. در این پروژه، با کندوکاو کردن در دنیای رباتیک، یک ربات دست ساز کوچک که توانایی راه رفتن و رقصیدن را دارد میسازیم. نام ربات دوپای ما، catbot است. در این پروژه که یک آزمایش خلاقانه و ترکیبی از چاپ سه بعدی، تکنولوژی آردوینو و سرووموتوهاست، ما را همراهی کنید. هدف اصلی، ارائه تجربه عملی ساخت ربات های کوچک و سرگرم کننده با آردوینو و تسلط بر برنامه نویسی سرووموتورها برای کاربردهای متعدد است. در انتهای این مطلب، شما قادر خواهید بود catbot خود را بسازید و آن را با برنامه های از پیش نوشته شده راه ببرید یا به رقص درآورید.
به علاوه، در انتهای این پروژه کد کامل و جامع برای ساخت بدون زحمت این ربات را در اختیارتان میگذاریم تا آن را مطابق با میل خود، تغییر دهید. با کنترل موقعیت سرووموتورها از طریق سریال مانیتور، قادر خواهید بود بر ربات خود کنترل کامل داشته باشید.
برای هرچه زیباتر و فانتزی تر شدن این ربات، از ورق های آکریلیک که برش لیزری خورده اند استفاده میکنیم. این قسمت ها نه تنها جذابیت ظاهری و دیداری ربات را افزایش میدهند که باعث درجه یک شدن محصول نهایی هم میشوند. اگر به این مواد دسترسی ندارید، نگران نباشید. زیرا میتوانید از سرویس های آنلاین یا حتی مقوا برای رسیدن به همان نتیجه استفاده کنید.
Catbot، ستاره این پروژه، یک ربات دوپاست که با بورد آردوینو نانو ساخته میشود. ربات 5 سروو موتور استفاده میکند. 2 سرووموتور برای هر پا (در مجموع 4 سروو برای 2 پا) و یک سروو هم برای کنترل حرکات سر.
هم چنین این ربات از یک سنسور التراسونیک برای تشخیص موانع و حرکت در اطراف آن ها استفاده میکند.
حال وقت آن است که وارد دنیای جذاب ساخت و برنامه نویسی catbot، ربات دوپای خود شوید. اگر این ربات، ربات مدنظر شما نیست، لطفا به بخشی از سایت که کاملا به ربات ها اختصاص داده شده است، مراجعه کنید تا انواع مختلفی از ربات ها مثل ربات خود متعادل کننده، ربات دوپا، ربات جاروبرقی و غیره را بیابید.
طراحی و ساخت ربات رقصنده دوپا
ما ربات دوپای مختص این پروژه را خودمان در Onshape طراحی کرده ایم که میتوانید تصاویری از CAD design آن به همراه ربات واقعی ساخته شده را کمی پایین تر مشاهده کنید.
اگر علاقه مند به طراحی دوباره این پروژه یا ترکیب طراحی ما با پروژه خود هستید، فایل های CAD با پسوند .dxf برای شما قرار داده شده است که میتوانید دانلود کنید.
برای ساخت این ربات، همان طور که گفتیم از قطعات آکریلیکی برش لیزری خورده استفاده میکنیم. اما اگر شما به چاپگرهای سه بعدی دسترسی دارید، میتوانید از آن هم استفاده کنید. اما در صورت استفاده از چاپگر سه بعدی، باید فایل با پسوند .stl را از لینک بالا دانلود کنید.
ورق آکریلیک برش لیزری خورده به صورت تصویر پایین خواهد بود.
ربات catbot ساخته شده با آردوینو نانو، مانند بسیاری از دیگر ربات ها، براساس میزان انعطاف پذیری اش ارزیابی و قضاوت میشود. معیار سنجش معمولا درجه آزادی است. شما درجه آزادی را تعداد روش هایی که ربات با استفاده از آن ها میتواند خم شده یا بخش های مختلفش را به حرکت دربیاورد در نظر بگیرید. درجه آزادی مانند شمردن تعداد حرکات مختلف موجود در رقص است.
این ربات به صورت بسته تخت عرضه شده و نیاز زیادی به لحیم کاری ( ذوب فلز برای اتصال قطعات به هم) برای به هم چسباندن قسمت های مختلف و راه اندازی آن ندارد. در این ربات، 4 موتور مخصوص داریم که سرووهای SG90 نام دارند. این موتور ها به ربات امکان حرکت در 4 جهت مختلف را میدهند. پس ربات میتواند به جلو، عقب، راست یا چپ حرکت کند.
حال اجازه دهید حرکت هر بخش را توضیح دهیم:
1- سر ربات میتواند متناسب با نوع سروویی که برای سر استفاده شده تا 180 درجه بچرخد.
2- ران سمت چپ و راست ربات میتواند ربات را به صورت عمودی به سمت راست یا چپ کج کند.
3- پاهای سمت چپ و راست ربات میتوانند خود را بالا و پایین برده و ربات را به سمت جلو به حرکت درآورند.
قطعات لازم
- آردوینو نانو
- 5 عدد سرووموتور دنده فلزی SG90
- سنسور التراسونیک HC-SR04
- قطعات آکریلیکی ربات ( برش لیزری)
- باتری لیتیم-یون 7.4 ولتی
- کلید
- سیم های جامپر
- برد بورد
- پیچ و مهره و اسپیسر
مونتاژ ربات دوپا
همان طور که گفتیم، برای ساخت این ربات دوپا، یک ورق آکریلیک را با لیزر برش داده ایم. این ورق، به صورت کاملا دقیق برش خورده تا فضای کافی برای قرارگرفتن تمام اتصالات و قطعات را داشته باشد و همچنین مونتاژ با پیچ گوشتی را آسان کند.
قبل از شروع به مونتاژ، باید زاویه سرووموتورها را تنظیم کنیم. درغیر این صورت، ربات دوپای ما به درستی کار نخواهد کرد.
در ابتدا با دقت بازوی سروو را به سروو متصل کنید. ( با هم تراز کردن قطعات و سپس محکم کردن بازو در سرجایش). اگرچه میتوانیم کالیبراسیون و تنظیم زاویه سرووموتوررا به صورت دستی انجام دهیم، اما باید بدانیم که گاهی اوقات یا کالیبراسیون به صورت دستی امکان پذیر نیست یا اینکه ممکن است به درستی انجام نشود. پس شما با استفاده از کد از پیش نوشته شده شماره 1، سرووموتورهاس خود را کالیبره کنید. با استفاده از مدار اتصال در پایین، سرووموتورها را به آردوینو متصل کرده و سپس کد شماره 1 را روی آردوینو خود آپلود کنید تا پروسه کالیبره کردن آسان شود. انجام ندادن این مرحله ممکن است باعث ناپایداری در عملکرد ربات شود.
با مطمئن شدن از اتصالات صحیح و کالیبراسیون سرووهاست که فندانسیون یک ربات پایدار و با عملکرد خوب را پایه ریزی میکنیم. پس از تنظیم 90 درجه همه سرووها، میتوانید از مرحله مونتاژ عبور کنید.
مدار ربات دوپا با آردوینو
در مدار این ربات دو پا، سرووها نقش مهمی به عنوان مفاصل محوری پا ایفا میکنند و به ربات امکان چرخاندن و تاب دادن ران و باسن یا بالا و پایین بردن پاها و همچنین عملکرد مناسب سرووموتور پنجم برای چرخاندن سر را میدهند.
در این پروژه به دلیل استفاده از موتور های 5 ولتی، سیم کشی پیچیده ای نداریم. با استفاده از پایه های دیجیتال، موتورها را کنترل میکنیم. لازم به ذکر است که چون پایه 5 ولت آردوینو قادر به تامین توان مورد نیاز برای عملکرد همه موتورها نیست، از آن استفاده نکرده و به جای آن، از منبع تغذیه دیگری استفاده میکنیم و به این شکل از تامین شدن توان کافی برای کارکرد مناسب همه موتورها مطمئن میشویم.
نکته : همیشه کلید تغذیه آردوینو را در هنگام آپلود کردن کد خاموش کنید.
آردوینو نانو خود را به برد بورد یا PCB متصل کنید. از اتصال پایه های تغذیه و زمین مطمئن شوید.
باتری لیتیوم-یون 7.4 ولتی را به وسیله یک کلید، به پایه Vin آردوینو نانو متصل کنید. این کلید به ما اجازه قطع و وصل کردن ارتباط آردوینو با منبع تغذیه خارجی را میدهد.
سنسور التراسونیک را مطابق مراحل زیر به آردوینو نانو متصل کنید:
- VCC (تغذیه) سنسور را به پایه 5V آردوینو متصل کنید.
- GND (زمین) سنسور را به پایه GND آردوینو متصل کنید.
- پایه TRIG (تریگر) سنسور را به پایه آنالوگ آردوینو نانو ( مثل پایه A5) متصل کنید.
- پایه ECHO (اکو) سنسور را به یک پایه دیگر آنالوگ آردوینو نانو (مثل پایه A3) متصل کنید.
سرووموتورهای SG90 را برای کنترل حرکات ربات به آردوینو متصل کنید:
هر سروو سه سیم تغذیه (قرمز)، زمین ( قهوه ای) و سیگنال ( نارنجی) دارد. سیم های تغذیه را به ترمینال مثبت منبع تغذیه (باتری) و سیم های زمین را به ترمینال منفی آن متصل کنید. سیم های سیگنال را به پایه های دیجیتال مشخصی از آردوینو متصل کنید.
- سروو 1: حرکت سر ( مثلا به پایه 3 دیجیتال)
- سروو 2: حرکت ران چپ ( مثلا به پایه 5 دیجیتال)
- سروو 3: حرکت ران راست ( مثلا به پایه 9 دیجیتال)
- سروو 4: حرکت پای چپ ( مثلا به پایه 7 دیجیتال)
- سروو 5: حرکت پای راست ( مثلا به پایه 11 دیجیتال)
با پیچ و مهره و اسپیسر قطعات را کاملا به قاب ربات متصل کنید. مطمئن شوید که مدار دارای سیم های شل نیست و احتمال اتصال کوتاه وجود ندارد. همیشه قبل از روشن کردن مدار، از اتصالات خود مطمئن شوید.
کد آردوینو برای ربات دوپا رقصنده
در اینجا، کد را توضیح میدهیم. با این کد، ربات دوپا را که از سرووموتورها و سنسور التراسونیک برای اندازه گیری فاصله استفاده میکند، کنترل میکنیم. کد شامل توابع مختلف برای کنترل حرکات ربات مثل حرکت به جلو، چرخیدن، کج شدن و تاب خوردن است. به علاوه، در کد از کتابخانه NewPing برای ارتباط با سنسور التراسونیک و اندازه گیری فاصله استفاده میکنیم.
ضروری است که کد شماره 1 را قبل از شروع مراحل مونتاژ اجرا کنید. این کد برای کالیبراسیون و تنظیم سرووموتورها در زاویه درستشان است. اجرای این کد از هرگونه مشکل یا چالش احتمالی در طی مراحل مونتاژ جلوگیری میکند.
#include <Servo.h> // include servo library // Define 5 Servos Servo myServo1; // Head Servo Servo myServo2; // Left Hip Servo Servo myServo3; // Left foot Servo Servo myServo4; // Right Hip Servo Servo myServo5; // Right foot Servo void setup() { // Attach servos to Arduino PWM Pins myServo1.attach(3); myServo2.attach(5); myServo3.attach(7); myServo4.attach(9); myServo5.attach(11); myServo1.write(90); myServo2.write(90); myServo3.write(90); myServo4.write(90); myServo5.write(90); } void loop() { }
کد شماره 2 شامل تمام حرکات ضروری سرووموتور برای کاربردی ساختن ربات ماست. اجرای این کد برای عملکرد درست ربات ضروری است و بدون آن، نمی توانیم این پروژه را با موفقیت به اتمام برسانیم.
در انتهای این آموزش، برنامه کامل ساخت ربات قرار داده شده است. اما فعلا آن را به چند بخش تقسیم کرده ایم و هر بخش را برایتان جداگانه توضیح میدهیم.
این کد قادر به کنترل حرکات ربات شماست. میتوانید با تغییر زاویه کج شدگی، زاویه چرخش و زاویه تاب خوردن هر موتور، حرکات ربات را مطابق با میل خود تغییر دهید.
#include <Servo.h> #include <NewPing.h>
کتابخانه های لازم را فراخوانی میکنیم. با کتابخانه Servo.h سرووموتورها را کنترل کرده و با کتابخانه NewPing.h ارتباط با سنسور التراسونیک را آسان میکنیم.
// edit the pin according to your connection #define ECHO_PIN A3 // Arduino pin tied to echo pin on the ultrasonic sensor. #define TRIGGER_PIN A5 // Arduino pin tied to trigger pin on the ultrasonic sensor. #define LEFTLEG 5 #define RIGHTLEG 9 #define LEFTFOOT 7 #define RIGHTFOOT 11 #define HEAD 3 #define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm. int Min_DISTANCE = 10;
در این بخش از کد، مشخص میکنیم که هر عنصر از مدار به کدام پایه متصل شده است. پایه ECHO_PIN به پایه اکو سنسورالتراسونیک و پایه TRIGGER_PIN به پایه تریگر این سنسور متصل شده است.
پایه های LEFTLEG، RIGHTLEG، LEFTFOOT ،RIGHTFOOT و HEAD به سرووهای کنترل کننده بخش های مختلف ربات اختصاص داده شده اند.
MAX_DISTANCE حداکثر فاصله ایست که سنسورالتراسونیک قادر به اندازه گیری آن است.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
یک نمونه از کلاس NewPing به نام sonar میسازیم که برای ارتباط با سنسورالتراسونیک استفاده میشود.این نمونه، با شماره پایه های دیگر تریگر و اکو و همچنین حداکثر فاصله مقداردهی اولیه میشود.
Servo Lleg; Servo Rleg; Servo Lfoot; Servo Rfoot; Servo Head;
از کلاس Servo برای هر سرووموتور یک نمونه میسازیم. این نمونه ها Lleg،Rleg،Lfoot،Rfoot و Head هستند.
int Hcenter = 90; int RLcenter = 90; int RFcenter = 90; int LLcenter = 90; int LFcenter = 90;
متغیرهای صحیح بالا، موقعیت مرکزی یا پیش فرض سرووموتورهای کنترل کننده سر، پای راست، پای چپ، ران راست و ران چپ را در خود ذخیره میکنند.
int tAngle = 20; // tilt angle int uAngle = 25; // turn angle int sAngle = 25; // swing angle int Speed = 50; // Speed of walk
متغیرهای صحیح بالا، زوایا و سرعت های مختلف مورد استفاده در کنترل حرکت ربات را در خود ذخیره میکنند. tAngle زاویه کج شدن و انحراف، uAngleزاویه چرخش، sAngle زاویه تاب خوردن و Speed تاخیر بین حرکات سروو را در خود ذخیره میکند ( سرعت راه رفتن).
void Forward(byte Steps, byte Speed){ Serial.println("Forward"); TiltRightUp(tAngle, Speed); for (byte j=0; j<Steps; ++j){ SwingRight(sAngle, Speed); TiltRightDown(tAngle, Speed); TiltLeftUp(tAngle, Speed); SwingRcenter(sAngle, Speed); SwingLeft(sAngle, Speed); TiltLeftDown(tAngle, Speed); TiltRightUp(tAngle, Speed); SwingLcenter(sAngle, Speed); } TiltRightDown(tAngle, Speed); }
این تابع برای به حرکت درآوردن ربات به جلو است. دو آرگومان دارد. Steps تعداد قدم هایی است که ربات باید بردارد و Speed تاخیر بین حرکات سرووست.
این تابع، از چند زیر تابع یا تابع فرعی برای ساخت الگو راه رفتن استفاده میکند. این توابع SwingRight، TiltRightUp،TiltRightDown،TiltLeftUp، TiltLeftDown، SwingCenter و SwingLeft هستند.
این توابع فرعی به ترتیب فرخوانده میشوند تا حرکت مورد نظر اتفاق بیفتد.
void TurnLeft(byte Steps, byte Speed){ Serial.println("TurnLeft"); TiltLeftUp(uAngle, Speed); delay(20); for (byte j=0; j<Steps; ++j){ LeftLegIn(sAngle, Speed); TiltLeftDown(uAngle, Speed); TiltRightUp(uAngle, Speed); delay(20); LeftLegIcenter(sAngle, Speed); RightLegOut(sAngle, Speed); TiltRightDown(uAngle, Speed); TiltLeftUp(uAngle, Speed); delay(20); RightLegOcenter(sAngle, Speed); } TiltLeftDown(uAngle, Speed); }
به طور مشابه، این تابع تعریف شده تا ربات را به سمت چپ به حرکت دربیاورد. از ترکیب توابع فرعی برای رسیدن به این حرکت استفاده میکند.
TiltLeftUp، LeftLegIn، TiltRightUp، LeftLegICenter، RightLegOut، TiltRightDown، TiltLeftUp
void TurnRight(byte Stps, byte Speed){ Serial.println("TurnRight"); TiltRightUp(uAngle, Speed); delay(20); for (byte f=0; f<=Stps; ++f){ RightLegIn(sAngle, Speed); TiltRightDown(uAngle, Speed); TiltLeftUp(uAngle, Speed); delay(20); RightLegIcenter(sAngle, Speed); LeftLegOut(sAngle, Speed); TiltLeftDown(uAngle, Speed); TiltRightUp(uAngle, Speed); delay(20); LeftLegOcenter(sAngle, Speed); } TiltRightDown(uAngle, Speed); }
این تابع برای به حرکت درآوردن ربات به سمت راست تعریف شده است و ازتوابع فرعی با ترتیب مشابه به تابع TurnLeft استفاده کرده با این تفاوت که اینجا حرکات به سمت راست هستند.
void HeadRight() { Serial.println("HeadRight"); Head.write(Hcenter - 105); delay(1000); } void HeadLeft() { Serial.println("HeadLeft"); Head.write(Hcenter + 105); delay(1000); } void HeadCenter() { Serial.println("HeadCenter"); Head.write(Hcenter); delay(1000); }
این توابع حرکت سر ربات را کنترل میکنند. HeadRight و HeadLeft سر را با تنظیم زاویه سروو سر، به ترتیب به راست و چپ میبرند.
HeadCenter با تنظیم زاویه سروو سردر مقدار پیش فرض، سر را در مرکز قرار میدهد.
void TiltRightUp(byte ang, byte sp){ //tilt right up for (int i=0; i<=ang; i+=5){ Lfoot.write(LFcenter+i); Rfoot.write(RFcenter+i); delay(sp); } } void TiltRightDown(byte ang, byte sp){ //tilt right down for (int i=ang; i>0; i-=5){ Lfoot.write(LFcenter+i); Rfoot.write(RFcenter+i); delay(sp); } } void TiltLeftUp(byte ang, byte sp){ //tilt left up for (int i=0; i<=ang; i+=5){ Lfoot.write(LFcenter-i); Rfoot.write(RFcenter-i); delay(sp); } } void TiltLeftDown(byte ang, byte sp){ //tilt left down for (int i=ang; i>0; i-=5){ Lfoot.write(LFcenter-i); Rfoot.write(RFcenter-i); delay(sp); } }
این توابع کج شدن و انحراف ران ها و پاهای ربات را کنترل میکنند و با افزایش یا کاهش مرحله به مرحله زاویه سروو، حرکات موردنیاز را به وجود می آورند.
void LeftFootUp(char ang, byte sp){ //tilt left up for (int i=0; i<=ang; i+=5){ Lfoot.write(LFcenter-i); delay(sp); } } void LeftFootDown(byte ang, byte sp){ //tilt left down for (int i=ang; i>0; i-=5){ Lfoot.write(LFcenter-i); delay(sp); } } void RightFootUp(byte ang, byte sp){ //tilt right up for (int i=0; i<=ang; i+=5){ Rfoot.write(RFcenter+i); delay(sp); } } void RightFootDown(byte ang, byte sp){ //tilt right down for (int i=ang; i>0; i-=5){ Rfoot.write(RFcenter+i); delay(sp); } }
به طور مشابه، این توابع بالا رفتن و پایین آمدن پای ربات را با تنظیم زاویه سروو کنترل میکنند.
void SwingRight(byte ang, byte sp){ //swing right for (int i=0; i<=ang; i+=5){ Lleg.write(LLcenter-i); Rleg.write(RLcenter-i); delay(sp); } } void SwingRcenter(byte ang, byte sp){ //swing r->center for (int i=ang; i>0; i-=5){ Lleg.write(LLcenter-i); Rleg.write(RLcenter-i); delay(sp); } } void SwingLeft(byte ang, byte sp){ //swing left for (byte i=0; i<=ang; i=i+5){ Lleg.write(LLcenter+i); Rleg.write(RLcenter+i); delay(sp); } } void SwingLcenter(byte ang, byte sp){ //swing l->center for (byte i=ang; i>0; i=i-5){ Lleg.write(LLcenter+i); Rleg.write(RLcenter+i); delay(sp); } }
این توابع حرکت تاب خوردن و نوسانی ران ربات را کنترل میکنند. توابع SwingRight، SwingLeft ران ها را به سمت بیرون برده درحالیکه SwingCenter آن ها را به مرکز برمیگرداند.
void RightLegIn(byte ang, byte sp){ //swing right for (int i=0; i<=ang; i+=5){ Rleg.write(RLcenter-i); delay(sp); } } void RightLegIcenter(byte ang, byte sp){ //swing r->center for (int i=ang; i>0; i-=5){ Rleg.write(RLcenter-i); delay(sp); } } void RightLegOut(byte ang, byte sp){ //swing right for (int i=0; i<=ang; i+=5){ Rleg.write(RLcenter+i); delay(sp); } } void RightLegOcenter(byte ang, byte sp){ //swing r->center for (int i=ang; i>0; i-=5){ Rleg.write(RLcenter+i); delay(sp); } }
این توابع حرکت ران راست ربات را کنترل میکنند. توابع RightLegIn و RightLegOut ران ها را به ترتیب به سمت داخل یا بیرون میبرند. RightLegIcenter و LeftLegOcenter دو ران را به ترتیب از راست یا از چپ به موقعیت مرکزی برمیگردانند.
void LeftLegIn(byte ang, byte sp){ //swing left for (byte i=0; i<=ang; i=i+5){ Lleg.write(LLcenter+i); delay(sp); } } void LeftLegIcenter(byte ang, byte sp){ //swing l->center for (byte i=ang; i>0; i=i-5){ Lleg.write(LLcenter+i); delay(sp); } } void LeftLegOut(byte ang, byte sp){ //swing left for (byte i=0; i<=ang; i=i+5){ Lleg.write(LLcenter-i); delay(sp); } } void LeftLegOcenter(byte ang, byte sp){ //swing l->center for (byte i=ang; i>0; i=i-5){ Lleg.write(LLcenter-i); delay(sp); } }
این توابع حرکت ران چپ ربات را مانند تابع RightLeg کنترل میکنند.
این توابع چونگی ساخته شدن حرکات اصلی ربات از روی حرکات و الگوهای جزئی را بیان میکنند. به این شکل که توابع فرعی با درکنار هم قرارگرفتن با یک ترتیب خاص، قادر به ساخت حرکات خاصی مانند راه رفتن، چرخیدن و کج شدن هستند وهمچنین در این پروسه از زوایای سروو و زمان های تاخیر هم استفاده خواهد شد.
void setup() { Serial.begin(19200); Serial.println("Bipedino setup is running."); Lleg.attach(LEFTLEG); Rleg.attach(RIGHTLEG); Lfoot.attach(LEFTFOOT); Rfoot.attach(RIGHTFOOT); Head.attach(HEAD); CenterServos(); delay(500); for (int i = 0; i < 5; ++i) { GetSonar(); delay(1000); } Serial.println("Bipedino is ready."); }
به بیان ساده، آنچه که در تابع ()setup انجام میشود، برقراری ارتباط با کامپیوتر از طریق ارتباط سریال، اتصال سرووموتورها به پایه های خاصی از آردوینو، تنظیم سرووها در موقعیت اولیه و کالیبره کردن سنسورالتراسونیک است. به این ترتیب مرحله راه اندازی تکمیل است و ربات آماده شروع به کار است.
void loop() { unsigned int cmCenter = MAX_DISTANCE; unsigned int cmLeft = MAX_DISTANCE; unsigned int cmRight = MAX_DISTANCE; HeadCenter(); cmCenter = GetSonar(); if (cmCenter < Min_DISTANCE) { HeadRight(); cmRight = GetSonar(); HeadCenter(); if (cmRight > Min_DISTANCE) { TurnRight(5, 50); } else { HeadLeft(); cmLeft = GetSonar(); HeadCenter(); if (cmLeft > Min_DISTANCE) { TurnLeft(5, 50); } } } else { int nSteps = cmCenter / 5; if (nSteps > 5) { nSteps = 5; } else { nSteps = 1; } Serial.print("Steps <"); Serial.print(nSteps); Serial.println(">"); for (int n = 0; n < nSteps; n++) { Forward(1,50); } } }
تابع ()loop به صورت مداوم با استفاده از سنسور التراسونیک فاصله روبه رو را میسنجد و بر اساس موانع شناسایی شده تصمیم میگیرد که به جلو حرکت بکند یا نه. اگرمانع در فاصله خیلی کم از ربات تشخیص داده شده باشد، ربات میچرخد تا راهی برای ادامه حرکت پیدا کند. درغیر این صورت اگر مانع در فاصله کم شناسایی نشده باشد، ربات تعداد مشخصی گام به سمت جلو برمیدارد.
int GetSonar() { unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS). Serial.print("Ping: "); Serial.print(uS / US_ROUNDTRIP_CM); // Convert ping time to distance and print result (0 = outside set distance range, no ping echo) Serial.println("cm"); return uS / US_ROUNDTRIP_CM; }
این تابع از سنسورالتراسونیک (sonar) برای اندازه گیری فاصله استفاده میکند. یک پینگ ارسال کرده و مدت زمانی که طول میکشد تا برگردد را حساب میکند. این زمان را به فاصله بر حسب سانتی متر تبدیل کرده، نتیجه را چاپ میکند و به عنوان فاصله برمیگرداند.
void CenterServos() { Lleg.write(LLcenter); // tell servo to go to position in variable 'center' Rleg.write(RLcenter); // tell servo to go to position in variable 'center' Lfoot.write(LFcenter); // tell servo to go to position in variable 'center' Rfoot.write(RFcenter); // tell servo to go to position in variable 'center' Head.write(Hcenter); // tell servo to go to position in variable 'center' delay(1000); // waits 100ms for the servos to reach the position }
این تابع، 5 سرووموتور به کار گرفته شده را به موقعیت مرکزی خود میبرد. سپس با درنظر گرفتن یک تاخیر زمانی به سرووها فرصت لازم برای رفتن به این موقعیت را میدهد.
نتیجه گیری
پروژه ربات دوپای catbot یک مسیر هیجان انگیز به دنیای رباتیک و آردوینو مبتنی بر اتوماسیون را عرضه میکند. در طی این پروژه، چگونگی مونتاژ و کدنویسی یک ربات کوچک دوپا که قادر به راه رفتن، رقصیدن و فرار از مانع هست را آموختید. این پروژه، به کمک شما آمد تا حرکات ربات خود را با تنظیم زوایا شخصی سازی کنید و از خلاقیت خود در طراحی ربات بهره بگیرید.
چه از آکریلیک استفاده کنید وچه از مقوا، شخصی سازی کردن کلید کار شماست. با اتمام این پروژه، دید ارزشمندی به رباتیک پیدا کردید، مهارت های برنامه نویسی خود را پرورش دادید و اعتماد به نفس دنبال کردن پروژه های دیگر رباتیک را به دست آوردید. اجازه دهید خلاقیتتان شکوفا شده د به ساخت ربات های شگفت انگیز ادامه دهید.
موارد موجود در فایل : سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود