3.16. Upravljanje servom

Hobi (RC) servo je mali motor s prijenosom u zatvorenom kućištu s ugrađenom regulacijom položaja zatvorenom petljom. Unutar kućišta nalaze se istosmjerni motor, reduktorski prijenos, potenciometar spojen na izlaznu osovinu i mala upravljačka pločica koja uspoređuje očitanje potenciometra sa zadanom vrijednošću koja dolazi izvana. Upravljač pokreće motor u onom smjeru koji smanjuje pogrešku i zaustavlja se kada se položaj podudara. Sa strane kamere ništa od toga nije vidljivo – jednostavno kažete servu kamo da ide.

3.16.1. PWM signal

Servo prima svoju zadanu vrijednost kao PWM signal pri fiksnoj učestalosti sličica od 50 Hz, gdje širina impulsa bira položaj:

  • Impuls od 1,0 ms pomiče osovinu na jedan kraj njezina hoda.

  • Impuls od 1,5 ms parkira osovinu u središtu.

  • Impuls od 2,0 ms pomiče osovinu na drugi kraj.

Bilo što između preslikava se na srednji položaj.

Tri reda pravokutnih valnih oblika složena okomito. Svaki red prikazuje jedno razdoblje od 20 ms PWM-a na 50 Hz s uskim visokim impulsom na početku: 1,0 ms u gornjem redu, 1,5 ms u srednjem, 2,0 ms u donjem.

PWM sličica serva traje 20 ms; širina impulsa (1,0 – 2,0 ms) bira položaj.

Za razliku od LED dioda i motora, servo ne usrednjava PWM. Sama širina impulsa je naredba: interna logika serva mjeri svaki impuls, postavlja svoj cilj u skladu s tim i pokreće motor dok se izlaz ne podudari. Radni ciklus kao udio (između 5 % i 10 % preko cijelog raspona) je sporedan – bitna je apsolutna širina impulsa, što je ono što softver treba kontrolirati.

3.16.2. Ožičenje

Hobi servi koriste tropolni priključak:

  • Napajanje (obično crveno): vlastito napajanje serva, tipično 4,8 V do 6 V. Ne napajajte servo iz 3,3 V razine kamere – ona ne može isporučiti struju zastoja, a razina će pasti.

  • Uzemljenje (obično crno ili smeđe): povratni put za napajanje serva, vezan na uzemljenje kamere tako da signal također ima zajedničku referencu.

  • Signal (obično bijelo, žuto ili narančasto): PWM linija s GPIO-a kamere.

3.16.3. Kod

duty_u16() bi radilo, ali postavlja radni ciklus kao udio razdoblja – nezgodno za signal kod kojeg je bitna apsolutna širina impulsa, a razdoblje je fiksno. duty_ns() postavlja širinu impulsa izravno u nanosekundama:

from machine import PWM, Pin

servo = PWM(Pin("P7"), freq=50, duty_ns=1_500_000)  # centre

Nosivi signal je 50 Hz (razdoblje od 20 ms); visoko vrijeme u svakom ciklusu je točno 1500 µs. Mala pomoćna funkcija čini preslikavanje položaja u impuls eksplicitnim:

def set_position(angle):
    # angle: 0..180 degrees mapped to 1.0..2.0 ms
    pulse_us = 1000 + (angle * 1000) // 180
    servo.duty_ns(pulse_us * 1000)

set_position(0)      # full one way
set_position(90)     # centre
set_position(180)    # full the other way

Sporo pomicanje preko raspona:

import time

for angle in range(0, 181, 5):
    set_position(angle)
    time.sleep_ms(20)
for angle in range(180, -1, -5):
    set_position(angle)
    time.sleep_ms(20)

Raspon 1,0 – 2,0 ms je standard, ali mnogi servi prihvaćaju širi raspon (često 500 µs do 2500 µs) za puni hod. Podatkovni list serva navodi točne granice širine impulsa; brojevi izvan tog raspona mogu udariti motor u njegove mehaničke graničnike.

Za servo s nestandardnim rasponom, podignite granice u konstante i parametrizirajte preslikavanje:

PULSE_MIN_US = 500     # full one way (from the data sheet)
PULSE_MAX_US = 2500    # full the other way

def set_position(angle):
    span_us = PULSE_MAX_US - PULSE_MIN_US
    pulse_us = PULSE_MIN_US + (angle * span_us) // 180
    servo.duty_ns(pulse_us * 1000)