Skocz do zawartości
Treker

[Mechanika] Jak przerobić serwomechanizmy do napędzania robotów?

Pomocna odpowiedź

poszły z dymem w ilości szt 3 na 18

To która noga Mańka? 😉

Udostępnij ten post


Link to post
Share on other sites

Z tego co pamiętam to żadna :] Chyba nadmiarowe serwa 🙂

Udostępnij ten post


Link to post
Share on other sites

He he he 🙂 Prześmiewcy... Maniuś bynajmniej nie kuśtyka... Serwa zostały wymienione, ale padły rzekłbym... losowo

Od tego czasu zawsze mam jedno w zapasie 😉

Udostępnij ten post


Link to post
Share on other sites

Witam. Jestem na etapie przeróbki moich serw i doszedłem do tego momentu co widać na zdjęciach i nie wiem co dalej mam zrobić proszę o pomoc. Mam coś z tego usunąć. ?

http://www.fotosik.pl/pokaz_obrazek/a4f7062997a70e59.html

http://www.fotosik.pl/pokaz_obrazek/ea2bf5f28c3fe37a.html

__________

Komentarz dodany przez: Sabre

[ Dodano: 03-06-2014, 16:28 ]

więc jak pomoże ktoś ?

Udostępnij ten post


Link to post
Share on other sites

Ok coś tam rozebrałeś, ale czego od nas oczekujesz ? Sam przerabiałem te serwa i nie ma tam nic trudnego, wycinamy blokadę, i chyba coś jeszcze z potencjometrem robiłem, ale jak patrzę to Ty go kompletnie rozłożyłeś, a on chyba pełni rolę osi dla zębtaki wyjściowej.

Udostępnij ten post


Link to post
Share on other sites

Zrobiłem to tak: to co jest przymocowane do płytki obok silniczka to uciąłem całkowicie i jak składałem to serwo to tą część która leży na zdjęciu obok zębatki to już jej nie wkładałem z powrotem ponieważ ono tam ma taką blokadę i ta duża zębatka nie obracała się dookoła. Jak złożyłem serwo i przyłożyłem zasilanie z baterii to silnik się obracał wraz z zębatkami.

Udostępnij ten post


Link to post
Share on other sites

Cześć!

Przeszukiwałem może i nie cały internet, ale w zakresie przeróbki serw mowa jest o usunięciu blokady 180st. lub usuwaniu układu. A ja mam taką zachciankę: potrzebuję serwa min. 0-135st., którego prędkością da się sterować (to znaczy bez delay-ów w kodzie). Są serwa, którym oprócz położenia możemy zadawać prędkość obrotową?

Jedyny pomysł w tym zakresie, jaki mi przychodzi do głowy, to do serwa 360st. (pośrednio) do wału serwa zamocować potencjometr, i programowo zadawać serwu obroty do momentu osiągnięcia odpowiedniego napięcia na tym potencjometrze za pomocą "while" czy czegoś takiego, ale to rozwiązanie mało mi odpowiada.

Ma ktoś jakiś pomysł?

Udostępnij ten post


Link to post
Share on other sites

Są tak zwane "smart servo" (na przykład to, co kolega podlinkował), które mają w środku komputerek i którym można kazać zrobić wszystko. Tylko są odrobinkę drogie. Za to doskonale się nadają do robotów, bo mają też duży moment i potrafią ci powiedzieć jaka siła na nie działa.

Z drugiej strony, serwa modelarskie są stosunkowo tanie i łatwo dostępne, więc może niekoniecznie warto z nich tak od razu rezygnować. Możesz je podłączać bezpośrednio do mózgu twojego robota i tak nimi sterować, ale jak sam zauważyłeś, programowanie staje się w pewnym momencie uciążliwe. Ja znalazłem na to rozwiązanie w postaci kontrolera serw -- osobnego mikrokontrolera, który zajmuje się tylko i wyłącznie obsługą serw -- działa jako slave i2c, dostaje pozycje serw i jego odpowiedzialnością jest wygenerowanie odpowiednich sygnałów PWM. Z łatwością można mu dorobić możliwość ograniczania prędkości serw czy nawet różne profile ruchu, a twój główny mikrokontroler jest odciążony. Osobiście używam do tego własnej konstrukcji opartej na atmega328p (obsługuje mi 20 kanałów), ale istnieją też fabryczne kontrolery serw (na przykład Maestro z Pololu), które też mają takie funkcje wbudowane. No i wyjdzie dużo taniej niż ax12.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Są także modelarskie "zwalniacze" serw używane np. do otwierania luków bombowych czy wysuwania podwozia - tanie moduliki włączanie między źródło sygnału PPM a serwo do znalezienia w "dobrych sklepach modelarskich" 🙂 Ale to moim zdaniem - przy obecności procesora na pokładzie - pójście na łatwiznę i wyrzucanie pieniędzy.

No a tak na marginesie: używanie delay() przy wyznaczaniu pozycji pośrednich (i w wielu innych przypadkach) to jednak straszny prymityw i brak umiejętności myślenia "mikrokontrolerowego". Nazwałbym to wręcz skazą lub syndromem Arduino, bo zjawisko staje się powszechne i bardzo wypacza sposób myślenia o programach. Wystarczy trochę się wysilić i raz napisać odpowiednią funkcję a wszystkie Twoje serwa będą jednocześnie jeździły dowolnie wolno (lub szybko) z prędkościami zadanymi w programie w dowolną stronę w dowolnej chwili. Spróbuj, to wcale nie takie trudne. W razie problemów pisz - jeśli tylko czaisz ułamki, z tym także sobie poradzisz 🙂

