bartek1333 Napisano Luty 15, 2012 Udostępnij Napisano Luty 15, 2012 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" 😉 Cytuj Link do komentarza Share on other sites More sharing options...
sobal44 Luty 15, 2012 Udostępnij Luty 15, 2012 numer serwa, położenie oryczka w stopniach, prędkość serwa. komunikacja po uart by spokojnie wystarczyła Cytuj Link do komentarza Share on other sites More sharing options...
Bobby Luty 15, 2012 Udostępnij Luty 15, 2012 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). 1 Cytuj Link do komentarza Share on other sites More sharing options...
mog123 Luty 16, 2012 Udostępnij Luty 16, 2012 Można zrobić estymację - tworzysz strukturę "serwo" gdzie uzupelniasz parametry (moment, predkosc, obciazenie) i na podstawie inercji estymujesz polozenie serwa... Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
grabo Luty 16, 2012 Udostępnij Luty 16, 2012 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. Cytuj Link do komentarza Share on other sites More sharing options...
bartek1333 Luty 16, 2012 Autor tematu Udostępnij Luty 16, 2012 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 😉 Cytuj Link do komentarza Share on other sites More sharing options...
sobal44 Luty 16, 2012 Udostępnij Luty 16, 2012 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 Cytuj Link do komentarza Share on other sites More sharing options...
bartek1333 Luty 16, 2012 Autor tematu Udostępnij Luty 16, 2012 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? Cytuj Link do komentarza Share on other sites More sharing options...
davidpi Luty 17, 2012 Udostępnij Luty 17, 2012 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ć 🙂 1 Cytuj Link do komentarza Share on other sites More sharing options...
Bobby Luty 17, 2012 Udostępnij Luty 17, 2012 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ść). Cytuj Link do komentarza Share on other sites More sharing options...
bartek1333 Luty 17, 2012 Autor tematu Udostępnij Luty 17, 2012 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 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Luty 18, 2012 Udostępnij Luty 18, 2012 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 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!