Skocz do zawartości

Problem z drżącymi serwami


Pomocna odpowiedź

Napisano

Witam.

Od jakiegoś czasu buduję czworonożnego robota kroczącego. Zaopatrzyłem się we wszystkie niezbędne elementy, zmontowałem jedną nogę robota i zabrałem się za testowanie jej ruchu. Niestety, cały czas zmagam się z problemem nieustannie występujących drgań.

Korzystam z Arduino Mega 2560, do którego podłączone są na razie trzy serwa PowerHD AR-1201MG(http://botland.com.pl/serwa-powerhd/3508-serwo-powerhd-ar-1201mg-standard.html). Zasilanie idzie z akumulatora LiPol Redox 3300mAh 7,4V(http://botland.com.pl/pakiety-li-pol-2-celowe-74v-redox/1700-pakiet-lipol-redox-3300mah-30c-2s-74v.html), które jest przetwarzane na napięcie 6V.

Przy teście korzystałem z samodzielnie napisanego programu, a także ze zwykłego programu "sweep" z biblioteki Arduino. W obu przypadkach noga drży podczas wykonywania ruchu. Wcześniej używałem serw PowerHD HD-6001HB (plastikowe zębatki)(http://botland.com.pl/serwa-typu-standard/2311-serwo-powerhd-hd-6001hb-standard.html i ruch był bardzo płynny, lecz niestety, serwa się "rozwaliły" podczas testowania szybszego ruchu.

Czy macie może pomysł, jak poradzić sobie z tym problemem? Niepokoi mnie to, ponieważ wszystkie roboty, jakie widziałem, wykonują płynne ruchy.

Przestań im dawać kofeinę...

A tak poważnie - jak zasilasz serwa i samo arduino? Stabilizator, przetwornica? Dla obu wspólne, czy osobne? Ile kondensatorów, gdzie i jakie wartości?

Serwa są zasilane przez przetwornicę 5A ustawioną na 6V. Arduino na razie z USB z komputera. Kondensatory na razie próbowałem 10uF na wejściu i wyjściu przetwornicy.

Użyłem bardziej pojemnych kondensatorów (470uF, zgodnie z poradą), lecz niestety, nie zaobserwowałem żadnej poprawy. Nie próbowałem jeszcze niczego z regulacją częstotliwości PWM, bo szczerze mówiąc, nie wiem jak to zrobić, aby było dobrze :/ Mógłbyś bardziej szczegółowo opisać, co i jak to zrobić? Byłbym wdzięczny.

Mechano, masy są zwarte prawidłowo.

KN17, nigdy się w to nie bawilem, bo ogólnie mało programuję, ale "mój" informatyk to zasugerował. Spróbuj po prostu googlać hasło "arduino pwm frequency", na pewno coś znajdziesz (ja już natknąłem się na jakieś filmiki na samej górze wyników, ale nie wiem czy są dobre, więc sam obadaj)

Jeśli używasz biblioteki Servo z Arduino, to nie używa ona PWM, tylko timera z przerwaniem i nie da się w niej zmienić częstotliwości bez modyfikacji kodu biblioteki. Co zresztą nie powinno być wymagane, bo każde serwo powinno sobie dawać radę z 50Hz które są tam domyślnie.

Powszechnymi przyczynami drżenia serwa mogą być:

* zbyt mały prąd zasilania, na przykład przy zasilaniu go przez płytkę arduino albo z baterii,
* zbyt duża bezwładność obiektu, którym serwo macha -- wtedy PID nie daje rady,
* zakłócenia w zasilaniu lub sygnale,
* uszkodzone serwo.

Z doświadczenia, w 90% przypadków jest to problem z zasilaniem.

Sprawdzałem ruch nogi przy dużych skokach sygnału PWM (np. z 1000 do 2000 mikrosekund) i wszystkie trzy serwa poruszały się płynnie utrzymując początkową i końcową pozycję. W momencie gdy puściłem serwa w pętli dużo gęściej zmieniającej pozycję, to ruch nogi ponownie stał się szarpany. Następnie zmieniłem program sterujący serwami tak, aby nie wykorzystywać biblioteki "". Program steruje tylko za pomocą zmiany czasu trwania poziomu wysokiego na pinach cyfrowych.

int a;
int b = 20;
void setup()
{
 pinMode(4, OUTPUT);      // sets the digital pin as output
 pinMode(8, OUTPUT);      // sets the digital pin as output
 pinMode(12, OUTPUT);      // sets the digital pin as output

}

void loop() {

for (a = 1000; a <= 2000; a += 50) { 
   digitalWrite(4, HIGH);
   digitalWrite(8, HIGH);
   digitalWrite(12, HIGH);
   delayMicroseconds(a);                  
   digitalWrite(4, LOW);
   digitalWrite(8, LOW);
   digitalWrite(12, LOW); 
   delay(b);
 }
 delay(2000);
 for (a = 2000; a >= 1000; a -= 50) { 
   digitalWrite(4, HIGH);
   digitalWrite(8, HIGH);
   digitalWrite(12, HIGH);
   delayMicroseconds(a);                  
   digitalWrite(4, LOW);
   digitalWrite(8, LOW);
   digitalWrite(12, LOW);

  delay(b);       
 }
 delay(2000);
}

Przy zachowaniu wartości a na poziomie 50 i b równe 20 ruch pozostaje w miarę płynny. Zmniejszenie a bądź zwiększenie b powoduje, że noga znowu zaczyna szarpać.

  • 3 tygodnie później...
* zbyt duża bezwładność obiektu, którym serwo macha -- wtedy PID nie daje rady,

Jak sobie z tym poradzić? Jakoś zmniejszyć bezwładność, czy da się programowo to zmienić? I jeżeli się da, to jak się za to zabrać?

Jak wiadomo bezwładność jest związana z masą spoczynkową a ta jest od dawna zastępowana kilkoma rezystorami 10k (rozwiązanie sprzętowe), dwoma prostymi pętlami for (wersja dla programistów) lub kilkoma Joule'ami energii (dla fanatyków Nauki).

  • Lubię! 1

Czyli rozumiem, że mam upłynnić ruch serw, by ruch był bardziej trapezowy/gaussowy niż skokowy? Bo nie wiem czy dobrze zrozumiałem: daję rezystor na linię zasilania, by spowolnić ładowanie serwa, lub/i pętlami "for" programuję ruch tak by się stopniowo silnik przyspieszał start i spowalniał koniec swójego ruch?

Przestań brnąć, to miał być żart. Zapytałeś czy da się programowo zmienić/zmniejszyć bezwładność. Nie da się. Jedynym wyjściem jest zmniejszenie masy lub skupienie jej wokół osi obrotu. Nie masz wpływu na działanie prostego serwa. Jeżeli jego algorytm nie radzi sobie z bezwładnością obiektu, nic nie zrobisz bo a) nie masz szans się o tym przekonać, b) wewnętrzna pętla regulacji serwa i tak jest szybsza niż sterowanie z PPM a i tak poległa.

A o co właściwie pytasz?

Buduję manipulator za pomocą kilku serw. Zaprogramowałem sztucznie ruch serw, by płynnie się przemieszczały, ale drgają mi dość mocno (nie są to typowe szarpnięcia, które też czasami zdarzy mi się zaobserwować jak coś namieszam z kablami/masą). Zastanawiałem się czy to może być wina bezwładności. Chciałem na to jakoś zadziałać i sprawdzić czy tutaj leży problem.

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