Servo je motor pro stejnosměrný proud, převodovka a elektronika a to vše zabudované do jednoho celku. Pro konstruktéry je velmi oblíbené pro jednoduché ovládání a nám se může také pro řadu aplikací hodit.
název: B17 Servo
kategorie: B mírně pokročilí
ref.číslo: B17
projekt: kurz micro:bit
verze: 01, 2017-10-22
autor: Ivo Obr, Lanškroun
Pro naši lekci použijeme malé servo Tower Pro SG90, 9 gramové servo (jeho váha je 9g), které může běžet přímo z mikrobitového napájecího zdroje. Jedná se o servo 180 stupňové, což znamená, že se může otáčet v rozsahu od 0° do 180°. Existují i jiná serva, která se mohou natáčet o 270° nebo 360°.
Naše servo má pro připojení tři vodiče, oranžový (SIGNÁL), hnědý (GND) a červený (napájení VCC +). Pro naše pokusy lze napájet servo přímo z 3V micro:bitu, pro projekty – například vozítka a pod. doporučuji napájet serva přímo z napájecího zdroje (do 5V).
Na obrázku je ukázáno natočení serva. To je řízeno třetím vodičem (oranžový – SIGNÁL) a to tak, že na tento vodič se přivádějí impulsy s proměnnou délkou trvání impulsu. Délka impulsu 1ms natočí servo do polohy 0°, délka impulsu 1,5ms pak do polohy 90° a délka impulsu 2ms do polohy 180°. Maximální počet impulsů za 1sec je 50.
Pro naše servo Tower Pro SG90 je šířka impulsu 0,5 ms (0°) až 2,4ms(180°). Servo má standardní napájení 4,8V. Dovede však pracovat v rozsahu 3V až 6V. Hodnota napájení 3V je krajní mez a při které už servo nemá tu sílu a také pracuje velmi neklidně. Pro použití v projektech toto napájení není vhodné (z microbitu).
Pro ovládání serva si nakopírujeme třídu objektu Servo (zdroj gitHub) na začátek programu. Kód je určen pro většinu serv a má čtyři volitelné parametry:
freq – frekvence zasílání povelu. Maximální počet je 50 za vteřinu. Pokud chcete, aby servo pracovalo pomaleji, můžete dát nižší hodnotu (30).
min_us – minimální délka impulsu, při které by se mělo servo natočit do polohy 0°. (U mého serva SG90 s napájecím napětím 5V je optimální hodnota 550).
max_us – maximální délka impulsu, při které by se mělo servo natočit do polohy 180°. (U mého serva SG90 s napájecím napětím 5V je optimální hodnota 2200).
angle – udává hodnotu, otočení serva (180, 270, 360). Pro naše testované servo SG90 je to 180.
class Servo: def __init__(self, pin, freq=50, min_us=600, max_us=2400, angle=180): self.min_us = min_us self.max_us = max_us self.us = 0 self.freq = freq self.angle = angle self.analog_period = 0 self.pin = pin analog_period = round((1/self.freq) * 1000) # hertz to miliseconds self.pin.set_analog_period(analog_period) def write_us(self, us): us = min(self.max_us, max(self.min_us, us)) duty = round(us * 1024 * self.freq // 1000000) self.pin.write_analog(duty) self.pin.write_digital(0) # turn the pin off def write_angle(self, degrees=None): degrees = degrees % 360 total_range = self.max_us - self.min_us us = self.min_us + total_range * degrees // self.angle self.write_us(us)
Nastavení hodnot si pro určité napájecí napětí vyzkoušejte. Ve vzorovém kódu jsou originální hodnoty.
Vytvoříme si objekt sv0, což bude naše servo a nastavíme si ho na ovládání přes pin0 :
sv0 = Servo(pin0)
Protože můžeme ovládat více serv, tak pro jednoduchost si je můžeme například pojmenovat sv0, sv1 a sv2.
sv0 = Servo(pin14)
sv1 = Servo(pin15)
sv2 = Servo(pin16)
Příkaz k natočení serva do určité polohy (v příkladu je to natočení do polohy 45°) je pak velmi jednoduchý a vypadá takto :
sv0.write_angle(45)
Celý program na odzkoušení funkčnosti může vypadat takto :
from microbit import * class Servo(): def __init__(self, pin, freq=30, min_us=550, max_us=2200, angle=180): self.min_us = min_us self.max_us = max_us self.us = 0 self.freq = freq self.angle = angle self.analog_period = 0 self.pin = pin analog_period = round((1/self.freq) * 1000) self.pin.set_analog_period(analog_period) def write_us(self, us): us = min(self.max_us, max(self.min_us, us)) duty = round(us * 1024 * self.freq // 1000000) self.pin.write_analog(duty) self.pin.write_digital(0) def write_angle(self, degrees=None): degrees = degrees % 360 total_range = self.max_us - self.min_us us = self.min_us + total_range * degrees // self.angle self.write_us(us) sv0 = Servo(pin13) while True: sv0.write_angle(0) sleep(2000) sv0.write_angle(90) sleep(2000) sv0.write_angle(180) sleep(2000) sv0.write_angle(90) sleep(2000)
(servo je zapojeno na pin13, počet impulsů za vteřinu je nastaveno standardně na 30).
Pokud máme dvě různá serva, nastavíme jejich parametry při vytváření jejich objektů :
sv0 = Servo(pin15, 40, 500, 2500, 270)
sv1 = Servo(pin16, 50, 1000, 2000)
Použití serva jako DC motoru
Často se servo používá jako DC motor vzhledem k jednoduchosti jeho řízení. Nejdříve je ale třeba upravit servo tak, aby se mohlo volně otáčet a mírně upravit elektroniku. Návod lze najít například na webové stránce : https://arduino.cz/jak-hacknout-servo-motor/
Pokud jsme si servo takto upravili, pak příkaz
sv0.write_angle(90)
zastaví otáčení serva. Pokud snižujeme hodnotu úhlu v závorce, servo se otáčí na jednu stranu, pokud zvyšujeme hodnotu nad hodnotu 90, servo se otáčí na druhou stranu.
Příkaz sv0.write_angle(0) a sv0.write_angle(180) jsou maximální rychlosti otáčení serva.
Poznámka :
Pokud servo není v klidu po příkazu sv0.write_angle(90), musíme doladit hodnoty min_us a max_us.