Servo: malý motor, který ví, kam se má otočit

Motorů a pohonů existuje spousta. Některé se jen točí, jiné potřebují složité řízení a u některých musíme řešit přesné počítání kroků. Servo je proti tomu docela příjemná součástka. Neříkáme mu totiž jen „toč se“, ale rovnou „natoč se sem“.

Právě proto jsou serva oblíbená v modelářství, robotice, jednoduchých mechanických projektech a různých bastlících pokusech. Hodí se všude tam, kde potřebujeme něco pootočit do určité polohy. Třeba klapku, páčku, ukazatel, ručičku, zámek, přepínač nebo malý mechanický mechanismus.

V článku se podíváme na to, co servo vlastně je, jak funguje, jak ho připojit k Arduinu a na co si dát pozor, aby se místo hezkého pohybu nedostavilo jen cukání, bzučení a resetování desky.

levné mikro servo SG90

Co je servo

Na první pohled vypadá běžné modelářské servo jako malá plastová krabička se třemi vodiči a výstupní hřídelkou. Uvnitř toho je ale víc, než by se mohlo zdát.

Servo v sobě obvykle obsahuje:

  • malý stejnosměrný motor,
  • převodovku,
  • snímač polohy,
  • řídicí elektroniku,
  • výstupní hřídel s tisícihranem pro páčku.
principiální řez servem

Díky tomu servo ví, v jaké poloze se právě nachází, a snaží se držet polohu, kterou mu pošleme z Arduina nebo jiného řídicího obvodu.

Běžné servo se neotáčí stále dokola. Většina malých modelářských serv má rozsah přibližně 0 až 180 stupňů. Některá mají menší rozsah, některá větší, ale princip je stejný. Pošleme požadovanou polohu a servo se na ni natočí.

Jak servo funguje

Servo si můžeme představit jako malý motor s mozkem.

Obyčejnému motoru připojíme napájení a on se začne točit. Když napájení odpojíme, zastaví se. U serva je to jiné. Servo má uvnitř elektroniku, která porovnává požadovanou polohu se skutečnou polohou hřídele.

Když servu řekneme, že má být třeba na 90 stupních, elektronika zapne motor, přes převody natočí hřídel do požadované polohy a tam se ji snaží držet. Pokud do páčky zatlačíme, servo se bude snažit vrátit zpět.

To je velká výhoda. Nemusíme sami počítat otáčky motoru, řešit koncové spínače nebo složitou zpětnou vazbu. Servo tohle všechno řeší uvnitř.

Ovládací signál

Servo má obvykle tři vodiče:

  • GND – zem
  • VCC – napájení
  • SIGNAL – řídicí signál

Barvy vodičů se můžou podle výrobce lišit. Často to bývá:

  • hnědá nebo černá – GND
  • červená – napájení
  • oranžová, žlutá nebo bílá – signál

Servo se ovládá krátkými impulzy. Nejde o klasické PWM ve smyslu analogWrite(), jaké se používá třeba pro stmívání LED. Servo čeká pravidelně opakovaný impulz a podle jeho délky pozná, do jaké polohy se má natočit.

Typicky se používá perioda okolo 20 ms. Poloha serva se určuje délkou impulzu:

  • krátký impulz znamená poloha na jednu stranu,
  • delší impulz znamená střed,
  • ještě delší impulz znamená poloha na druhou stranu.

Pro začátečníka ale není potřeba řešit přesné mikrosekundy. Arduino má knihovnu Servo, která tohle zařídí za nás. My pak v programu jednoduše napíšeme třeba:

servo.write(90);

A servo se natočí přibližně na střed.

Co budeme potřebovat

Pro základní pokus stačí:

  • Arduino UNO, Nano nebo podobná deska
  • malé servo, například SG90
  • několik propojovacích vodičů
  • ideálně externí 5V zdroj pro servo
  • případně kondenzátor pro vyhlazení napájení

