ساخت ربات حل کننده هزارتو (ماز Maze) با آردوینو

ساخت یک ربات حلکننده هزارتو راهی جذاب برای ورود به دنیای رباتیک و سیستمهای خودران است. تصور کنید دستگاه کوچکی بسازید که بتواند بهصورت هوشمندانه از میان مازهای پیچیده عبور کند و در هر پیچ تصمیمگیری کند. این راهنمای گامبهگام نشان میدهد چگونه میتوانید با استفاده از Arduino UNO، سه سنسور IR و قطعات پایهای که بهراحتی در فروشگاههای الکترونیکی محلی یافت میشوند، ربات حلکننده هزارتو خود را بسازید.
چه دانشجو باشید، چه علاقهمند به سرگرمی و رباتیک، این پروژه ربات حلکننده هزارتو به شما کمک میکند مفاهیم پایهای برنامهنویسی و الکترونیک را با تجربه عملی درک کنید. و بهترین بخش این است که برای ساخت و لذت بردن از این ربات نیازی به دانش مهندسی پیشرفته یا قطعات خاص ندارید. در واقع، اگر قبلاً یک ربات دنبالکننده خط یا ربات جلوگیریکننده از موانع ساخته باشید، میتوانید بهراحتی این پروژه را بدون نیاز به قطعات اضافی بسازید. پروژههای مبتنی بر Arduino را با راهنماهای گامبهگام، دیاگرامهای مدار و کاربردهای واقعی برای تمام سطوح مهارت بررسی کنید.
ربات حلکننده هزارتو چیست؟
روبات حلکننده هزارتو رباتی است که برای عبور از هزارتو و یافتن خروجی بهصورت خودکار طراحی شده است. این ربات از سنسورهایی مانند اولتراسونیک، مادونقرمز یا دوربینها برای تشخیص موانع و نقشهبرداری محیط استفاده میکند. سپس از الگوریتمهای مختلفی مانند جستجوی عمق اول (DFS)، جستجوی عرض اول (BFS) یا پیروی از دیوار برای نقشهبرداری ماز و انتخاب مسیر بهینه بهره میبرد. این ربات معمولاً بر اساس بازخورد در لحظه حرکت میکند و تصمیم میگیرد تا از برخورد با دیوارها جلوگیری کرده و به مقصد برسد.

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

این الگوریتم در مازهایی با دیوارهای متصل که مسیر حل بهصورت یک مرز پیوسته وجود دارد، عملکرد خوبی دارد. بدون تمایز رنگ (مانند نارنجی و سبز)، هزارتو ممکن است گیجکننده به نظر برسد، اما با مسیرهای مشخص، حرکت ربات سادهتر میشود. الگوریتم دست روی دیوار بهویژه برای مازهایی با مرزهای مشخص و دیوارهای پیوسته مناسب است. همچنین برای رباتهایی با توان محاسباتی یا حافظه محدود ایدهآل است زیرا نیازی به “بهخاطر سپردن” مسیر توسط ربات ندارد.
این رویکرد رفتار انسانی هنگام حرکت در فضاهای تاریک یا ناشناخته را شبیهسازی میکند، جایی که لمس دیوار جهت و حس مرزها را ارائه میدهد. ساده، مؤثر و خلاقانه است.
عملکرد
در ویدیو متحرک پایین، میتوانید ربات ما را که با استفاده از الگوریتم دست چپ در هزارتو حرکت میکند، مشاهده کنید. این انتخاب به این دلیل انجام شده است که در این هزارتو خاص، استفاده از الگوریتم دست راست باعث میشد ربات نتواند به مقصد برسد و در مسیر بهطور بیپایان بچرخد.

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

حال بیایید ساخت ربات حلکننده هزارتو را شروع کنیم.
قطعات مورد نیاز
برای ساخت رباتی ساده مانند این، قطعات کاملاً انعطافپذیر هستند و میتوانید بسته به نیاز خود مقیاسبندی کنید. قطعاتی که در این پروژه استفاده شده است عبارتند از:
- Arduino UNO
- شیلد موتور Arduino UNO
- 3* سنسور تشخیص مانع IR
- شاسی ماشین دو چرخ
- چرخ کاستور
- 2* موتورهای DC با چرخ مناسب
- پک باتری لیتیوم یونی 2S با BMS
- سیمهای اتصال
- پیچ، مهره و فاصلهگذار
منبع تغذیه
اگرچه منبع تغذیه انعطافپذیر است، توصیه میشود از منبع ولتاژ بین 5V تا 12V استفاده شود. باتری 9V نیز کار میکند، اما هر چیزی بالاتر از 5V و کمتر از 12V برای اطمینان از تأمین برق پایدار، بهویژه برای موتورها، ایدهآل است. ولتاژ بالاتر تضمین میکند حتی اگر موتورها جریان زیادی بکشند، افت ولتاژ عملکرد Arduino را تحت تأثیر قرار ندهد (که ممکن است باعث راهاندازی مجدد شود).
شاسی
برای شاسی میتوانید از یک شاسی آماده استفاده کنید یا حتی یک شاسی مقوایی بهعنوان جایگزین سریع و کمهزینه انتخاب کنید. سایر قطعات ساده و معمولاً در کیتهای رباتیک یافت میشوند.
با این قطعات، آماده هستید تا ساخت ربات خود را شروع کنید!
شماتیک مدار ربات حلکننده هزارتو
با استفاده از شیلد موتور Arduino، دیاگرام مدار سادهتر میشود زیرا هیچ اتصال خاصی بین شیلد موتور و Arduino UNO نیاز نیست.

