Aplikace B17 Servo

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.

 

Posted in aplikace, kat B - mírně pokročilí.