AGV چیست؟ (برای مبتدی)
AGV (Automated Guided Vehicle) یک وسیله نقلیه زمینی است که بدون راننده و بر اساس یک مسیر از پیش تعریفشده حرکت میکند. سادهترین نوع AGV از یک خط سیاه روی زمین پیروی میکند — سنسورهای IR در زیر ربات تفاوت روشنایی خط سیاه و زمین سفید را تشخیص میدهند.
در انبارهای صنعتی مدرن (مثل انبار آمازون)، AGVها قفسهها را جابجا میکنند. نسخه DIY این پروژه یک پایه عالی برای یادگیری مفاهیم کنترل خودکار، سنسورهای IR، و کنترل PID سرعت است.
ما از یک آرایه سنسور IR به نام TCRT5000 x 5 استفاده میکنیم — ۵ سنسور کنار هم که موقعیت دقیق خط را تعیین میکنند. کنترل موتور از طریق L298N (H-Bridge درایور موتور) انجام میشود.
محصولی که میسازید
یک AGV دو-چرخ متحرک که مسیر خط سیاه را دنبال میکند، در ایستگاهها میایستد و با تنظیم PWM سرعت را کنترل میکند.
- زمان ساخت: ۳ تا ۵ ساعت
- هزینه: ۵۰۰ تا ۸۰۰ هزار تومان
- سرعت: ۰.۵-۱ m/s قابل تنظیم
قطعات لازم (BOM)
| قطعه | نقش |
|---|---|
| Arduino Nano | کنترلر اصلی |
| TCRT5000 Sensor Array × ۵ | تشخیص خط |
| L298N Motor Driver | کنترل ۲ موتور DC |
| موتور DC Geared 100RPM × ۲ | محرک چرخها |
| شاسی ۲ چرخ دیفرانسیل | پایه ربات |
کد Arduino — کنترل PD Line Following
const int SENSOR[5] = {A0,A1,A2,A3,A4};
const int IN1=7, IN2=8, ENA=9, IN3=10, IN4=11, ENB=6;
const int BASE_SPEED = 150;
float Kp = 40, Kd = 20;
int lastError = 0;
int readLine() {
int val[5]; int sum=0, wSum=0;
for(int i=0;i<5;i++){
val[i] = (analogRead(SENSOR[i]) > 500) ? 1 : 0;
sum += val[i];
wSum += val[i] * (i * 1000);
}
if(sum==0) return lastError > 0 ? 4000 : 0;
return wSum / sum;
}
void setMotors(int lSpd, int rSpd) {
lSpd = constrain(lSpd, -255, 255);
rSpd = constrain(rSpd, -255, 255);
digitalWrite(IN1, lSpd > 0); digitalWrite(IN2, lSpd <= 0);
analogWrite(ENA, abs(lSpd));
digitalWrite(IN3, rSpd > 0); digitalWrite(IN4, rSpd <= 0);
analogWrite(ENB, abs(rSpd));
}
void setup() {
int pins[] = {IN1,IN2,IN3,IN4};
for(int p : pins) pinMode(p, OUTPUT);
Serial.begin(9600);
}
void loop() {
int pos = readLine();
int error = pos - 2000; // ۲۰۰۰ = وسط (سنسور ۲ از ۰)
int correction = Kp * error + Kd * (error - lastError);
lastError = error;
setMotors(BASE_SPEED + correction, BASE_SPEED - correction);
delay(10);
}
چکلیست تنظیم
| تست | نتیجه |
|---|---|
| روی خط سیاه: سنسور وسط ۱ میشود؟ | بله — Serial Monitor |
| ربات خط مستقیم را دنبال میکند؟ | بله — Kp تنظیم کنید |
| ربات در پیچ ۹۰ درجه نمیایستد؟ | Kd را افزایش دهید |
| در انتهای خط متوقف میشود؟ | کد توقف sum==0 اضافه کنید |