با توجه به استفاده از شیلد موتور نسخه 1، محدود به استفاده از پینهای آنالوگ هستیم. بنابراین از A0، A1 و A2 بهعنوان ورودیهای دیجیتال برای سنسورهای چپ، جلو و راست استفاده میکنیم. این تنها پینهایی هستند که پدهای جداگانه دارند و لحیمکاری را آسان میکنند. موتورهای چپ و راست به خروجیهای M1 و M2 شیلد موتور متصل میشوند. هنگام برنامهنویسی میتوانید جهت حرکت موتور را بررسی کنید و در صورت نیاز به تغییر، بهسادگی قطبیت موتورها را برعکس کنید.
منبع تغذیه نیز اهمیت بالایی دارد. از پک باتری 2S قدیمی استفاده میکنیم که ولتاژ خروجی بین 5.6V تا 8.4V فراهم میکند. این بیش از حد کافی برای پروژه ماست. اگر موتور دیگری انتخاب کنید، ممکن است نیاز به ارتقای منبع تغذیه باشد.

همچنین باید اتصال به پینهای PWR ماژول درایور موتور را تأمین کنید، زیرا این پینها مسئول اتصال ورودی باتری به پین Vin Arduino هستند. در صورت عدم اتصال، Arduino UNO روشن نخواهد شد.
حال که توضیح دیاگرام مدار کامل شد، قطعات را مطابق دیاگرام مونتاژ کنید.
چگونه ربات حلکننده هزارتو بسازیم؟
برای مونتاژ ربات، اگر از همان قطعاتی که من استفاده کردم بهره ببرید، هیچ مانع جدی در فرآیند وجود نخواهد داشت. با این حال، اگر قطعات را ارتقا دهید، ممکن است نیاز به تغییرات جزئی باشد.
یکی از مهمترین نکات، فاصله و محل قرارگیری هر سنسور است. قرارگیری نادرست ممکن است باعث حرکتهای ناصحیح شود. همچنین کمی کالیبراسیون لازم است تا ربات بهدرستی حرکت کند.

در تصویر بالا، ربات مونتاژ شده را مشاهده میکنید. فرآیند مونتاژ ساده و سرراست است. سنسورها در فاصله صحیح قرار گرفته و از طریق آزمایشها بررسی شدهاند. سنسورها با سیمهایی متصل شدهاند که به ماژول درایور موتور لحیم شدهاند.
کد Arduino ربات حلکننده ماز
ربات حلکننده ماز از سنسورهای IR برای تشخیص موانع استفاده میکند و با بهرهگیری از یک الگوریتم تصمیمگیری منطقی، مسیر خود را در ماز پیدا میکند. حرکت ربات از طریق موتورهای DC که با Arduino Motor Shield V1 متصل شدهاند، کنترل میشود. در ادامه توضیح دقیقی از کد ارائه شده است. توجه داشته باشید که این کد صرفاً برای یافتن خروجی ماز نوشته شده و مسیر کوتاهترین مسیر را پیدا نمیکند، اما در صورت علاقه میتوانید الگوریتم خود را برای یافتن کوتاهترین مسیر پیادهسازی کنید.
کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است. در اینجا قسمت های مختلف کد را بررسی میکنیم.
کتابخانههای استفاده شده
AFMotor: این کتابخانه موتورهای DC را با استفاده از Arduino Motor Shield V1 کنترل میکند و با توابعی مانند setSpeed() و run() کنترل موتور را ساده میکند.
#include <AFMotor.h> AF_DCMotor motorA(1); AF_DCMotor motorB(2);
ثوابت و متغیرها
سنسورهای IR به پینهای آنالوگ A0، A1 و A2 اختصاص داده شدهاند که به ترتیب برای سنسورهای چپ، جلو و راست هستند. سرعت موتور و تاخیرهای چرخش نیز با استفاده از ثوابت تعریف شده تا حرکت دقیق کنترل شود.
const int leftSensor = A0; const int frontSensor = A1; const int rightSensor = A2; const int forwardSpeed = 120; const int TurningSpeed = 115; const int turnDelay = 25; const int uTurnDelay = 50;
تابع setup
تابع setup() سنسورهای IR را بهعنوان ورودی برای تشخیص موانع مقداردهی اولیه میکند و ارتباط سریال را برای اهداف دیباگ تنظیم میکند.
void setup() {
pinMode(leftSensor, INPUT);
pinMode(frontSensor, INPUT);
pinMode(rightSensor, INPUT);
Serial.begin(9600);
} حلقه اصلی
تابع loop() بهطور مداوم دادهها را از سنسورهای IR میخواند و حرکات ربات را با استفاده از منطق switch-case تعیین میکند. مقادیر سنسورها (0 یا 1) بهصورت باینری ترکیب شده تا وضعیت فعلی ماز شناسایی شود (مثلاً مسیر جلو، چپ، راست یا بدون مسیر). بر اساس وضعیت، توابع حرکتی مانند moveForward()، turnLeft()، turnRight() یا uTurn() فراخوانی میشوند.
void loop() {
int leftValue = digitalRead(leftSensor);
int frontValue = digitalRead(frontSensor);
int rightValue = digitalRead(rightSensor);
int sensorState = (leftValue << 2) | (frontValue << 1) | rightValue;
switch (sensorState) {
case 0b000:uTurn();break;
case 0b010:moveForward();break;
case 0b111:turnLeft();break;
case 0b100:turnLeft(); break;
case 0b110:turnLeft();break;
case 0b001:turnRight();break;
case 0b011:turnRight();break;
case 0b101:stopMotors();break;
default:stopMotors();break;
}
} عملکرد ربات حلکننده ماز
پس از آپلود کد روی ربات مونتاژ شده از طریق Arduino IDE، زمان تست فرا میرسد. ویدیو کامل عملکرد این ربات در پایین صفحه نشان داده شده است، اما برای درک بهتر، مراحل کار را بهصورت گامبهگام بررسی میکنیم.
گام 1: موقعیت شروع
ربات از ورودی ماز شروع میکند و الگوریتم دست چپ را دنبال میکند، به این معنی که همیشه سنسور یا سمت چپ خود را در کنار دیوار نگه میدارد.

