فرمان Ackermann چیست و چرا از Differential Drive بهتر است؟
در سیستم فرمان Ackermann، چرخهای جلو در پیچ زاویههای متفاوتی دارند تا همه چرخها حول یک نقطه مشترک بچرخند — بدون سُر خوردن. این همان سیستمی است که در تمام خودروها استفاده میشود. در مقابل، Differential Drive با سُر چرخها میچرخد که برای محیطهای خاکی یا موزاییک مشکلساز است.
برای UGV مبتنی بر Ackermann، یک سرو فرمان را کنترل میکنیم + یک موتور DC برای پیشرانش — دقیقاً مثل یک ماشین RC تجاری اما با کنترل کامل کد.
🛠️ کارت پروژه
| پایه | شاسی ماشین RC ۱:۱۰ اسکرپ یا جعبه ماشین ارزان |
| بودجه | ~۵۰۰K (با شاسی RC) |
| حداقل شعاع پیچ | ~۳۰cm برای wheelbase ۲۰cm |
محاسبه زاویه فرمان
برای Ackermann: tan(δ) = L / R که L = wheelbase و R = شعاع پیچ است.
با L=20cm و R=30cm: δ = atan(20/30) = 33.7° — زاویه فرمان داخلی. زاویه خارجی: atan(20/(30+15)) = 24°.
BOM
| قطعه | قیمت |
|---|---|
| شاسی ماشین RC ۱:۱۰ (یا DIY آلومینیوم) | ~۲۰۰K |
| سرو MG996R برای فرمان | ~۱۵۰K |
| موتور DC 12V + گیربکس برای پیشرانش | ~۱۵۰K |
| Arduino Uno | ~۱۵۰K |
| L298N | ~۸۰K |
کد کنترل Ackermann
#include <Servo.h>
Servo steer;
#define THROTTLE_IN1 7
#define THROTTLE_IN2 8
#define THROTTLE_ENA 9
const int STEER_CENTER = 90; // درجه
const int STEER_MAX = 35; // ±35 درجه از مرکز
void setup(){
steer.attach(10);
steer.write(STEER_CENTER);
pinMode(THROTTLE_IN1,OUTPUT);
pinMode(THROTTLE_IN2,OUTPUT);
pinMode(THROTTLE_ENA,OUTPUT);
}
// steering: -100 (کامل چپ) تا +100 (کامل راست)
// throttle: -100 (برعکس) تا +100 (جلو)
void control(int steering, int throttle){
int servoAngle = STEER_CENTER + map(steering,-100,100,-STEER_MAX,STEER_MAX);
steer.write(constrain(servoAngle,STEER_CENTER-STEER_MAX,STEER_CENTER+STEER_MAX));
int spd = map(abs(throttle),0,100,0,255);
digitalWrite(THROTTLE_IN1, throttle>0?HIGH:LOW);
digitalWrite(THROTTLE_IN2, throttle>0?LOW:HIGH);
analogWrite(THROTTLE_ENA, spd);
}
void loop(){
// مثال: جلو با انحراف ۵۰٪ به راست
control(50, 80);
delay(2000);
control(0, 0);
delay(1000);
}