🚧 درس 53: ربات فرار از مانع
اولین رباتی که واقعاً **تصمیم میگیرد**.
سطح: پیشرفته · زمان: حدود 17 دقیقه · مفاهیم: اولتراسونیک، سروو، تصمیم
قدمهای این درس
- از دنبال کردن تا تصمیم گرفتن
- قدم ۱ — سر چرخان
- قدم ۲ — وقتی هر دو طرف بسته است
- چالش: ربات کنجکاو
نمونهای از کد این درس
#include <Servo.h>
Servo head;
const int trig = 12, echo = 13;
const int l1 = 4, l2 = 5, lEn = 9;
const int r1 = 6, r2 = 7, rEn = 10;
void motors(int a, int b) {
digitalWrite(l1, a >= 0); digitalWrite(l2, a < 0);
analogWrite(lEn, a >= 0 ? a : -a);
digitalWrite(r1, b >= 0); digitalWrite(r2, b < 0);
analogWrite(rEn, b >= 0 ? b : -b);
}
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 setup() {
head.attach(11);
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
int pins[] = {l1, l2, lEn, r1, r2, rEn};
for (int i = 0; i < 6; i++) pinMode(pins[i], OUTPUT);
head.write(90);
delay(500);
Serial.begin(9600);
}
void loop() {
long ahead = lookAt(90);
Serial.print("jolo:");
Serial.println(ahead);
if (ahead > 25) {
motors(170, 170);
return;
}
motors(0, 0);
delay(200);
long right = lookAt(20);
long left = lookAt(160);
head.write(90);
if (left > right) motors(-160, 160);
else motors(160, -160);
delay(500);
motors(0, 0);
}
چرا این درس؟
دورهی تینکرکد فارسی تعاملی است: هر قدم را خودت داخل شبیهساز انجام میدهی — مدار واقعی میچینی، کد واقعی اجرا میکنی و نتیجه را همان لحظه میبینی. این درس روی درسهای قبلی ساخته شده، پس اگر تازه شروع کردهای از درس ۱ بیا!
این درس را رایگان در شبیهساز شروع کن 🎓