🚧 ربات مانعگریز — رباتی که خودش راه پیدا میکند
بعد از مسیریاب، این دومین ربات هر کسی است — و اولین باری است که ربات واقعاً تصمیم میگیرد بهجای اینکه فقط یک خط را دنبال کند.
ایده
ربات جلو میرود. اگر مانعی نزدیکتر از ۲۵ سانتیمتر دید، میایستد، به چپ و راست نگاه میکند و به سمتی میرود که فضای بیشتری دارد.
چطور «نگاه» میکند؟
سنسور اولتراسونیک را روی یک سروو سوار میکنی. سروو سر ربات را میچرخاند و در هر جهت فاصله را میخواند. این یک ترفند زیباست: با یک سنسور، دید سهجهته میگیری.
کد
#include <Servo.h>
Servo head;
const int trig = 9, echo = 10;
const int m1 = 5, m2 = 6; // درایور موتور
long look() {
digitalWrite(trig, LOW); delayMicroseconds(2);
digitalWrite(trig, HIGH); delayMicroseconds(10);
digitalWrite(trig, LOW);
long d = pulseIn(echo, HIGH, 30000);
return d == 0 ? 400 : d / 58;
}
long lookAt(int angle) {
head.write(angle);
delay(350); // به سروو وقت بده برسد
return look();
}
void forward() { analogWrite(m1, 160); analogWrite(m2, 160); }
void stopAll() { analogWrite(m1, 0); analogWrite(m2, 0); }
void turn(int l, int r) { analogWrite(m1, l); analogWrite(m2, r); }
void setup() {
head.attach(11);
pinMode(trig, OUTPUT); pinMode(echo, INPUT);
head.write(90);
delay(500);
}
void loop() {
if (lookAt(90) > 25) { // جلو باز است
forward();
return;
}
stopAll();
delay(200);
long right = lookAt(20);
long left = lookAt(160);
head.write(90);
if (left > right) turn(0, 180); // به چپ بچرخ
else turn(180, 0); // به راست بچرخ
delay(500);
stopAll();
}
سه نکته که تفاوت ایجاد میکند
- به سروو وقت بده. اگر بلافاصله بعد از
write()اندازه بگیری، سنسور هنوز نچرخیده و عدد بیمعنی است. - سروو را جدا تغذیه کن. سروو موقع چرخیدن جریان زیادی میکشد و ممکن است آردوینو ریست شود. GNDها را حتماً به هم وصل کن.
- سرعت را کم بگیر. ربات تندرو تا بفهمد مانعی هست، به آن خورده است.
قدم بعدی
اگر هر دو طرف بسته بود، ربات باید عقب برود و بچرخد — وگرنه در گوشه گیر میکند. این را خودت اضافه کن.
منطق ربات مانعگریز را تمرین کن 🚧