Udostępnij ten post


Link to post
Share on other sites
Wystarczy trochę się wysilić i raz napisać odpowiednią funkcję a wszystkie Twoje serwa będą jednocześnie jeździły dowolnie wolno (lub szybko) z prędkościami zadanymi w programie w dowolną stronę w dowolnej chwili.

Jestem strasznym zieleńcem jeżeli chodzi o programowanie. Jedyne, co zrobiłem póki co, to funkcja dzieląca drogę między położeniem aktualnym a zadanym na kilka odcinków, następnie realizująca ruch co składową drogi z różnymi delay-ami. Po odpowiednim doborze czasu przerw działało nawet ładnie, bez skoków, chociaż ciężko to było nazwać płynnym ruchem. Niestety w tym czasie reszta programu stoi i szlak mnie trafia 😉, wszystko się wali.

Bardzo mi zależy na pracy serwa bez zrywów - z rozpędem i hamowaniem. Możesz podać jakiś przykład funkcji, o której pisałeś?

Udostępnij ten post


Link to post
Share on other sites

No to witamy w świecie równoległego wykonywania wielu zadań 🙂 Dokładnie tego potrzebujesz by Twój program mógł zrobić coś takiego:

servo_speed = 10;

servo_target_position = 60;

i nie wywołując żadnego pożeracza czasu przestał się martwić o ruch serwa. Samo dojedzie do pozycji 60 z zadaną prędkością 🙂

Jak to zrobić? Przede wszystkim musisz zauważyć, że pozycja żądana/ustawiana przez program w danej chwili nie może być pozycją rzeczywistą serwa a tylko "życzeniem", "celem" do jakiego ono za chwilę będzie podążać. Żeby to zadziałało, musisz oddzielić aktualną pozycję serwa - ustawianą funkcją servo.write() od tego co program w danej chwili "chce" i tym samym przestać używać w programie servo.write(). Tylko w ten sposób możesz zrównoleglić działanie programu i silnika serwa: wyzwolenie ruchu jest teraz chwilą w czasie po której program robi już coś innego a serwo samodzielnie podąża ku pozycji docelowej. Kluczem jest oczywiście słowo "samodzielnie.

Żeby ziścił się pomysł automatycznego i dowolnie powolnego ruchu, serwo i tak musi dostawać "wolnozmienny" rzeczywisty sygnał PWM - to już przetrenowałeś na delay().

To teraz wyobraź sobie, że masz mechanizm który pozwala na wykonywanie jakiejś funkcji okresowo w czasie bez konieczności ciągłego jej wywoływania z kodu. Załóżmy, że będzie to okres 50ms czyli 20 razy na sekundę. Funkcja będzie służyła do kontroli położenia serwa więc jej zadaniem będzie ciągłe śledzenie tego co program "chce" i tego, gdzie jest w rzeczywistości serwo.

Dla jednego serwa potrzebujesz kilku zmiennych:

uint16_t

servo_speed,
servo_target_position,
servo_current_position;

Twój główny program używa tylko dwóch pierwszych a pewnie tak naprawdę tylko jednej: pozycji docelowej, bo prędkość może ustawić gdzieś na początku tylko raz. Natomiast okresowo wykonywana funkcja kontroli serwa ma dostęp do wszystkich trzech wartości. I teraz wystarczy, że będzie robiła coś takiego:

if (servo_target_position > servo_current_position)

servo_current_position += servo_speed;

else if (servo_target_position < servo_current_position)

servo_current_position -= servo_speed;

servo.write(servo_current_position);

Jeżeli pozycja docelowa jest większa niż aktualna, dodajemy mały kroczek a jeśli mniejsza - odejmujemy. Prędkość ruchu serwa zależy teraz od częstotliwości wywoływania funkcji kontrolnej - ale ta jest stała i od ustawionej wartości servo_speed czyli od kroku. Jeżeli funkcja będzie wołana jak wcześniej napisałem 20 razy na sekundę, to przy kroku = 1 masz minimalną prędkość zmian pozycji serwa 20 jednostek/s. Regulując servo_speed regulujesz prędkość a pozycje zadane wpisujesz tylko raz na początku ruchu serwa 🙂

Fajne?

No to teraz poczytaj o timerach:

http://playground.arduino.cc/Code/ArduinoTimerObject

napisz prototyp funkcji i uzupełnij ją o zabezpieczenia, np. by w czasie ruchu "w górę" nie przejeżdżać powyżej target_position nawet przy dużym kroku (dużej prędkości) a podczas ruchu "w dół" nie spadać poniżej pozycji zadanej. Czekam na ciekawy kawałek kodu 🙂

BTW: W wersji wielowyjściowej zmienne servo_cośtam mogą stać się tablicami i każde serwo dostanie swój indeks w tablicy a funkcja kontrolna może "obrabiać" wszystkie serwa w jednej pętli.

  • Lubię! 1

Udostępnij ten post


Link to post
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!

Gość
Napisz odpowiedź...

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