3pi roboti lihtsa joonejärgimise algoritmi kasutamisel on näha, et robot sõidab mööda joont kergelt sikk-sakk meetodil. Lisaks võib suurematel kiirustel robot kergesti joone pealt välja sõita. Sujuvamaks liikumiseks on võimalik lisada juurde andureid, et joonel olekut paremini kontrollida, kuid see lisab juurde riistvara ja võib tekitada uusi probleeme. Parem lahendus on täiendada roboti tarkvara PID regulaatoriga. Nii saab olemasolevate anduritega roboti väga sujuvalt joont järgima panna. PID regulaatori kasutamisel on põhiline keerukus regulaatori komponentide mõju seadistamine. PID regulaatori puhul on 3 komponenti
Regulaator ei pea alati sisaldama kõiki kolme parameetrit. Olenevalt süsteemist on lihtsam piirduda ühe parameetri või kahe parameetri kombinatsiooniga: P, PI, PD, I, ID.
Otsene mõju juhtimisele ehk mida kaugemal on robot seatud olekust, seda suurem on mõju. Tegemist on üldjuhul esmase komponendiga, mis lisatakse PID regulaatorisse. Proportsionaalse komponendi suurendamisel robot püsib paremini joonel, kuid kaotab kiiruses. Liiga väikse proportsionaalse komponendi korral hakkab robot perioodiliselt kalduma kord ühele, kord teisele poole joont.
Veale liidetakse enne PID arvutamise tsüklit juurde uus viga ehk kokkuvõttes võib integraalne komponent kasvada väga kiirelt väga suureks (olenevalt kui kaua võtab üks PID tsükkel aega). Integraalset komponenti kasutatakse staatilise vea vähendamiseks ehk kui robot ei suuda piisavalt kiirelt joonele tagasi jõuda, siis integraalne osa aitab seda kiirendada. Üldiselt integraalne osa on üsna väike suurus võrreldes teiste komponentidega, sest võib kiirelt äärmustesse kasvada. Mõnikord on vaja integraalse komponendi muutuja suurust piirata, et ei tekiks muutuja ületäituvust (overflow).
Arvutab iga tsükli korral välja vea muutumise tõusu, et ennustada ette vea muutust. Diferentseeriv komponent on kasulik juhtudel kui robot jääb P ja I regulaatori korral veel joonel liikudes võnkuma. Joonest liiga kiirelt kaugenedes diferentseeriv komponent suurendab väljundit ja liiga kiirelt lähenedes vähendab väljundit, et joonest üle ei läheks.
Seadesuurus (Setpoint) on joonejärgija roboti puhul positsioon, kus joone kulgemise telg ühtib roboti keskteljega. Selle suuruse järgi leiab vea ehk nihke soovitud positsioonist:
viga = hetke_positsioon - seadesuurus;
3pi roboti andurite summa on vahemikus 0 kuni 4000. Keskkoht ehk soovitud seadesuurus on seega 2000. Andurite summa muutub antud valemi järgi vahemikus -2000 kuni 2000.
Proportsionaalne komponent on juba leitud eelmises punktis ehk on võrdne otsese veaga. Integraalse komponendi puhul liidetakse iga PID regulaatori tsükli läbimisel veale juurde uus viga:
integraalne = integraalne + viga;
Derivatiivne komponent eeldab eelmise PID regulaatori tsüklist otsese vea meelde jätmist. Selleks tuleb pärast derivatiivse komponendi arvutamist lisada koodirida eelmise vea meelde jätmiseks. Derivatiivse komponendi arvutamine ise on järgmine:
derivatiivne = eelmine_viga - viga; eelmine_viga = viga; // programmis lisada pärast output arvutamist
PID regulaatori komponentide mõju kiiremaks ja lihtsamaks seadistamiseks on kõige parem kasutada võimendustegureid, mis suurendavad või vähendavad komponendi mõju. ATmega328p on võimeline arvutama ujukomaarve, aga on selle tegemise juures palju aeglasem, kui täisarvude puhul. Seega on efektiivsem teostada arvutused täisarvudega korrutamise ja jagamise tehetega. Selle tõttu on iga komponendi kohta 2 võimendustegurit.
#define KP 1 #define KP_ 20 #define KI 1 #define KI_ 10000 #define KD 3 #define KD_ 2
PID väljundiks on täisarv, sest mootorite juhtimisel ei kasutata ujukoma arve. PID regulaatori tulemus on kõigi komponentide summa:
output = viga*KP/KP_ + integraalne*KI/KI_ + derivatiivne*KD/KD_;
Väljundit tuleb piirata, et see ei ületaks mootorite maksimaalset kiirust.
if(output > motor_max_speed) output = motor_max_speed; if(output < -motor_max_speed) output = -motor_max_speed;
Mootorite juhtimine on erinev negatiivse ja positiivse PID regulaatori väljundi puhul. Kasutatakse negatiivse tagasisidega juhtimist, mis tähendab, et üks ratas liigub täiskiirusel ja vastavalt väljundi suurusele pidurdatakse teist. Arvestades 3pi andrurite tagastatavat summat 0-4000 (0 vasakul ja 4000 paremal), siis tuleb negatiivse väljundi puhul pidurdada vasakut ja positiivse korral paremat ratast. 3pi mootorite juhtimisel on võimalik kasutada väärtuseid -255 kuni 255.
if(output > 0) { mootor_vasak = motor_max_speed; mootor_parem = motor_max_speed - output; } else { mootor_vasak = motor_max_speed + output; mootor_parem = motor_max_speed; }
Kõigi programmi osade kokkupanekul olemasoleva joonejärgimise algoritmiga tekib PID regulaatoriga robot, mis suudab saavutada joonel püsides suuremaid kiirusi. PID võimendustegurite seadistamisel tuleb varuda kannatust, sest ainult pideva katsetamisega saab parima tulemuse. Korraga on soovitav muuta ainult ühte parameetrit, et muutus oleks paremini jälgitav. Alustada võib nende väärtustega, mis on eelpool välja toodud ja kiirus panna umbes poole peale maksimumist. Kui väiksema kiiruse peal on hea tulemus kätte saadud, siis edasi võib järjest kiirust suurendada. Võimendustegurite seadistamise jaoks leidub Internetist mitmeid näpunäiteid, kuid täpset juhendit selle jaoks ei ole, sest iga süsteem on eriline ja toimib erinevalt. Samuti esineb väga palju erinevaid hästitoimivate parameetrite kombinatsioone.