Skocz do zawartości

Pi Pico oraz servo 360, problem z obrotem, ustawieniem pkt 0


Coderson

Pomocna odpowiedź

Hej,

Pomoże ktoś zrozumieć zasadę działania oraz pomoże ustawić serwo bym mógł sterować nim jeżeli chodzi o kąt obrotu, prędkość?

Pi Pico
Servo - EF90D -https://www.elecfreaks.com/360-digital-servo-ef90d-with-wheel-and-tire.html

Zmieniając wartości a,b,c tak naprawdę dostaje losowe obroty etc. nie potrafię znaleźć pkt zero jak i nie potrafię sterować obrotem.
W internecie masa poradników dotycząca servo 120 stopni 160, 180 stopni jednak przekładając kod na moje servo i metodą prób i błędów widze że chyba za daleko nie zajdę.

 

from machine import Pin, PWM
import utime

servo = PWM(Pin(16))
servo.freq(50)

a = 1500
b = 8000
c = int(a + ((b - a)/2))

print("start")
servo.duty_u16(a)
print(a)
utime.sleep(2)
servo.duty_u16(b)
print(b)
utime.sleep(2)
servo.duty_u16(c)
print(c)
utime.sleep(10)
print("stop")

 

Filmik prezentujący jak działa owe serwo z tym kodem(dwa razy uruchomiłem ten program.)
Film do pracy serva

kod.png

servo.png

Link do komentarza
Share on other sites

W tym serwo nie daje się sterować kątem obrotu, tylko prędkością obrotu za pomocą PWM. Zobacz ten wątek - Link

from machine import Pin, PWM
import utime

servo = PWM(Pin(16))
servo.freq(50) # 50/1sek czyli co 20ms(2000us)

''' Wartości zmiennych 'a' i 'b' to max obroty,
    wartość zmiennej 'd' połówa obrotów 'a',
    wartośc zmiennej 'c' stop'''
a = 8192 # 2.5ms czyli 12.5% z 20ms (65536 * 0.125)
d = 6553 # 2.0ms czyli 10.0% z 20ms (65536 * 0.100)
c = 4915 # 1.5ms czyli 7.5% z 20ms (65536 * 0.075)
e = 3277 # 1.0ms czyli 5.0% z 20ms (65536 * 0.050)
b = 1638 # 0.5ms czyli 2.5% z 20ms (65536 * 0.025)

print("start")

servo.duty_u16(a)
print(a)
utime.sleep(2)

servo.duty_u16(d)
print(d)
utime.sleep(2)

servo.duty_u16(c)
print(c)
utime.sleep(2)

servo.duty_u16(b)
print(b)
utime.sleep(2)

servo.duty_u16(e)
print(e)
utime.sleep(2)

servo.duty_u16(c)
print(c)
utime.sleep(2)

for i in range(4915, 8192, 100):
    print(i)
    servo.duty_u16(i)
    utime.sleep(1)
for i in range(8192, 4915, -100):
    print(i)
    servo.duty_u16(i)
    utime.sleep(1)

print("stop")

 

Edytowano przez pakarl
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.