Rad efterföljare Robot - PID Control - Android Setup (7 / 12 steg)
Steg 7: Kontrollera riktning (proportionell reglering - P)
Perfekta! Vid denna punkt, är vår Robot monterade och operativa. Bör du utföra några grundläggande tester med motorer, läsa utdata från sensorer och testa dem över en linje. Vad som saknas är verkligt "hjärna", de första stegen i en "artificiell intelligens". Vi kommer att få detta, genomföra en logik som kommer att garantera att roboten kommer att hållas efter linjen.
Enkla proportionell reglering:
Anta att roboten kör över en linje och Sensor Array utdata är: "0 0 1 0 0". Korrespondent felet är "0". i denna situation, kommer båda motorer att köra framåt på en konstant hastighet:
Exempelvis med iniMotorSpeed = 250; innebär att vänster Servo får pulser av 1, 250us och rätt Servo 1, 750us och roboten kommer att gå framåt på halvfart. Kom ihåg att den rätten Servo farten framåt kommer att variera med puls längd från 1, 500us (slutat) till 2, 000us (full hastighet) och vänster Servo från 1, 500us (slutat) till 1, 000us (full hastighet).
rightServo.writeMicroseconds(1500 + iniMotorPower);
leftServo.writeMicroseconds (1500 - iniMotorPower);
Antag nu att Roboten drivs till vänster (det är som "linjen går till höger") och täckte också sensor 3. Matrisen produktionen kommer att vara: "0 0 1 1 0" och fel = 1. I denna situation är vad du behöver flytta roboten till höger. För att göra det, måste du minska hastigheten på höger Servo vad innebär minska längden på pulsen". Även hastigheten på vänster Servo måste öka, vad betyder minska längden på vänster servo pulsen. För att göra det, måste vi ändra funktionen motorisk kontroll:
rightServo.writeMicroseconds (1500 + iniMotorPower - fel); == > Positiva fel: minska hastigheten
leftServo.writeMicroseconds (1500 - iniMotorPower - fel); == > Positiva fel: öka hastigheten
Ovanstående logik är korrekt, men det är lätt att förstå att att "1" mikrosekund på puls längd eller inte kommer att generera nödvändiga korrigeringen på en realistisk tid. Det är intuitivt att numret för att lägga till eller subtraheras bör vara större. till exempel 50, 100, etc. För att få det, måste "fel" multipliceras med en konstant "K". När påverkan av denna konstant kommer att vara proportionell mot felet, vi kommer att kalla den "proportionell konstanten: Kp).
Den motoriska funktionen kommer att vara:
int Kp = 50;
rightServo.writeMicroseconds (1500 + iniMotorPower - Kp * fel);
leftServo.writeMicroseconds (1500 - iniMotorPower - Kp * fel);
Vi kan återuppta vad kommer att hända med motorerna som visas nedan:
- Sensor Array: 0 0 1 0 0 == > fel = 0 == > höger Servo puls längd = 1, 750us == > vänster Servo puls längd = 1, 250us (båda motorer med samma hastighet)
- Sensor Array: 0 0 1 1 0 == > fel = 1 == > höger Servo puls längd = 1, 700us (långsammare) == > vänster Servo puls längd = 1, 200us (snabbare)
Om situationen är motsatsen och Roboten drivs till höger, felet skulle vara "negativa" och hastigheten på servon ska ändra:
- Sensor Array: 0 0 1 0 0 == > fel = 0 == > höger Servo puls längd = 1, 750us == > vänster Servo puls längd = 1, 250us (båda motorer med samma hastighet)
- Sensor Array: 0 1 1 0 0 == > fel = -1 == > höger Servo puls längd = 1, 800us (snabbare) == > vänster Servo puls längd = 1, 300us (långsammare)
På denna punkt är uppenbart att så mycket Roboten drivs åt sidan, större blir felet och snabbare det måste återvända till center. Hastigheten med Robot kommer reagera och felet kommer att stå i proportion till det.