Předpokládám, že sledovač ztrácí čáru jen v prudších zatáčkách. Podle algoritmu by měla být větší pravděpodobnost, že ztratí čáru v zatáčce doprava. Je to tak?
Přesnost enkodérů není úplně dokonalá, jak jsem to i očekával a zmiňoval dříve. Můžeš se ještě pokusit "dorovnat" tu přímou jízdu programově. Základní myšlenka tohoto přístupu je v tom, že průběžně čteme stav obou enkodérů a pokud jeden z nich začne "zaostávat" (má napočítáno méně, než druhý), tak na příslušném kole přidáme rychlost.
Reálně se to dá udělat úpravou funkce "rovne" např. nějak takto:
Kód: Vybrat vše
void rovne(u16 vzdalenost) { // vzdalenost je v cm
encoder_reset();
vzdalenost = vzdalenost*1.8; // prevod vzdalenosti z cm na impulzy (konstantu nutno doladit)
u16 levy = encoder_get_left();
u16 pravy = encoder_get_right();
i16 rozdil = levy - pravy;
motor_run(160,-160);
while (levy<vzdalenost) { // dokud neujedeme danou vzdalenost, udrzujeme jizdu rovne
levy = encoder_get_left();
pravy = encoder_get_right();
rozdil = levy - pravy;
if (rozdil>0) motor_run(120,-200); // pravy ma malo, pridame rychlost pravemu kolu
else if (rozdil<0) motor_run(200,-120); // levy ma malo, pridame rychlost levemu kolu
else motor_run(160,-160); // oba enkodery napocitaly stejne, jedeme rovne
led_display_hex(levy);
}
motor_run(0,0);
}
Určitě by se ten algoritmus dal vylepšit, ale toto je prostě alespoň základ pro vyzkoušení. Přiznám se, že s podobným "korigováním směru" pomocí enkodérů jsem si hrál před pár lety, ale výsledky nebyly uspokojivé. Tak uvidíme, jak na tu "opravovací" snahu bude reagovat Yrobot.
P.S.: Proč tak důkladně odstraňuješ ty moje komentáře z programu? Ničemu nevadí a program jde přeložit i s nimi (a výsledný binární kód je stejný).