Pro úplně první krátký pokus se malé servo často připojuje přímo na 5V pin Arduina. Někdy to funguje, někdy ne. Záleží na konkrétním servu, zatížení a napájení desky. Pro spolehlivější zapojení je lepší servo napájet samostatně.

Zapojení serva k Arduinu

Základní zapojení je jednoduché.

Signálový vodič serva připojíme na digitální pin Arduina. V příkladech použijeme pin 9.

Napájení serva připojíme na 5 V a GND. Pokud použijeme samostatný zdroj pro servo, je důležité propojit zem zdroje se zemí Arduina. Bez společné země nebude řídicí signál správně fungovat.

Zapojení:

ServoArduino / zdroj
GNDGND
VCC5 V
SIGNALD9
zapojení s napájením z arduina

Pokud je servo napájené z externího zdroje:

ServoPřipojení
GNDGND externího zdroje + GND Arduina
VCC+5 V externího zdroje
SIGNALD9 Arduina
zapojení s napájením externím zdrojem

Tohle je důležité. Servo může mít vlastní napájení, ale zem musí být společná s Arduinem.

První program

Nejjednodušší program natočí servo do několika poloh.

#include <Servo.h>

Servo mojeServo;

void setup() {
mojeServo.attach(9);

mojeServo.write(0);
delay(1000);

mojeServo.write(90);
delay(1000);

mojeServo.write(180);
delay(1000);
}

void loop() {
}

Po nahrání programu by se servo mělo postupně natočit na jednu stranu, potom doprostřed a nakonec na druhou stranu.

U některých serv nemusí být krajní polohy úplně přesně 0 a 180 stupňů. Berte to spíš jako orientační hodnotu. Každé servo se může chovat trochu jinak.

Plynulé přejíždění sem a tam

Další jednoduchý příklad nechá servo plynule přejíždět z jedné krajní polohy do druhé a zase zpět.

#include <Servo.h>

Servo mojeServo;

void setup() {
mojeServo.attach(9);
}

void loop() {
for (int uhel = 0; uhel <= 180; uhel++) {
mojeServo.write(uhel);
delay(15);
}

for (int uhel = 180; uhel >= 0; uhel--) {
mojeServo.write(uhel);
delay(15);
}
}

Tento příklad je vhodný pro první ověření, že servo funguje. Zároveň je na něm hezky vidět, že servu neposíláme rychlost, ale požadovanou polohu. Rychlost pohybu tady ovlivňujeme tím, jak rychle měníme cílový úhel.

Ovládání serva potenciometrem

Zajímavější pokus je ovládání serva potenciometrem. Pootočíme knoflíkem a servo se natočí podle něj.

Potenciometr zapojíme takto:

PotenciometrArduino
jeden krajní vývod5 V
druhý krajní vývodGND
prostřední vývodA0

Servo zůstane připojené stejně jako předtím.

Program:

#include <Servo.h>

Servo mojeServo;

void setup() {
mojeServo.attach(9);
}

void loop() {
int hodnota = analogRead(A0);
int uhel = map(hodnota, 0, 1023, 0, 180);

mojeServo.write(uhel);

delay(15);
}

Arduino čte hodnotu z potenciometru v rozsahu 0 až 1023. Funkce map() ji převede na rozsah 0 až 180 a tuto hodnotu pošle servu.

Tohle je pěkná ukázka pro různé ukazatele, ručičky nebo mechanické ovládání. V praxi by se podobným způsobem dalo servo řídit třeba podle teploty, napětí, času nebo jiné měřené veličiny.

Pozor na napájení

Tohle je asi nejčastější problém u serv.

Servo není LEDka. I malé servo si při pohybu může vzít docela dost proudu. Krátkodobé proudové špičky můžou být mnohem vyšší, než by člověk čekal. Pokud je servo zatížené, zaseknuté nebo se snaží držet polohu proti odporu, proud ještě naroste.

Typické projevy slabého napájení:

  • servo cuká
  • servo bzučí
  • Arduino se resetuje
  • program se chová divně
  • sériový monitor vypisuje nesmysly
  • servo se pohne jen někdy

