Skocz do zawartości

Serwokontroler amatorski - co powinien posiadać


bartek1333

Pomocna odpowiedź

Witam,
Przymierzam się do budowy* serwokontrolera na ok. 18 serw. I w związku z tym mam pytanie, co powinien taki kontroler posiadać?

Czy wystarczy jak będzie komunikacja UART, a w niej podanie numeru serwa i wypełnienie (lub jakaś liczba z przedziału)?

Czy Wam by takie coś do np. hexapoda lub jakiegoś prostego bipeda/humanoida wystarczyło?

Bo wiadomo że zrobić profesjonalny na który się pisze skrypt z sekwencją ruchów to trudne zadanie 😉

*Nie chcę kupować, tylko zrobić, dlatego napisałem temat. Proszę nie pisać "to kup gotowy" 😉

Link do komentarza
Share on other sites

sobal44, w jaki sposób bez ingerencji w serwo/dodatkowych czujników chcesz podawać położenie orczyka? Bez podpięcia serwokontrolera pod potencjometr w serwie lub jakiegoś dodatkowego czujnika położenia takiej rzeczy raczej nie da się zrealizować.

A co do samego projektu - myślę, że przydatnym również może być regulowanie prędkością serwa (ale to można przerzucić na układ wysyłający dane do serwokontrolera).

  • Lubię! 1
Link do komentarza
Share on other sites

Można zrobić estymację - tworzysz strukturę "serwo" gdzie uzupelniasz parametry (moment, predkosc, obciazenie) i na podstawie inercji estymujesz polozenie serwa...

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Myślę, że całkiem przydatne byłyby wejścia na krańcówki, których stan serwokontroler odsyłałby do komputera / mikrokontrolera głównego. Można by je wykorzystać do badania czy kończyna ma kontakt z podłożem.

Link do komentarza
Share on other sites

Czy prędkość serwa rozumiem dobrze?:

czas po upływie którego serwo osiągnie zamierzaną pozycję; czyli wysyłam do serwokontrolera: serwo 1, wypełnienie 100, prędkość 200ms - i po upływie tego czasu serwo ma się znaleźć w pozycji o wypełnieniu 100?

Tylko gdy już serwo jest w pozycji 110? albo 240? to w drugim przypadku będzie się ono szybciej poruszało bo dłuższą drogę ma do pokonania w tym samym czasie. Dobrze to rozumiem?

Myślę, że całkiem przydatne byłyby wejścia na krańcówki,

Jak się je umieszcza przy serwach?

na podstawie inercji estymujesz polozenie serwa...

🤯 , możesz troszkę rozwinąć? 😉

Cały algorytm (sterowanie przez UART które serwo i jakie wypełnienie) już mam opracowany, teraz go tylko trzeba zaimplementować w C. Ta prędkość by komplikowała sprawę, chyba że tak jak napisał Bobby

(ale to można przerzucić na układ wysyłający dane do serwokontrolera).

Dzięki za odpowiedzi 😉

Link do komentarza
Share on other sites

sobal44, w jaki sposób bez ingerencji w serwo/dodatkowych czujników chcesz podawać położenie orczyka? Bez podpięcia serwokontrolera pod potencjometr w serwie lub jakiegoś dodatkowego czujnika położenia takiej rzeczy raczej nie da się zrealizować.

A co do samego projektu - myślę, że przydatnym również może być regulowanie prędkością serwa (ale to można przerzucić na układ wysyłający dane do serwokontrolera).

Miałem na myśli wysyłanie tylko wartości 0-180* co w rzeczywistości odpowiadało by różnym wartością wypełnienia dla 0stopni max w jedna dla 90* środek itp.

i byś wtedy wysyłał tylko paczke z trzema warotściami np. 10.90.50 co odpowiadało by przestawienie 10serwa do pozycji 90* z predkoscią połowe mniejszą niż maxymalna.

pozdro

Link do komentarza
Share on other sites

predkoscią połowe mniejszą niż maxymalna.

No właśnie, prędkość to dobra rzecz, ale jak ją zaimplementować?

Ma ktoś może jakiś ogólny algorytm?

Link do komentarza
Share on other sites

No właśnie, prędkość to dobra rzecz, ale jak ją zaimplementować?

Ma ktoś może jakiś ogólny algorytm?

Może jakaś funkcja, która jako parametry przyjmie: aktualna pozycję serwa, zadaną pozycje serwa, prędkość.

Funkcja ta będzie obracać serwo o jeden stopień i po każdym takim kroku serwa wprowadzi pewne opóźnienie(krok oczywiście może być mniejszy aby serwo płynniej pracowało).

W zależności od tego jak wyrażana jest prędkość:

Jeżeli prędkość jest wyrażana czasem jaki ma upłynąć podczas ustawiania serwa, to opóźnienie będzie zależne od ilości kroków jaką serwo ma wykonać.

