ربات تشخیص مانع یعنی چه؟ (برای کسی که تا امروز ندیده)
ربات تشخیص مانع (Obstacle Avoidance Robot) یک وسیله متحرک کوچک است که بدون دخالت انسان، وقتی به مانعی نزدیک میشود، خودش میایستد و مسیرش را عوض میکند. این کار را با کمک یک سنسور اولتراسونیک انجام میدهد — قطعهای که دقیقاً مثل خفاش کار میکند: یک پالس صوتی با فرکانس بالا ارسال میکند، منتظر میماند تا صدا به مانع برخورد کند و برگردد، سپس با توجه به زمان رفتوبرگشت، فاصله را با دقت سانتیمتر محاسبه میکند.
محبوبترین سنسور اولتراسونیک برای مبتدیان، HC-SR04 است؛ ارزان (زیر ۵۰ هزار تومان)، ساده، و با آردوینو خیلی راحت کار میکند. برد تشخیص آن ۲ تا ۴۰۰ سانتیمتر است که برای اکثر پروژههای رباتیک خانگی کافی است.
آردوینو Nano مغز این پروژه است — یک برد کوچکتر و ارزانتر از Arduino Uno که همان قدرت را دارد و روی بردبرد خیلی بهتر جا میشود. L298N هم یک درایور موتور دو کانال است که به آردوینو اجازه میدهد دو موتور DC را با جهت و سرعت مستقل کنترل کند. ترکیب این سه قطعه با یک شاسی ۲WD آماده، یک ربات عملی و آموزنده میسازد که میتوانید همین امروز شروع کنید.
محصولی که میسازید
یک ربات دوچرخ خودکار که با سنسور اولتراسونیک موانع را تشخیص میدهد، متوقف میشود، به سمت مسیر باز میچرخد و ادامه میدهد — تمام اینها بدون هیچ دخالت دستی.
- زمان ساخت: ۲ تا ۴ ساعت
- سطح: مبتدی کامل
- هزینه تقریبی: ۵۰۰ هزار تا ۱ میلیون تومان
- ارتقای بعدی: اضافه کردن سروو برای چرخش سنسور، نمایش فاصله روی LCD
قطعات و ابزارهای لازم (BOM)
| قطعه | مدل پیشنهادی | نقش | تعداد |
|---|---|---|---|
| میکروکنترلر | Arduino Nano V3 | مغز ربات | ۱ |
| سنسور اولتراسونیک | HC-SR04 | تشخیص مانع | ۱ |
| درایور موتور | L298N Module | کنترل دو موتور | ۱ |
| شاسی و موتور | Smart Car Chassis 2WD Kit | حرکت | ۱ کیت |
| سروو موتور (اختیاری) | SG90 | چرخش سنسور | ۱ |
| باتری | 2S LiPo 1000mAh یا 4×AA | تغذیه | ۱ |
| سیم جامپر | Male-Male / Male-Female | اتصالات | ۲۰ عدد |
| ابزار | هویه، مولتیمتر، پیچگوشتی | مونتاژ | — |
مراحل ساخت گام به گام
مرحله ۱ — مونتاژ شاسی و نصب موتورها
شاسی ۲WD معمولاً شامل دو تخته اکریلیک، دو موتور DC گیربکسدار، دو چرخ لاستیکی، یک چرخ جلویی آزاد (Caster Wheel) و پیچ و مهره است. موتورها را طبق راهنمای کیت در کنارهای تخته پایین پیچ کنید. دقت کنید موتور چپ و راست را از هم جدا نگه دارید — در کد به آنها اشاره میکنیم.
مرحله ۲ — نصب برد Arduino Nano و L298N
Arduino Nano را روی تخته بالایی شاسی با دوطرفچسب یا پایه پیچ نصب کنید. L298N را کنارش قرار دهید. سیمهای موتور چپ را به خروجی OUT1/OUT2 و موتور راست را به OUT3/OUT4 وصل کنید. توجه: جهت موتور بعداً با کد قابل تنظیم است؛ الان فقط وصل کنید.
مرحله ۳ — نصب HC-SR04 در جلوی ربات
سنسور HC-SR04 باید دقیقاً رو به جلو و موازی با زمین نصب شود. میتوانید آن را با دوطرفچسب یا براکت پلاستیکی جلوی شاسی ببندید. اگر سروو SG90 دارید، آن را زیر سنسور نصب کنید تا سنسور بتواند چپ و راست را هم اسکن کند.
مرحله ۴ — سیمکشی کامل
جدول اتصالات:
| قطعه | پین قطعه | پین Arduino Nano |
|---|---|---|
| HC-SR04 | VCC | 5V |
| HC-SR04 | GND | GND |
| HC-SR04 | Trig | D9 |
| HC-SR04 | Echo | D10 |
| L298N | IN1 | D5 |
| L298N | IN2 | D6 |
| L298N | IN3 | D7 |
| L298N | IN4 | D8 |
| L298N | ENA / ENB | 5V (فعال ثابت) یا D3/D11 برای PWM |
| L298N | 12V / GND | باتری مستقیم |
| L298N | 5V OUT | VIN آردوینو (اگر ولتاژ باتری ≤ ۱۲V) |
مرحله ۵ — آپلود کد
Arduino IDE را باز کنید، برد را روی Arduino Nano و پروسسور را روی ATmega328P (Old Bootloader) تنظیم کنید. کد زیر را کپی کنید و آپلود کنید:
کد کامل
// ربات تشخیص مانع با HC-SR04 و L298N
// پروژه آموزشی — Project Leon
const int TRIG = 9;
const int ECHO = 10;
const int IN1 = 5;
const int IN2 = 6;
const int IN3 = 7;
const int IN4 = 8;
const int ENA = 3; // PWM برای سرعت موتور چپ
const int ENB = 11; // PWM برای سرعت موتور راست
const int STOP_DIST = 20; // سانتیمتر — اگر کمتر از این شد، بایست
const int SPEED_FULL = 200; // 0–255
const int SPEED_TURN = 180;
float getDistance() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long duration = pulseIn(ECHO, HIGH, 25000); // timeout 25ms
if (duration == 0) return 400; // سنسور چیزی ندید — مسیر باز
return duration * 0.0343 / 2.0;
}
void moveForward() {
analogWrite(ENA, SPEED_FULL); analogWrite(ENB, SPEED_FULL);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void stopMotors() {
analogWrite(ENA, 0); analogWrite(ENB, 0);
digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
}
void turnRight() {
analogWrite(ENA, SPEED_TURN); analogWrite(ENB, SPEED_TURN);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); // موتور چپ جلو
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); // موتور راست عقب
}
void setup() {
Serial.begin(9600);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
pinMode(ENA, OUTPUT); pinMode(ENB, OUTPUT);
Serial.println("Robot ready!");
}
void loop() {
float d = getDistance();
Serial.print("Distance: "); Serial.print(d); Serial.println(" cm");
if (d < STOP_DIST) {
stopMotors();
delay(300);
turnRight();
delay(500);
stopMotors();
delay(100);
} else {
moveForward();
}
delay(50);
}
چکلیست تست و تیون
| تست | نتیجه مورد انتظار | اگر درست نبود |
|---|---|---|
| سریال مانیتور را باز کنید — فاصله نمایش داده میشود؟ | عدد بین ۲ تا ۴۰۰ تغییر میکند | سیمهای Trig/Echo را چک کنید |
| مانع را جلوی سنسور بگذارید — میایستد؟ | موتورها قطع میشوند | STOP_DIST را افزایش دهید |
| پس از توقف — میپیچد؟ | تقریباً ۹۰ درجه میچرخد | delay چرخش را تنظیم کنید |
| ربات خط مستقیم میرود؟ | کج نمیرود | SPEED_FULL دو موتور را جداگانه تنظیم کنید |
| موتور گرم نمیشود؟ | دمای معمولی | SPEED_FULL را کم کنید |
ایدههای ارتقا
- اضافه کردن سروو SG90 برای چرخش سنسور و اسکن چپ/راست قبل از تصمیمگیری
- افزودن سنسور IR برای تشخیص لبه میز (Cliff Detection)
- نمایش فاصله روی صفحه OLED 128×64
- اضافه کردن ماژول HC-05 Bluetooth برای نظارت از گوشی
- جایگزین کردن L298N با BTS7960 برای موتورهای قویتر