U malého serva SG90 může pro lehký pokus stačit napájení z Arduina, ale není dobré s tím počítat jako se spolehlivým řešením. Jakmile servo něco skutečně tahá nebo drží, je lepší použít samostatný 5V zdroj.

Dobré je také přidat k napájení serva kondenzátor, například 470 µF až 1000 µF mezi +5 V a GND. Pomůže zachytit krátké proudové špičky.

Krajní polohy a mechanické dorazy

Další věc, na kterou je potřeba dávat pozor, jsou krajní polohy.

Servo sice může v programu dostat příkaz 0 až 180 stupňů, ale neznamená to, že každé konkrétní servo zvládne přesně celý tento rozsah. Některé kusy se mechanicky dostanou na doraz dřív.

Když servo narazí na mechanický doraz a program ho pořád nutí jet dál, servo začne bzučet, zahřívat se a bere zbytečně velký proud. To není dobré pro servo ani pro napájení.

Proto je lepší si u konkrétního kusu ověřit bezpečný rozsah. Někdy může být lepší používat třeba jen 10 až 170 stupňů místo celého rozsahu 0 až 180.

Příklad omezeného rozsahu:

int uhel = map(hodnota, 0, 1023, 10, 170);

Tím se servo nebude pokoušet jezdit úplně do krajů.

Proč servo bzučí

Lehké bzučení serva je běžné, hlavně když drží nějakou polohu pod zatížením. Servo se neustále snaží dorovnávat drobné odchylky. Když je na páčce odpor, převody mají vůli nebo je poloha někde mezi, elektronika uvnitř pořád trochu pracuje.

Pokud ale servo bzučí hodně, škube sebou nebo se zahřívá, je dobré zkontrolovat:

  • jestli není mechanicky na dorazu
  • jestli není příliš zatížené
  • jestli má dostatečné napájení
  • jestli je propojená společná zem
  • jestli není servo poškozené

Síla serva

U serv se často uvádí síla jako krouticí moment, například v jednotkách kg·cm. Zjednodušeně to říká, jak velkou sílu servo zvládne na určité délce páky.

Například servo s momentem 2 kg·cm by teoreticky zvládlo udržet sílu odpovídající 2 kg na páce dlouhé 1 cm. Na páce dlouhé 2 cm už by to bylo zhruba poloviční zatížení.

V praxi je dobré nejet úplně na hraně. Levná malá serva mají plastové převody a při přetížení se můžou snadno poškodit. Pro větší mechaniku je lepší použít silnější servo, ideálně s kovovými převody.

Analogové a digitální servo

U běžných modelářských serv se můžete setkat s označením analogové a digitální servo.

Pro jednoduché použití s Arduinem se ovládají velmi podobně. Rozdíl je hlavně v elektronice uvnitř serva. Digitální serva většinou reagují rychleji, přesněji drží polohu a můžou mít vyšší sílu. Zároveň ale často berou víc proudu.

Pro první pokusy není potřeba to moc řešit. Obyčejné levné servo je většinou úplně v pohodě.

Servo s rozsahem 270°

U běžných modelářských serv se nejčastěji setkáme s rozsahem pohybu přibližně 0 až 180 stupňů. Existují ale i serva s větším rozsahem, například 270°. Na první pohled vypadají podobně jako obyčejné servo, ale výstupní hřídel se dokáže natočit o větší úhel.

To se hodí všude tam, kde potřebujeme využít větší část kruhové stupnice. Typickým příkladem může být ručičkový ukazatel, analogový měřák, domácí mechanický displej nebo různé netradiční hodiny. U klasického 180° serva ručička projede jen polovinu kruhu. Servo s rozsahem 270° už umí využít tři čtvrtiny kruhu, takže výsledek může vypadat mnohem lépe.

Ovládání je pro Arduino velmi podobné jako u běžného serva. V programu pořád posíláme hodnotu úhlu, například pomocí knihovny Servo. Rozdíl je hlavně v tom, že skutečný mechanický rozsah serva je větší. Je ale potřeba počítat s tím, že knihovna Servo při použití write() běžně pracuje s hodnotami 0 až 180. U některých 270° serv pak hodnota 0 odpovídá jedné krajní poloze, 90 zhruba středu a 180 druhé krajní poloze, ale fyzicky se servo otočí přes větší úhel než běžné 180° servo.

Pokud chceme rozsah využít přesněji, je lepší servo řídit pomocí délky impulzu v mikrosekundách přes funkci writeMicroseconds() a najít si bezpečné krajní hodnoty konkrétního kusu. Například postupným zkoušením zjistíme, při jakých hodnotách servo ještě nenaráží na mechanický doraz.

Příklad:

#include <Servo.h>

Servo mojeServo;

void setup() {
mojeServo.attach(9);
}

void loop() {
mojeServo.writeMicroseconds(500);
delay(1000);

mojeServo.writeMicroseconds(1500);
delay(1000);

mojeServo.writeMicroseconds(2500);
delay(1000);
}

Hodnoty 500 až 2500 µs jsou jen orientační. Každé servo může mít jiný bezpečný rozsah, takže je dobré začít opatrně, třeba od 1000 do 2000 µs, a krajní hodnoty postupně rozšiřovat. Jakmile servo začne v krajní poloze bzučet, tlačit do dorazu nebo se zahřívat, je potřeba rozsah zmenšit.

U mého serva fungovaly obě možnosti.

Servo s rozsahem 270° tedy není servo s nepřetržitým otáčením. Pořád jde o polohové servo, jen má větší mechanický rozsah. To je důležité rozlišovat. U 270° serva stále zadáváme polohu, zatímco u serva s nepřetržitým otáčením řídíme spíš směr a rychlost otáčení.

Servo s kontinuálním otáčením

Existují také serva s kontinuálním otáčením. Na první pohled vypadají podobně, ale nechovají se jako klasické polohové servo.

U klasického serva příkaz write(90) znamená natočení na 90 stupňů.

U serva s nepřetržitým (kontinuálním) otáčením se stejným signálem obvykle řídí směr a rychlost otáčení. Hodnota kolem 90 znamená zastavení, menší hodnota otáčení jedním směrem a větší hodnota otáčení druhým směrem.

Tohle je důležité nezaměnit. Pokud chceme přesně nastavit polohu ručičky, klapky nebo páčky, potřebujeme klasické polohové servo, ne servo s nepřetržitým otáčením.

Servo nebo krokový motor?

Servo a krokový motor se často pletou, protože obě součástky umožňují řízený pohyb. Každé se ale hodí na něco jiného.

Servo je jednoduché. Připojíme tři vodiče, použijeme knihovnu a rovnou zadáváme úhel. Hodí se pro menší rozsahy pohybu, páčky, klapky, ukazatele a jednoduchou mechaniku.

Krokový motor se hodí tam, kde potřebujeme otáčení o mnoho otáček, přesnější polohování nebo větší mechanický pohyb. Na druhou stranu potřebuje budič, složitější řízení a často i pečlivější mechanický návrh.

Pro jednoduché konstrukce je servo vhodnější. Je rychle zapojené, rychle pochopitelné a výsledek je vidět hned.

Praktické použití

Servo se dá použít v mnoha jednoduchých projektech. Například:

  • otevření a zavření malé klapky
  • ovládání zámku
  • pohyb ručičky ukazatele
  • natáčení senzoru
  • malý robotický mechanismus
  • modelářské řízení
  • automatické mačkání tlačítka
  • mechanický ukazatel hodnoty

Mně se na servech líbí hlavně to, že umí jednoduše rozhýbat reálný svět. Na displeji můžeme zobrazit číslo, ale ručička, páčka nebo mechanický pohyb má úplně jiné kouzlo.

Právě proto se servo hodí i pro různé „analogově vypadající“ projekty. Například ručičkový ukazatel teploty, stav baterie, síla signálu nebo čas na netradičních hodinách.

