Linje följande Robot med grundläggande PD (proportionell-derivat) kontroll (5 / 6 steg)
Steg 5: Granska den raden efter rutin
Linjen efter rutin hanterar beräkningar och felhantering.
void follow_line (int line_position) //follow linjen
{
Switch(line_position)
{
Dessa fall hantera situationen där linjen är förlorad och försök att rotera tillbaka till raden
linjen har flyttat utanför den vänstra kanten av sensor
fall 0:
digitalWrite (dir_a, låg);
analogWrite (pwm_a, 200);
digitalWrite (dir_b, hög);
analogWrite (pwm_b, 200);
Serial.println ("rotera Left\n");
bryta;
linjen har flyttat bort rätt redigera sensorn
fall 7000:
digitalWrite (dir_a, hög);
analogWrite (pwm_a, 200);
digitalWrite (dir_b, låg);
analogWrite (pwm_b, 200);
Serial.println ("rotera Right\n");
bryta;
Denna linje beräkna felet för det kontrollerar kretsar. 3500 är "börvärde" och kan justeras för att flytta linjen position roboten är skytte för.
standard:
fel = (float) line_position - 3500;
motorisk hastighet baserat på proportionell och derivat PID villkor
KP är den en floating-point proportionell konstant (kanske börja med ett värde runt 0,5)
KD är floating-point härledda konstant (kanske börja med ett värde runt 1)
Observera att när du gör PID, det är mycket viktigt att du får din tecken rätt eller annat i
kontrollerar kretsar blir instabil
Dessa är de variabler som bör anpassas för att finjustera det kontrollerar kretsar
KP =. 5. Är proporational värde
KD = 1; Detta är härledda värdet
PV = kp * fel + kd * (fel - lastError);
lastError = fel;
PWM värden (varvtal) måste vara mellan 0 och 255. Denna kod begränsar värdena. Det begränsar också den lägre delen av PWM-värde. Beroende på batterier, motorer och last, kommer motorerna vanligtvis stannar vid ett mycket större värde 0. I det här exemplet är den lägre delen 170.
Detta koder gränser PV (varvtal pwm-värde)
Limit PV till 55
om (PV > 55)
{
PV = 55.
}
om (PV < -55)
{
PV = -55;
}
Detta beräknas den enskilda PWM-värdet för varje motor, Observera tecken skillnaden.
m1Speed = 170 + PV;
m2Speed = 170 - PV;
ställa in motor hastigheter
Detta anger den uppdaterade motor hastighet och riktning
digitalWrite (dir_a, låg);
analogWrite (pwm_a, m2Speed);
digitalWrite (dir_b, låg);
analogWrite (pwm_b, m1Speed);
bryta;
}
} / / end Följ linje