Dobře, "sledovač čáry" můžeme prohlásit za použitelný. Spolehlivost by sice měla být vyšší (klidně i 100 ujetých okruhů bez zaváhání), ale to může být námět pro případné další experimentování a vylepšování.
Pokud se teď chceš věnovat enkoderům, můžeme to zkusit. Díval jsem se na příklad "ENCODER_Tutorial" a podle mne v něm není nic zásadního, co by nebylo i v knihovně "yellow_robot". Ten "tutorial" vlastně nedělá nic rozumného (jen se točí kola při stisku tlačítka) a o využití enkodérů tam prakticky nic není. Proto doporučuji vyjít zase z knihovny "yellow_robot".
V knihovně "yellow_robot" jsou nadefinované užitečné funkce "void encoder_reset()" (vynuluje čítače enkodérů), "u16 encoder_get_right()" a "u16 encoder_get_left()" (vrací aktuální hodnotu čítače příslušného enkodéru). Tyto funkce se dají použít pro "odměřovanou jízdu".
Takže zkusím popsat, jak bych na to šel. Nejprve "pseudokód":
- načíst knihovnu "yellow_robot"
- definovat novou funkci "rovne(vzdalenost)" pro odměřovanou jízdu vpřed ("vzdalenost" je v cm)
- definovat novou funkci "otoc(uhel)" pro odměřované otočení o zadaný úhel (záporný úhel znamená otočení vlevo, jinak vpravo)
- hlavní program
-- init()
-- nekonečná smyčka (točí dokola dva níže uvedené příkazy)
--- jeď rovně 20 cm
--- otoč se o 90 stupňů vpravo
A teď první pokus o přepis do reálného kódu:
Kód: Vybrat vše
#include "yellow_robot.h" // vlozeni HAL knihovny pro abstrakci od HW Yrobota
void rovne(u16 vzdalenost) { // vzdalenost je v cm
encoder_reset(); // vynulujeme citace enkoderu
motor_run(60,-60); // rozjedeme se vpred
while (encoder_get_right()<vzdalenost) { // pockame az enkoder napocita urceny pocet impulzu
// zatim predpokladam ze jeden impulz enkoderu je 1 cm
}
motor_run(0,0); // zastavime motory
}
void otoc(u8 uhel) { // uhel je ve stupnich (-180 az +180)
encoder_reset(); // vynulujeme citace enkoderu
uhel = uhel/5; // od boku zatim odhadnu ze jeden impulz z enkoderu je otoceni o 5 stupnu (nutno doladit)
if (uhel>0) { // pro kladne uhly budeme tocit vpravo
motor_run(60,0); // zacneme tocit vpravo (jedeme jen levym kolem)
while (encoder_get_left()<uhel) { // pockame az enkoder napocita urceny pocet impulzu
}
} else { // pro zaporne uhly budeme tocit vlevo
motor_run(0,-60); // zacneme tocit vlevo (jedeme jen pravym kolem)
while (encoder_get_right()<uhel) { // pockame az enkoder napocita urceny pocet impulzu
}
}
motor_run(0,0); // zastavime motory
}
int main()
{
init(); // inicializace vseho potrebneho v Yrobotovi
while (1)
{ // zakladni nekonecna smycka
rovne(20); // jed rovne 20 cm
otoc(90); // otoc se o 90 stupnu vpravo
}
}
Kód je zcela neodzkoušený, protože nejsem u počítače, kde mám AVR studio. Výsledkem by měla být jízda Yrobota do čtverce o straně 20 cm. Podle mne to ale nikdy nepůjde vyladit úplně přesně, protože nevěřím, že by ty enkodéry mohly být tak dokonalé. Uvidíme.