Arduino Robot Redbot #4: Rozjezdy pro hvězdy
Konečně se dostáváme k tomu, že našeho robota rozpohybujeme! Začneme tím, že si napíšeme krátký program, který robota rozjede dopředu a zastaví.
Abychom nemuseli komponenty ovládat přímo, použijeme knihovnu RedBot. Ta nám ušetří mnohé problémy, na které bychom mohli narazit. Abychom tuto knihovnu mohli použít, vložíme na začátek programu část: #include <RedBot.h>. (Pamatujte na to, že Arduino kód je case-sensitive, tedy rozlišuje malá a velká písmena. Musíte tedy opravdu napsat RedBot.h, jinak program nebude fungovat). Součástí knihovny je i objekt RedBotMotors, který v tomto příkladu použijeme k ovládání motorů.
RedBotMotors motors;
Tento příkaz vytvoří objekt s názvem motors, který nám umožní ovládat pravý a levý motor robota.
Před tím, než do robota nahrajete následující kód, ujistěte se, že je RedBot na bezpečném místě a je kolem něj dostatek prostoru. Program začne okamžitě a robot by mohl například sjet z vašeho stolu a poškodit se. Pro účely testování navrhujeme robota podložit tak, aby byla kolečka podložena a robot nikam neujížděl.
Před nahráním robota zapněte, připojte motory a baterie. Přepínač motorů nastavte na RUN.
Obsah článku:
Nahrajte program do Arduina
Otevřete program Exp2_DriveForward v File > Examples > RedBot_Experiments, nebo si ho zkopírujte níže:
#include <RedBot.h> RedBotMotors motors; void setup() { motors.drive(255); delay(2000); // Waits for 2 seconds motors.stop(); // Stops both motors } void loop(){}
Nahrajte kód do Arduina. Motory by se měly začít točit plnou rychlostí (pravý po směru hodinových ručiček, levý proti směru) a po dvou vteřinách by měly zastavit.
Odpojte USB kabel a postavte robota na podlahu. Zmáčkněte tlačítko RESET. Program začne znovu a robot popojede dopředu a zastaví se.
Můžete zkusit změřit, jak daleko robot ujede a také měnit hodnotu v motors.drive().
Něco víc o motorech
Úvodní příklad by mohl stačit, ale pro lepší porozumění se podíváme, jaké možnosti nám pro ovládání motorů nabízí knihovna RedBot. Jejím vložením získáme přístup k několika třídám, které souží k jednoduchému ovládání jednotlivých součástí robota.
- RedBotMotors – ovládání motorů
- RedBotAccel – ovládání akcelerometru
- RedBotBumper – ovládání nárazníků
- RedBotEncoder – ovládání enkodérů na motorech
- RedBotSensor – různé senzory
- RedBotSoftwareSerial – SoftwareSerial pro připojení Xbee ovládání
V této části nás bude zajímat třída RedBotMotors. Tato třída má hned několik metod, použitelných pro ovládání motorů.
RedBotMotors motors; // Instantiate the motor control object.
Tento řádek deklaruje objekt motors, který je instancí třídy RedBotMotors. Nyní můžeme na objektu motors volat jakoukoliv metodu, která je součástí RedBotMotors. To zní složitě, ale podívejte se na následující příklady a hned bude jistě vše jasné. Volání se provádí:
motors.jmeno_metody();
Jízda dopředu a dozadu
motors.drive(sila_motoru) roztočí oba motory. Tato metoda vyžaduje jeden parametr sila_motoru, který může nabývat celočíselných hodnot od -255 do 255. Hodnoty větší než nula rozjedou robota dopředu, menší než nula dozadu.
motors.drive(255); // rozjede se dopředu na plný výkon motors.drive(-255); // rozjede se dozadu na plný výkon
Zastavování
motors.stop() vypne napájení obou motorů, čímž zastaví robota. Robot má ale setrvačnost, takže zastavení není okamžité.
motors.stop();
Někdy možná budete chtít kola zastavit ihned. Pohyb způsobený setrvačností nebude žádoucí. K tomuto účelu slouží motors.brake(). Zkuste rozjet robota a zastavit ho pomocí motors.stop() a pomocí motors.brake() a sledujte rozdíl brzdné dráhy.
motors.brake();
Další experimenty
Vyzkoušejte si program, který robota rozjede na vteřinu dopředu a na vteřinu dozadu. Toto zopakujte několikrát a sledujte, jestli se vždy vrátí na původní místo. Jak daleko jsou od sebe počáteční a koncový bod vzdáleny? Co může způsobit, že se robot nevrátí na původní místo?
Dále můžete zkusit upravit rychlost, kterou se robot pohybuje. Zkuste najít rychlost, kterou robot za dvě sekundy ujede asi 1 metr. Hodnotu si někam poznamenejte, protože ji za chvíli použijeme. Vyzkoušejte to několikrát a zkuste najít optimální hodnotu.
Spočítejte průměrnou rychlost pohybu v centimetrech za sekundu.
rychlost = draha[cm]/cas[s]
Napište vlastní funkci pro ujetí určité vzdálenosti
Mimo funkcí definovaných v knihovnách si můžeme napsat i vlastní funkce. Každá funkce se skládá z několika částí:
Return type je datový typ, který funkce vrací. Function name je název funkce. Údaje v kulatých závorkách – parameters – značí parametry funkce. Tato funkce je datového typu void, tedy nevrací žádnou hodnotu.
V tomto příkladu použijeme rychlost, kterou jsme si spočítali dříve, abychom si trochu usnadnili plánování pohybu. Pomocí vypočtené hodnoty určíme přibližný čas čekání mezi zapnutými a vypnutými motory. Z rovnice pro rychlost můžeme vyjádřit čas:
cas = draha / rychlost
Zkopírujte si následující funkci pod funkci loop().
void driveDistance(int distance) { int avgSpeed = 16; //rychlost, kterou jsme vypocetli long driveTime; driveTime = (long) 1000 * distance / avgSpeed; motors.drive(200); // zadejte rychlost, kterou jste pouzili pri testu delay(driveTime); motors.brake(); }
V programu nyní můžeme použít driveDistance(12) k ujetí 12 cm (přibližně). Zkuste tuto funkci použít ve vašem programu. Pokud se ujetá vzdálenost liší o více než 1 cm, zkuste upravit hodnotu proměnné avgSpeed.
Řešení problémů
Problémy s kompilací
Exp2_DriveForward:18: error: 'RedBotMotors' does not name a type Exp2_DriveForward.ino: In function 'void setup()': Exp2_DriveForward:23: error: 'motors' was not declared in this scope
Tento problém je nejčastěji způsoben tím, že knihovna RedBot není správně vložená do programu.
- Ověřte, že na začátku programu máte: #include <RedBot.h> (se stejnými velkými a malými písmeny)
- Arduino IDE nemůže najít knihovnu RedBot. Podívejte se do Sketch > Include Library > Manage Libraries, jestli máte knihovnu RedBot staženou.
Motory se netočí
- Zkontrolujte přepínač MOTOR, jestli je nastaven na RUN
- Máte desku připojenou k baterii, nebo adaptérů? Motory potřebují více, než dokáže dodat pouhé USB, takže pouze s ním si nevystačíte.
- Ověřte, zda jsou motory správně zapojené
Robot se pohybuje, ale točí se dokola
- Zkontrolujte zapojení motorů. Je pravděpodobné, že je jeden z motorů zapojen naopak.
Robot se nepohybuje rovně
Toto je běžná věc u robotů, které mají motory individuálně pro každé kolo. Existuje několik důvodů proč tomu tak je.
- Zkontrolujte, jestli některé z kol nedrhne o konstrukci robota.
- Jízda rovně vyžaduje rovnoměrné napájení motorů. Může se stát, že když je rychlost nastavena na 255, ztratí motory tah a pohyb pak není rovnoměrný. Zkuste začít s nižší hodnotou.
- Dále v tomto seriálu se naučíme používat enkodér s hallovými sondami k zajištění rovnoměrného pohybu obou kol.
Text vychází z https://learn.sparkfun.com/tutorials/experiment-guide-for-redbot-with-shadow-chassis/experiment-2-drive-forward-, který je licencován pod CC BY-NC-SA 3.0.
- Sledovač slunce s Arduinem - 23.3.2022
- Programovatelný kytarový pedál s Arduinem - 26.2.2020
- Arduino infračervený teploměr vytištěný na 3D tiskárně - 11.2.2020