Close

Arduino Robot Redbot #5: Naučme robota otáčet se

Arduino Robot Redbot - Otáčení

V tomto článku se naučíme, jak ovládat jednotlivé motory robota zvlášť. Tím ho budeme moci navést tam, kam budeme potřebovat. Také si představíme několik nových metod třídy RedBotMotor.

Ukážeme si, jak napsat příkazy pro sekvenci: jeď rovně, otoč se o 90 stupňů, jeď rovně, zastav. Ujistěte se, že má robot kolem sebe dostatek prostoru, nebo že jsou kola ve vzduchu (aby po nechtěném spuštění programu nedošlo k jeho poškození). Zkontrolujte, jestli jsou motory správně připojené a jestli funguje napájení z baterií.

Na začátek nahrajeme dnešní program do robota. Najdete ho zde: File > Examples > RedBot_Experiments > Exp3_Turning. Nebo také můžete zkopírovat kód níže.

/*********************************************************************** 
* Exp3_Turning -- RedBot Experiment 3 
*  
* Explore turning with the RedBot by controlling the Right and Left motors 
* separately. 
*  
* Hardware setup: 
* This code requires only the most basic setup: the motors must be 
* connected, and the board must be receiving power from the battery pack. 
*  
* 23 Sept 2013 N. Seidle/M. Hord * 04 Oct 2014 B. Huang 
***********************************************************************/
#include <RedBot.h>  // This line "includes" the library into your sketch.

RedBotMotors motors; // Instantiate the motor control object.

void setup(){
  // drive forward -- instead of using motors.drive(); Here is another way.
  motors.rightMotor(150); 
  // Turn on right motor clockwise medium power (motorPower = 150) 
  motors.leftMotor(-150);
  // Turn on left motor counter clockwise medium power (motorPower = 150) 
  delay(1000);       // for 1000 ms.
  motors.brake();    // brake() motors

  // pivot -- spinning both motors CCW causes the RedBot to turn to the right
  motors.rightMotor(-100); // Turn CCW at motorPower of 100
  motors.leftMotor(-100);  // Turn CCW at motorPower of 100
  delay(500);        // for 500 ms.    
  motors.brake();    // brake() motors
  delay(500);        // for 500 ms.    

  // drive forward -- instead of using motors.drive(); Here is another way.
  motors.rightMotor(150); 
  // Turn on right motor clockwise medium power (motorPower = 150) 
  motors.leftMotor(-150); 
  // Turn on left motor counter clockwise medium power (motorPower = 150)
  delay(1000);       // for 1000 ms.
  motors.brake();     // brake() motors
}

void loop(){
  // Figure 8 pattern -- Turn Right, Turn Left, Repeat
  //  motors.leftMotor(-200);  // Left motor CCW at 200
  //  motors.rightMotor(80);   // Right motor CW at 80
  //  delay(2000);
  //  motors.leftMotor(-80);    // Left motor CCW at 80
  //  motors.rightMotor(200);   // Right motor CW at 200
  //  delay(2000); 
}

Co by se mělo dít?

Po nahrání programu by se měla kola otočit souhlasným směrem, poté jedno změní směr, po chvilce se opět začnou točit souhlasně a nakonec zastaví. Nyní můžete robota odpojit od USB, položit jej na podlahu a manuálně Resetovat. Robot by se měl začít pohybovat.

Za ideálních podmínek (rovný, hladký povrch…) by se měl robot pohybovat v přímých liniích a otočit se přesně o 90 stupňů. Pokud se neotočí o 90 stupňů, můžete změnit dvě věci: a) v části

  // pivot -- spinning both motors CCW causes the RedBot to turn to the right
  motors.rightMotor(-100); // Turn CCW at motorPower of 100
  motors.leftMotor(-100);  // Turn CCW at motorPower of 100
  delay(500);        // for 500 ms.    
  motors.brake();    // brake() motors
  delay(500);        // for 500 ms.    

změňte čas čekání v prvním delay(). b) Změňte výkon motorů ve stejné části kódu – místo -100 zkuste jinou hodnotu.

Pamatujte, že pro přesné otočení je důležité, aby kola nepodkluzovala. V případě, že podkluzují, je nutné snížit jejich rychlost.

Otáčení

Způsob otáčení je jednoduchý. Pokud chceme, aby se robot otočil, musíme jedním koly otáčet s různou rychlostí. Může dojít k několika situacím.

K první situaci dojde, když budeme koly točit v opačném směru. Nastavíme-li navíc stejnou velikost  rychlosti u obou kol, osa otáčení bude přibližně v polovině osy kol (kolmá na horní desku robota). Tuto situaci máme i v kódu výše (nenechte se zmást tím, že rychlost obou motorů je -100, levý motor má pro stejné hodnoty opačný směr rotace než pravý motor).

  motors.rightMotor(-100); // Turn CCW at motorPower of 100
  motors.leftMotor(-100);  // Turn CCW at motorPower of 100
Arduino Robot Redbot Otáčení na místě

Otáčení na místě

Často ale nebudete chtít robota zastavit a až poté otáčet, ale budete s ním chtít manévrovat za jízdy. To provedete tak, že směr otáčení kol při pohybu dopředu zachováte, jen upravíte jejich rychlost. Budete-li chtít například zatáčet mírně doprava, zpomalíte pravé kolo (popřípadě zrychlíte levé, nebo také oboje).

Arduino Robot Redbot Otáčení při pohybu dopředu

Otáčení při pohybu dopředu

Jakýsi kompromis mezi předchozími dvěma způsoby je zastavit jedno kolo a nechat otáčet pouze druhé. Osa otáčení nyní prochází kolem, které je zastaveno.