گام 2: تصمیمگیری در چهارراه
اولین چهارراه یک تقاطع سهراهی است. طبق الگوریتم، ربات مسیر سمت چپ را انتخاب میکند. اگر چهارراه فقط مسیرهای راست و چپ داشته باشد، اولویت همیشه به سمت چپ داده میشود.

گام 3: چرخش در گوشهها
ربات با دو گوشه راست مواجه میشود. از آنجایی که هر دو گوشه به سمت راست خم میشوند، ربات طبق انتظار به سمت راست میچرخد.

گام 4: تصمیمگیری در چهارراه دوم
چهارراه بعدی نیز یک تقاطع سهراهی است، اما مسیرها بهصورت مستقیم و چپ هستند. با پیروی از الگوریتم دست چپ، ربات به سمت چپ میچرخد.

گام 5: چرخش گوشهها
مانند گوشههای قبلی، ربات در گوشه به سمت راست میچرخد.

گام 6: حرکت نهایی
چهارراه نهایی شبیه به اولین چهارراه است و مسیرهای راست و چپ ارائه میدهد. ربات مسیر چپ را انتخاب میکند که منجر به رسیدن به مقصد میشود.

در طول تست، متوجه میشوید که ربات مسیر کاملاً مستقیمی طی نمیکند. این مشکل به دلیل سرعت نابرابر موتورهای چپ و راست رخ میدهد. برای رفع این مشکل میتوانید از روش چهارچرخ محرک برای تعادل و پایداری بهتر استفاده کنید.
حرکت ربات را میتوان با جدول درستی ارائه شده در کد نیز بررسی کرد. ربات همانطور که انتظار میرود، با موفقیت ماز را پیمایش میکند.
نتیجهگیری و بهبودهای آینده
اگر تا اینجا پیش رفتهاید، به خودتان تبریک بگویید، زیرا موفق به ساخت یک ربات حلکننده ماز ساده شدهاید. بهترین بخش این پروژه این است که میتوانید آن را بهراحتی توسعه داده و با الگوریتمهای پیچیدهتر آزمایش کنید. کمی استراحت کنید و با ربات بازی کنید، الگوهای مختلف ماز بسازید و ببینید ربات چگونه آنها را حل میکند. بهزودی متوجه خواهید شد که این ربات قادر به حل مازهای پیچیده نیست و قطعاً سریعترین ربات حلکننده ماز موجود نیست. اکنون میتوانید با برنامهنویسی، ربات را طوری کدنویسی کنید که سریعتر ماز را حل کرده و کوتاهترین مسیر را پیدا کند. این کار به شما امکان میدهد در مسابقات رباتهای حلکننده ماز شرکت کنید و ربات خود را برای حل مازهای پیچیده به چالش بکشید و با مهندسین دیگر رقابت کنید. پروژههای عملی DIY الکترونیک را با دیاگرام مدار کامل، کد و دستورالعملهای ساده و قابل دنبال کردن کشف کنید.
موارد موجود در فایل : سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود







