Stap 7: Beheersing van richting (proportionele Control - P)
Perfect! Op dit punt, is onze Robot gemonteerd en operationeel. Moet u enkele elementaire proeven met de motoren, leest de output van de sensoren en testen ze over een lijn. Wat ontbreekt is de echte "hersenen", de eerste stappen van een "artificial intelligence". Zullen we dit, uitvoering van een controle-logica waarmee kan worden gegarandeerd dat de Robot zal worden gehouden volgt op de regel.
Eenvoudige proportionele controle:
Veronderstel dat de Robot over een lijn wordt uitgevoerd en de uitvoer van de Sensor Array: "0 0 1 0 0". De correspondent fout is "0". in deze situatie, zal beide motoren vooruit op een constante snelheid worden uitgevoerd:
Bijvoorbeeld, met iniMotorSpeed 250 =; betekent dat links Servo pulsen van 1, 250us en rechts Servo 1 ontvangt, 750us en de Robot zal vooruit op halve snelheid. Vergeet niet dat de voorwaartse snelheid recht Servo met pulslengte van 1, 500us variëren zal (gestopt) naar 2, 000us (volledige snelheid) en de links Servo van 1, 500us (gestopt) naar 1, 000us (volledige snelheid).
rightServo.writeMicroseconds(1500 + iniMotorPower);
leftServo.writeMicroseconds (1500 - iniMotorPower);
Stel nu dat de Robot gedreven naar links (het is als de "lijn gaat naar rechts") en vallen ook de sensor 3. De output van de Array zal zijn: "0 0 1 1 0" en de fout = 1. In deze situatie is wat je nodig hebt draai de Robot naar rechts. Om dat te doen, moet u Verlaag de snelheid van recht Servo wat betekent afname van de lengte van de pols". Ook de snelheid van links Servo moet toenemen, wat betekent verlagen van de lengte van de linker servo-puls. Om dat te doen, moeten we veranderen van de motorische controle-functie:
rightServo.writeMicroseconds (1500 + iniMotorPower - fout); == > Positieve fout: snelheid verminderen
leftServo.writeMicroseconds (1500 - iniMotorPower - fout); == > Positieve fout: verhogen van de snelheid
De bovenstaande logica is juist, maar het is gemakkelijk te begrijpen dat toe te voegen of af te trekken "1" microseconde op impulslengte niet de vereiste correctie op een realistische tijd zal genereren. Het is intuïtief dat het nummer te zijn toevoegen of afgetrokken moet groter zijn. bijvoorbeeld 50, 100, enz. Als u dat, moet de "fout" worden vermenigvuldigd met een constante "K". Eens de invloed van deze constante evenredig is met de fout zullen, we het zullen noemen ' proportionele constante: Kp).
De motor functie zal zijn:
int Kp = 50;
rightServo.writeMicroseconds (1500 + iniMotorPower - Kp * fout);
leftServo.writeMicroseconds (1500 - iniMotorPower - Kp * fout);
We kunnen hervatten wat er zal gebeuren met de motoren als getoond balg:
- Sensor-Array: 0 0 1 0 0 == > fout = 0 == > recht Servo pulslengte = 1, 750us == > links Servo pulslengte = 1, 250us (beide motoren met dezelfde snelheid)
- Sensor-Array: 0 0 1 1 0 == > fout = 1 == > recht Servo pulslengte = 1, 700us (langzamer) == > links Servo pulslengte = 1, 200us (sneller)
Als de situatie het tegenovergestelde is en de Robot gedreven naar rechts, de fout zou "negatieve" en de snelheid van de servo's moet veranderen:
- Sensor-Array: 0 0 1 0 0 == > fout = 0 == > recht Servo pulslengte = 1, 750us == > links Servo pulslengte = 1, 250us (beide motoren met dezelfde snelheid)
- Sensor-Array: 0 1 1 0 0 == > fout = -1 == > recht Servo pulslengte = 1, 800us (sneller) == > links Servo pulslengte = 1, 300us (langzamer)
Op dit punt is duidelijk dat zo veel de Robot gedreven aan de ene kant, groter de fout worden zal en het moet sneller terug naar center. De snelheid met de Robot zal reageren op de fout zal worden evenredig aan het.