Servo motor

Servo motory slouží pro nastavení určité polohy ovládaného mechanizmu a následné držení v této poloze. Stejnosměrné servo motory se využívají například pro ovládání robotické paže nebo pro nastavení kormidla u leteckých modelů. Jejich hlavní výhodou je malý rozměr a malá hmotnost s relativně velkou silou.

Tyto motory obvykle neumožňují otáčení neustále dokola, ale udržují nastavený úhel natočení. Úhel se pohybuje nejčastěji v rozsahu 0° až 180°. Nastavení tohoto úhlu se provádí zasláním impulsu o určité délce. Neutrální poloha (90°) odpovídá obvykle délce impulsu 1,5ms. Délka 0,5ms odpovídá úhlu 0° a impuls délky 2,5ms nastavuje úhel 180°. Impulsy se posílají motoru pravidelně každých 20ms.

Zapojení

Stejnosměrný servo motor má obvykle tři vývody. Jeden pro napájení (obvykle červený), druhý pro uzemnění (černý nebo hnědý) a třetí pro příjem ovládacích impulsů (žlutý nebo oranžový). Napájecí vývod připojte na 5V, uzemnění na GND a ovládací vývod na digitální pin 9.

Program

Pro ovládání servo motoru má Arduino připravenou knihovnu. Pro otestování aktuálního zapojení můžete použít ukázku Servo / Sweep. Tento program postupně mění úhel natočení z 0° až k 180° a zpět.

#include <Servo.h>     //zahrnutí knihovny pro ovládání servo motoru
Servo myservo;         //každý motor má svou instanci třídy Servo
int pos = 0;           //proměnná obsahující pozici motoru (úhel natočení)

void setup()
{
  myservo.attach(9);   //tento motor je připojen na pin 9
}

void loop()
{
  for(pos = 0; pos <= 180; pos += 1) //je od úhlu 0 do úhlu 180
  {
    myservo.write(pos);  //natočení motoru na aktuální úhel
    delay(15);           //chvilka čekání než se motor natočí
  } 
  for(pos = 180; pos >= 0; pos -= 1) //je od úhlu 180 zpět do úhlu 0
  {
    myservo.write(pos);  //natočení motoru na aktuální úhel
    delay(15);           //chvilka čekání než se motor natočí

  }
}

Pro práci se servo motorem poskytuje Arduino třídu „Servo“. Aby bylo možné ji použít je potřeba zahrnout do programu její knihovnu příkazem #include <Servo.h>. Následně se pro každý ovládaný motor vytvoří instance této třídy Servo myservo;. Aby bylo možno s každým motorem pracovat samostatně, je potřeba jej připojit na samostatný pin, v našem příkladu je to pin 9. To, na který pin má Arduino posílat informace, se mu řekne pomocí myservo.attach(9);. A konečně pro natočení motoru na určitý úhel stačí použít myservo.write(pos);. Tím se motor natočí na úhel, který aktuálně obsahuje proměnná pos.

Jak servo funguje

Uvnitř stejnosměrného servo motoru je obyčejný stejnosměrný motůrek, který se může točit stále dokola. Výstup tohoto motůrku je přes převody vyveden na výstupní páčku serva. Na výstupu probíhá měření polohy pomocí potenciometru. Ten se může otáčet pouze v určitém rozsahu a je to hlavní důvod, proč nelze otáčet servem pořád dokola. Nakonec je tu také elektronika, která přijímá impulsy a porovnává jejich délku s odporem potenciometru. 

Řekněme, že použitý potenciometr bude mít celkový odpor 1800Ω. Délce impulsu 0,5ms by odpovídal odpor 0Ω, pro impuls délky 1,5ms by to bylo 900Ω a pro impuls 2,5ms celých 1800Ω. Když bude motor natočen na 90°, bude odpor 900Ω. Pokud nyní přijde impuls o délce 2,5ms pak elektronika ví, že cílový odpor má být 1800Ω a pustí do motůrku proud v kladném směru. Proud do motůrku teče po příchodu impulsu vždy jen několik milisekund. Tím se o krok přiblíží k cílové hodnotě. S dalším impulsem délky 2,5ms elektronika znovu změří odpor potenciometru a pokud bude menší než 1800Ω, pak znovu pustí do motůrku proud v kladném směru.