Arduino Robot Redbot Otáčení jedním kolem

Otáčení jedním kolem

Ovládání motorů

Ve čtvrtém dílu článků o Robotovi Redbot jsme k pohybu robota dopředu použili funkci motors.drive(rychlost). Pokud jsme zadali rychlost větší než nula, pravé kolo se začalo točit po směru hodinových ručiček, levé kolo proti směru a robot se tak rozjel dopředu.

Pro ovládání jednotlivých motorů obsahuje třída RedBotMotors dvě metody (každou pro jeden motor).

motors.rightMotor(rychlost_p); //pravý motor
motors.leftMotor(rychlost_l); //levý motor

Stejně jako parametr metody .drive(), i parametr metod .rightMotor() a .leftMotor() může nabývat hodnot -255 až 255. Hodnoty větší než nula roztočí motor po směru hodinových ručiček, záporné hodnoty proti směru.

Jelikož mohou motory jet celkem slušnou rychlostí, je lepší při otáčení použít nižší rychlosti. Pokud při něm podkluzuje, můžete zkusit upravit hodnoty parametrů (jak již bylo zmíněno dříve), nebo rychlost zvyšovat postupně.

setup() vs. loop()

Asi jste si všimli, že zatím všechen kód, který jsme zkoušeli byl pouze ve funkci setup(). Bylo to z toho důvodu, že jsme potřebovali vyzkoušet, co který příkaz udělá a nechtěli jsme, aby nám robot zběsile jezdil po podlaze. Nyní si ale můžete vyzkoušet umístit kód do funkce loop() a naučit robota dělat například osmičku, kolečko a podobně. Kód pro osmičku je ve funkci loop() připravený, takže ho stačí odkomentovat. Možná bude potřeba upravit časy a rychlosti pro přesné osmičky.

void loop(){
  // Figure 8 pattern -- Turn Right, Turn Left, Repeat
  //  motors.leftMotor(-200);  // Left motor CCW at 200
  //  motors.rightMotor(80);   // Right motor CW at 80
  //  delay(2000);
  //  motors.leftMotor(-80);    // Left motor CCW at 80
  //  motors.rightMotor(200);   // Right motor CW at 200
  //  delay(2000); 
}

Čtverec

Pro pohyb robota po čtverci potřebujeme opakovat stále dokola: jeď dopředu, otoč se o 90 stupňů. Nepřipomíná vám to něco? Je to podobný případ, jako v prvním kódu tohoto článku.

Nechte robota dělat čtverce stále dokola. Můžete sledovat, jestli vždy dojede na počáteční místo, nebo nikoliv. V tom případě můžete zkusit upravit rychlosti a časy otáčení.

Otočení o určitý úhel

Na konec programu přidáme funkci turnAngle().

void turnAngle(int angle){
  int turningSpeed = 180; // degreees / second

  long turningTime;
  turningTime = (long) 1000 * angle / turningSpeed;

  motors.rightMotor(-100); // Turn CCW at motorPower of 100
  motors.leftMotor(-100);  // Turn CCW at motorPower of 100
  delay(turningTime);      // turning Time
  motors.brake();     // brake() motors
}

Poté část kódu, která zajišťovala otáčení nahraďte turnAngle(90). Robot by se měl i poté otáčet o 90 stupňů. Pokud tomu tak není, změňte hodnotu proměnné turningSpeed. Společně s funkcí driveDistance() z minulého dílu můžete nyní naprogramovat pohyby po čtvercích, pětiúhelnících (obecně n-úhelnících) a mnohé další tvary.

Možné problémy

Kola se neotáčí, ale je slyšet vysoký tón.

  • Kola nemají dostatečný točivý moment na to, aby se rozjela. Zkuste zvýšit rychlost otáčení, nebo zmenšit váhu robota (pokud na něm například něco vezete).

Kdykoliv, když připojím USB kabel, se robot na chvíli chová podivně.

  • RedBot se snaží provést nahraný kód kdykoliv, když dojde k restartu. Když ho připojíte k počítači, musí ho počítač identifikovat. Při tom dojde několikrát k restartu programu (bootloaderu). S robotem se ve skutečnosti neděje nic špatného. Pokud vám toto chování vadí, přepněte přepínač motorů z RUN na STOP.

Přeloženo z https://learn.sparkfun.com/tutorials/experiment-guide-for-redbot-with-shadow-chassis/experiment-3-turning a mírně upraveno.
Původní text je licencován pod CC BY-NC-SA 3.0.

Zbyšek Voda

2 Comments on “Arduino Robot Redbot #5: Naučme robota otáčet se

123
16.6.2016 at 13:21

Dobrý den, ví někdo, jak v arduino ide naprogramovat sledovače čáry? Docela dost by mi to pomohlo. Děkuji

Zbyšek Voda
16.6.2016 at 13:40

Dobrý den,
návod je například zde: https://learn.sparkfun.com/tutorials/sparkfun-inventors-kit-for-redbot/experiment-6-line-following-with-ir-sensors.

Zkráceně: Máte vepředu na robotovi 2-3 senzory (fotorezistor, fotodioda…), které umí rozlišit kontrast podložky – tak rozpozná, kde je černá čára a kde zbytek podložky.
Když máte senzory dva, tak se robot snaží držet čáru tak, aby nezasahovala do ani jednoho senzoru. Dělá to tak, že zrychluje/zpomaluje patřičná kola.
Pokud má senzory tři, snaží se prostředním být stále na čáře, zbylé dva fungují tak, jako v případě se dvěma senzory.

Napsat komentář