ربات خطدنبالکن یعنی چه؟ (برای مبتدی)
ربات خطدنبالکن (Line Follower) یکی از کلاسیکترین و آموزندهترین پروژههای رباتیک است. ربات یک خط سیاه روی زمین سفید (یا برعکس) را میبیند و دقیقاً روی آن حرکت میکند — مثل خطوط کارخانهای که AGVها (Automated Guided Vehicles) از روی آن مسیر خود را پیدا میکنند. این فناوری پایه سیستمهای لجستیک خودکار در انبارهای بزرگ است.
این ربات از سنسورهای IR (فروسرخ) برای دیدن خط استفاده میکند. یک LED فروسرخ نور ارسال میکند؛ سطح سفید نور را بازتاب میدهد و سطح سیاه آن را جذب میکند. یک فتودیود یا فتوترانزیستور این تفاوت را اندازه میگیرد. اکثر ماژولهای آماده IR یک پتانسیومتر برای تنظیم حساسیت دارند.
پیشرفتهترین نسخه این ربات از یک کنترلکننده PID استفاده میکند — همان الگوریتمی که در پهپادهای FPV و هواپیماهای خودکار به کار میرود. با PID، ربات بهجای on/off کردن، سرعت هر موتور را بهطور پیوسته تنظیم میکند و روی خط میماند.
دو نسخه که یاد میگیرید
نسخه ۱ — ساده (ON/OFF): برای اولین بار ساختن و درک اصول.
نسخه ۲ — PID: برای حرکت روانتر و سرعت بیشتر روی پیچها.
- زمان: ۲ تا ۴ ساعت
- هزینه: ۴۰۰ تا ۸۰۰ هزار تومان
- سطح: مبتدی (نسخه ۱) — متوسط (نسخه PID)
قطعات لازم (BOM)
| قطعه | مدل / تعداد |
|---|---|
| Arduino Nano | ۱ عدد |
| سنسور IR | TCRT5000 × ۵ عدد (یا ماژول ۵-تایی آماده) |
| درایور موتور | L298N یا TB6612FNG × ۱ |
| شاسی | کیت ۲WD با موتور گیربکسدار × ۱ |
| باتری | 4×AA یا LiPo 2S |
کد نسخه ۱ — ساده (ON/OFF)
// ربات خطدنبالکن — نسخه ساده
const int IR_L = A0; // سنسور چپ
const int IR_C = A1; // سنسور مرکز
const int IR_R = A2; // سنسور راست
const int IN1=5, IN2=6, IN3=7, IN4=8;
const int ENA=3, ENB=11;
const int SPD=200;
void fwd() { analogWrite(ENA,SPD); analogWrite(ENB,SPD); digitalWrite(IN1,HIGH);digitalWrite(IN2,LOW);digitalWrite(IN3,HIGH);digitalWrite(IN4,LOW); }
void left() { analogWrite(ENA,120); analogWrite(ENB,SPD); digitalWrite(IN1,LOW); digitalWrite(IN2,HIGH);digitalWrite(IN3,HIGH);digitalWrite(IN4,LOW); }
void right() { analogWrite(ENA,SPD); analogWrite(ENB,120); digitalWrite(IN1,HIGH);digitalWrite(IN2,LOW);digitalWrite(IN3,LOW); digitalWrite(IN4,HIGH); }
void stop_m(){ analogWrite(ENA,0); analogWrite(ENB,0); digitalWrite(IN1,LOW); digitalWrite(IN2,LOW); digitalWrite(IN3,LOW); digitalWrite(IN4,LOW); }
void setup() { for(int p:{IN1,IN2,IN3,IN4,ENA,ENB}) pinMode(p,OUTPUT); }
void loop() {
int L = analogRead(IR_L) < 400 ? 1 : 0; // 1 = روی خط سیاه
int C = analogRead(IR_C) < 400 ? 1 : 0;
int R = analogRead(IR_R) < 400 ? 1 : 0;
if (!L && C && !R) fwd();
else if (L && !R) left();
else if (!L && R) right();
else if (!C) stop_m(); // خط پیدا نشد
delay(10);
}
کد نسخه ۲ — PID پیشرفته
// ربات خطدنبالکن — کنترل PID (۵ سنسور)
const int S[5] = {A0, A1, A2, A3, A4}; // چپ به راست
const int IN1=5,IN2=6,IN3=7,IN4=8,ENA=3,ENB=11;
const int BASE_SPD = 180;
float Kp=25, Ki=0.01, Kd=15;
float prev_error=0, integral=0;
int readLine() {
int vals[5], sum=0, wsum=0;
for(int i=0;i<5;i++){
vals[i] = analogRead(S[i]) < 400 ? 1 : 0;
wsum += vals[i] * i * 1000;
sum += vals[i];
}
if(sum==0) return prev_error > 0 ? 4000 : 0;
return wsum / sum;
}
void setMotors(int l, int r) {
l = constrain(l, 0, 255); r = constrain(r, 0, 255);
analogWrite(ENA, l); analogWrite(ENB, r);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void setup() {
for(int p:{IN1,IN2,IN3,IN4,ENA,ENB}) pinMode(p, OUTPUT);
}
void loop() {
int pos = readLine(); // 0–4000 (مرکز = 2000)
float error = pos - 2000;
integral += error;
float derivative = error - prev_error;
float correction = Kp*error + Ki*integral + Kd*derivative;
prev_error = error;
int leftSpd = BASE_SPD + correction;
int rightSpd = BASE_SPD - correction;
setMotors(leftSpd, rightSpd);
delay(10);
}
تنظیم PID برای Line Follower
- اول Kp را تنظیم کنید: Ki=0 و Kd=0 بگذارید. Kp را افزایش دهید تا ربات روی خط بماند ولی نلرزد.
- بعد Kd: لرزش را کاهش میدهد. آهسته افزایش دهید.
- آخر Ki: برای خطای ماندگار در پیچهای تند. معمولاً خیلی کوچک.
چکلیست تست
| تست | نتیجه |
|---|---|
| پتانسیومتر سنسور IR تنظیم شده؟ | LED سنسور روی خط روشن / روی سفید خاموش |
| ربات روی خط مستقیم درست حرکت میکند؟ | بله |
| در پیچ ۹۰ درجه میچرخد؟ | بله |
| پس از از دست دادن خط برمیگردد؟ | با Kd بهتر میشود |