Pokud pak přijde impuls o délce 0,5ms, elektronika ví, že cílový odpor 0Ω je menší než aktuální a pustí do motůrku proud v opačném směru. Tím se servo natočí o krok směrem k úhlu 0°. Čím více se bude odpor potenciometru blížit k cílové hodnotě, tím kratší dobu bude elektronika do motůrku proud pouštět. Pokud tedy bude na výstupní páčku motoru působit jen malá síla, která bude servo vychylovat od cílového úhlu, bude mít motor i malou spotřebu.

Maximální úhel natočení servo motoru se liší typ od typu. V podstatě záleží hlavně na použitém potenciometru. Některá serva umožňují rozsah 180°, jiná 270° nebo dokonce celých 360°. Záleží hlavně na použitém potenciometru, a pokud by se použil více otáčkový potenciometr, mohlo by se servo otáčet třeba 10 krát dokola. Součástí konstrukce serva je i doraz, který brání přetočení potenciometru přes maximální úhel a tím jeho poškození. Není dobré motor nechávat narážet do těchto dorazů, neboť v té chvíli působí na převody relativně velké síly a častým narážením do dorazů by došlo k poškození serva.

Otáčení serva potenciometrem

Knihovna Servo v Arduinu obsahuje i druhý ukázkový příklad, který otáčí servo motorem podle toho, jak natočíte připojený potenciometr. Přidejte tedy k předchozímu obvodu ještě potenciometr a nahrajte následující program z ukázky Servo / Knob.

#include <Servo.h>     //zahrnutí knihovny pro ovládání servo motoru
Servo myservo;         //každý motor má svou proměnnou typu Servo
int potpin = 0;        //pin ke kterému je připojen potenciometr
int val;               //proměnná pro načtení a nastavení úhlu

void setup()
{
  myservo.attach(9);   //tento motor je připojen na pin 9
}

void loop() 
{ 
  val = analogRead(potpin);  //napětí na potenciometru (0 až 1023)
  val = map(val, 0, 1023, 0, 180); //převod z 0 až 1023 na 0 až 180
  myservo.write(val);        //nastavení polohy podle potenciometru
  delay(15);                 //chvilka čekání než se motor natočí
}

Oproti předchozímu programu je tu navíc proměnná int potpin = 0;, ve které je uloženo číslo analogového pinu, ke kterému je připojen potenciometr. Pin musí být analogový, aby na něm bylo možno měřit napětí pomocí val = analogRead(potpin);. Tímto se do proměnné val uloží hodnota v rozsahu 0 až 1023 podle polohy potenciometru. Pokud natočíme potenciometr na levý doraz, bude naměřena hodnota 0, pokud se natočí na střed, naměří se 512 a na pravém dorazu to bude 1023.

Protože funkce write akceptuje pouze rozsah 0 až 180 je potřeba naměřený rozsah 0 až 1023 přepočíst na rozsah 0 až 180. To lze buď jednoduchým vydělením naměřené hodnoty číslem 5,683 nebo využitím univerzální funkce map. Ta přepočte hodnotu z libovolného vstupního rozsahu na odpovídající hodnotu ve výstupním rozsahu.

Délky impulsů pro natočení na určitý úhel se mohou lišit podle různých modelů a výrobců servo motoru. Knihovna Servo umožňuje nastavit vlastní hodnoty pro minimální a maximální úhel natočení. Funkce attach(pin, min, max) přebírá další dva volitelné parametry, které udávají minimální a maximální délku impulsu v mikrosekundách. Výchozí hodnota pro min je 544µs a pro max 2400µs. Úhel natočení lze také zadat přímo pomocí délky impulsu funkcí writeMicroseconds(us). Ta jako parametr přebírá právě tuto délku v mikrosekundách. Takže pro natočení do neutrální polohy lze také použít příkaz myservo.writeMicroseconds(1500);.

 

Co si vyzkoušet dále

  • Otevřete si první ukázkový program Servo / Sweep a zkuste změnit zpoždění z 15ms na 5ms. Uvidíte, jak se pohyb zrychlí.
  • Otevřete si druhý ukázkový program Servo / Knob a upravte jej tak, aby úhel načítal ze sériové linky namísto z polohy potenciometru. Pak bude možné ovládat servo přímo z počítače. Pro načtení číselné hodnoty ze sériové linky můžete použít funkci Serial.parseInt().

Další podobné články

Ovládání teploty pomocí relé a senzoru DS18B20

Tento projekt umožňuje měřit teplotu pomocí senzoru DS18B20, zobrazit ji na I2C LCD displeji, a ovládat relé podle teplotních limitů. Relé bude aktivní, když je teplota mezi 0 a 22 stupni Celsia. Projekt může sloužit k ovládání topení, ventilace nebo jiného zařízení podle okolní teploty.