Jeżeli prędkość wyrażona jest procentem od maksymalnej prędkości serwa to można zrobić tak, że znając maksymalna prędkość serwa (np. 0.2s/60*) i kąt o jaki ma się serwo obrócić, możemy wyliczyć czas potrzebny na obrót. Następnie mnożymy go prze współczynnik procentowy prędkości. I dalej to tak jak w punkcie pierwszym.

To taka moja analiza na szybko, bo nigdy tego nie testowałem. Ale jest niewielka szansa na to, że to będzie działać 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

Chodziło mi o prędkość jako prędkość obrotową wału wyjściowego serwa, regulowaną w jakimś tam zakresie. Można to zaimplementować tak, jak napisał davidpi. Załóżmy, że otrzymałeś coś takiego: prędkość 50, położenie 70*. Robisz sobie teraz pętelkę, w której zadajesz serwu pozycję bardzo blisko tej, w której znajduje się aktualnie, za każdym razem "przesuwając" punkt, do którego ma dążyć, aż do osiągnięcia 70*. Dajmy na to, serwo znajduje się w pozycji 10, chcesz by było w tej pozycji 70, to zadajesz mu 11, 12, 13 ... 68, 69, 70 i koniec. W zależności od przerw pomiędzy kolejnymi obiegami pętli regulujesz prędkość serwa (jakiś delay, który za argument przyjmowałby prędkość).

Link do komentarza
Share on other sites

Trochę to trudne 😕 . Zwłaszcza, że że mój opracowany algorytm wygląda w skrócie tak:

- odmierzam timerem 2,5ms

- zmieniam kanał dla dekodera 1z8

- ładuje do OCR1x wartość dla danego serwa.

W ten sposób obsługuję 8 serw w ciągu cyklu 20ms razy dwa czyli razem 16serw.

Chyba na początek zrobię tak jak napisałem w pierwszym poście i prawie na pewno umieszczę jakiś artykuł o tym co mi wyszło 🙂

Link do komentarza
Share on other sites

Zrobiłem kiedyś serwokontroler modelarski do sterowania składanymi podwoziami makiet samolotowych. Tam istniała właśnie możliwość programowania (przez RS232) sekwencji, a w szczególnym przypadku prędkości ruchu serwa. Położenia skrajne były także programowane, bo przecież w każdym samolocie serwo może być trochę inaczej zainstalowane. Czyli właściwie był to ten sam problem co tu: jak w zadanym czasie przejechać z pozycji A do B. Takich algorytmów jest dużo, np. słynny Bresenhama do rysowania wektorów na siatce ale ja zrobiłem tak:

Mój system bazował na podstawie czasu 20ms - taki był okres generowanej ramki PPM. W każdej ramce było co prawda więcej impulsów ale przecież każde serwo widziało tylko "swój"więc nie było sensu częściej liczyć jego pozycji.

Kiedy dostawałem parametry czyli:

➡️ Pozycję startu, nazwijmy ją A (liczba całkowita 0-100)

➡️ Pozycję końcową, B (jw)

➡️ Czas ruchu T (liczony w 1/10 sekundy)

obliczałem:

➡️ Liczbę kroków: N = 5*T (bo w 1/10 sekundy mieściło się pięć 20-milisekundowych interwałów)

➡️ Przyrost pozycji: D = (B-A)/N

Potem wystarczyło dodawać (ze znakiem) do aktualnej pozycji C przyrost D:

C += D

odliczać licznik kroków, ustawiać serwo w pozycji C i po N ramek serwo stało tam, gdzie chciałem, czyli w B.

No i teraz szczegóły. To był procesor tiny44 więc nie mogłem poszaleć i żadna arytmetyka fp nie wchodziła w grę. Z resztą byłaby to armata na wróbla. Zrobiłem to tak:

➡️ Aktualna pozycja serwa była pamiętana z przesunięciem 16 bitów, jako int32_t, czyli np. 50 wyglądało tak: 0x00320000

➡️ Przyrost D był liczony w arytmetyce 32-bitowej ze znakiem i tak samo pamiętany. Ponieważ pozycja aktualna też była 32-bitowa a docelowa była do obliczenia przesuwana << 16, wszystko było ok. "Przecinek" dziesiętny stał zawsze między 16 a 15 bitem - miałem 16-bitów dokładności ułamkowej. To wystarczało, by dobrze trafiać takim algorytmem (gdzie niestety błędy kolejnych dodawań się sumowały) w punkt docelowy przy czasach "przejazdu" ograniczonych do 10 sekund. Dla pewności zrobiłem jeszcze sprawdzenia, czy przy którymś kolejnym dodawaniu serwo nie wyjechało poza pozycję końcową. Po zakończeniu ruchu pozycja aktualna stawała się początkową a do nowych obliczeń brałem nową pozycję docelową z EEPROMu.

Alogrytm z dzieleniem wykonywał sie tylko raz, podczas liczenia przyrostu dla nowego ruchu. Potem już tylko (w przerwaniu) jedno szybkie dodawanie dla każdego serwa i odliczanie licznika kroków 🙂

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.