Malý test přes sériový monitor

Pro zkoušení konkrétního serva se hodí jednoduchý program, kam pošleme úhel přes sériový monitor. Díky tomu si můžeme najít bezpečné krajní polohy konkrétního kusu.

#include <Servo.h>

Servo mojeServo;

void setup() {
Serial.begin(9600);
mojeServo.attach(9);

Serial.println("Zadej uhel 0 az 180 a odesli:");
}

void loop() {
if (Serial.available()) {
int uhel = Serial.parseInt();

if (uhel >= 0 && uhel <= 180) {
mojeServo.write(uhel);

Serial.print("Servo nastaveno na: ");
Serial.println(uhel);
} else {
Serial.println("Zadej hodnotu od 0 do 180.");
}

while (Serial.available()) {
Serial.read();
}
}
}

V Arduino IDE otevřeme sériový monitor, nastavíme rychlost 9600 baudů a posíláme hodnoty od 0 do 180. Servo se bude natáčet podle zadané hodnoty.

Tímto způsobem se dá snadno zjistit, jestli servo v krajních polohách nenaráží na doraz, jestli nebzučí a jaký rozsah je pro něj bezpečný.

Časté chyby

U serv se opakuje několik typických problémů.

První je slabé napájení. Servo se pokouší pohnout, vezme si víc proudu a Arduino se resetuje. Řešením je samostatný zdroj pro servo a společná zem.

Druhá chyba je chybějící společná zem. Signál z Arduina pak nemá vůči servu jasnou referenci a servo se může chovat náhodně.

Třetí problém jsou mechanické dorazy. Servo je nucené do polohy, kam se fyzicky nemůže dostat. Pak bzučí, zahřívá se a zbytečně se namáhá.

Čtvrtá chyba je záměna klasického serva za servo s nepřetržitým otáčením. To se neřídí jako poloha, ale spíš jako motor se směrem a rychlostí.

A poslední častá chyba je příliš velká zátěž. Malé servo je fajn na pokusy, ale nemůže tahat všechno. Pokud má servo problém pohyb dokončit nebo pořád bzučí pod zatížením, je potřeba silnější kus nebo lepší mechanika.

Závěr

Servo je jedna z nejvděčnějších součástek pro jednoduché pokusy s Arduinem. Zapojení je jednoduché, program krátký a výsledek je hned vidět. Místo blikání LED se najednou začne něco skutečně hýbat.

Nejdůležitější je pamatovat na napájení, společnou zem a mechanické dorazy. Jakmile jsou tyhle základy v pořádku, dá se servo použít v překvapivě velkém množství projektů.

Pro jednoduché pokusy stačí levné malé servo, například SG90. Na vážnější mechaniku už je lepší vybrat silnější servo, ideálně podle požadované síly, rozsahu pohybu a typu převodů.

Servo je prostě malý motor, který se nesnaží jen točit. Snaží se poslouchat polohu. A právě díky tomu je pro bastlení tak užitečné.

Různé druhy serv zakoupíte na Laskakit.cz přímý odkaz je ZDE.

Další díly ze začátečnické série o modulech najdete zde:

Jedna myšlenka na “Servo: malý motor, který ví, kam se má otočit”

  1. Pozor na problém rychlého cuknutí při zapnutí napájení.
    Servo nemá zpětnou vazbu, takže není možné zjistit, v jaké poloze se aktuálně nachází.
    Když se zapne napájení, servo hned velice rychle přejede do polohy, která odpovídá ovládacímu signálu.
    Tento úvodní rychlý přejezd je programově těžko ovlivnitelný.
    Pokud je na servu připojená větší zátěž, může při tomto startu (někdy) dojít k jejímu utržení setrvačností.

    Řešení problému vyžaduje nějakou zpětnou vazbu (potenciometr / fotozávora / magnetický enkóder) a možnost nezávislého programového ovládání zapnutí napájení serva.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *