Po prostu kontroluję serwomechanizmy (9 g Micro Servos) w oparciu o niektóre dane odczytane z innych źródeł. Wszystko działa dobrze, z wyjątkiem tego, że serwa będą się ciągle „trzęsły”. Oznacza to, że wibrują do tyłu bardzo subtelnymi ruchami (z przerywanymi ruchami około 1/2 -> 1 cm lub mniej więcej).
Próbowałem rozwiązać ten problem w oprogramowaniu, wykonując coś takiego:
do{
delay(DTIME);
positionServo();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("X position: ");
lcd.print(xRead);
lcd.setCursor(0,1);
lcd.print("Y position: ");
lcd.print(yRead);
}while( readChange() ); //while there has been change
Tam, gdzie jest to konieczne, zainicjuj zmienne przechowujące zmapowaną wartość serwomechanizmu (używając biblioteki serwomechanizmów arduino).
Funkcja readChange () jest zdefiniowana jako:
int readChange(){
int x_Temp, y_Temp;
x_Temp = map(analogRead(x_axisReadPin), 0, 1023, 0, 179);
y_Temp = map(analogRead(y_axisReadPin), 0, 1023, 0, 179);
if( abs(x_Temp - xRead) < DEG && abs(y_Temp - yRead) < DEG ) return 0; // no change
else return 1; //change
}
Gdzie xRead jest wartością, która została zainicjowana (pierwsze zmapowane wyjście serwa).
Chociaż to naprawdę nie jest dobre podejście. Wymaga to, aby OBA wartości nie mogły ulec zmianie o współczynnik DEG (~ 10 stopni lub ~ 0,28 V w moim przypadku). Jeśli napiszę taką funkcję, że albo OR będzie mniejsze niż DEG, to co, jeśli zmieniam tylko jedno serwo na raz? Istnieje więc delimma ..
Czy to po prostu własność serwomechanizmów (być może tanich?), Czy może istnieje obejście?
O wiele łatwiej byłoby dołączyć link do ciasta. Oto pełny kod: http://pastie.org/8191459
Dołączyłem dwa serwa wraz ze wskaźnikiem laserowym, aby umożliwić dwa stopnie swobody (X, Y). Istnieją opcje, oparte na stanie kilku przycisków, do sterowania serwomechanizmami na różne sposoby. Pierwszym z nich jest „Motion”, w którym mam dwa fotorezystory, które w zależności od ekspozycji na światło wpływają na pozycję serwomechanizmów. Nie wdrożyłem jeszcze kodu do kontrolowania serwomechanizmów przez kontroler Xbox. A trzecia opcja to po prostu ruch losowy.
Odpowiedzi:
Podczas korzystania z biblioteki Servo w Arduino powszechnym źródłem szumów serwomechanizmu jest to, że procedury serwonapędów sterowane przerwaniami w rzeczywistości nie dają bardzo stabilnego impulsu wyjściowego. Ponieważ AVR przyjmuje przerwania do obsługi zegara millis () i innych rzeczy w środowisku uruchomieniowym Arduino, drgania w bibliotece Servo są rzędu kilku mikrosekund, co przekłada się na duży ruch w serwomechanizmie.
Rozwiązaniem tego jest napisanie własnego pulsu. Coś takiego:
Spowoduje to wyłączenie innych przerwań i wygenerowanie znacznie czystszego impulsu PWM. Spowoduje to jednak, że zegar „millis () przegapi kilka tyknięć zegara. (Funkcja„ micros () ”może być nazwana czymś innym - dokładnie zapominam.
Ogólnie rzecz biorąc, do krytycznego kodu czasowego chcesz całkowicie pozbyć się środowiska uruchomieniowego Arduino i napisać własny przy użyciu kompilatora avr-gcc i biblioteki avr-libc, która zasila środowisko Arduino. Następnie możesz ustawić licznik czasu tak, aby tykał 4 razy na mikrosekundę, a nawet 16 razy na mikrosekundę i uzyskać znacznie lepszą rozdzielczość PWM.
Inną przyczyną szumów w serwomechanizmach są tanie serwomechanizmy z tanimi czujnikami, w których czujniki są głośne lub gdy dokładna pozycja żądana za pomocą impulsu nie może być faktycznie zakodowana przez czujnik. Serwo zobaczy „przesuń się do pozycji 1822” i spróbuje to zrobić, ale skończy z odczytem czujnika 1823. Serwo powie następnie „cofnij się trochę” i skończy z odczytem czujnika 1821. Powtórz! Rozwiązaniem tego problemu jest użycie serwomechanizmów wysokiej jakości. Idealnie nie w ogóle serwo hobbystyczne, ale prawdziwe serwomechanizmy z optycznymi lub magnetycznymi enkoderami absolutnymi.
Wreszcie, jeśli serwomechanizmy nie otrzymają wystarczającej mocy lub jeśli spróbujesz wyprowadzić ich moc z szyny 5 V w Arduino, spowoduje to wywołanie szumu indukowanego napięciem w serwomechanizmach, jak sugerowano powyżej. Możesz być w stanie naprawić to za pomocą dużych kondensatorów elektrolitycznych (które i tak są dobrym pomysłem do ogólnego filtrowania), ale bardziej prawdopodobne jest, że chcesz upewnić się, że źródło zasilania serwomechanizmu może rzeczywiście dostarczać kilka amperów prądu przy napięciu serwomechanizmu.
źródło
Nazywa się to „buzz”.
Powoduje to kilka rzeczy. Niestabilność mocy serwomechanizmu jest częstą przyczyną. Serwa R / C mogą rysować DUŻE impulsy, gdy po raz pierwszy uruchamiają silnik.
Wiele lat temu grałem z serwomechanizmem Tower Hobbies Royal Titan Standard, sterując nim z 555 i falownika z jednym tranzystorem. Prosty obwód sterowania. Dowiedziałem się, że silnik serwo pobierał 250 mA ze źródła 5 V podczas ciągłego ruchu. Brzęcząc, z łatwością rysował skoki półampera. (Może więcej: po prostu monitorowałem bieżący miernik na moim stanowisku, a nie szukałem bocznika wyczuwającego prąd).
Oswojone zajęło mi 220 uF bezpośrednio na moim serwie.
Spróbuj umieścić kondensator elektrolityczny, co najmniej 100 uF, bezpośrednio na zasilaczu serwomechanizmu, możliwie jak najbliżej serwomechanizmu, i sprawdź, czy to pomoże.
W oparciu o te eksperymenty nigdy nie rozważałbym użycia serwomechanizmów R / C do WSZYSTKIEGO bez dodania kondensatorów. Dotyczy to modeli sterowanych radiowo.
Może to być również spowodowane zabrudzeniem w naczyniu serwa wewnątrz serwomechanizmu. Najpierw wypróbuj kondensator.
źródło
Czy twoje brzęczenie / drżenie dzieje się tylko wtedy, gdy osiągasz lub zbliżasz się do granic serwomechanizmu (0 stopni lub 180 stopni)? Jeśli tak, może być dla Ciebie prosta poprawka. Przekonałem się, że tanie serwomechanizmy nie umieją bardzo dobrze trzymać się granic ruchów, co może powodować brzęczenie / drżenie, o których wspominasz. Jeśli jednak ograniczysz ich zasięg do 10 ~ 170 stopni, problem zostanie rozwiązany.
Jeśli to nie wystarczy, możesz zastosować bardziej złożone poprawki wspomniane w innych odpowiedziach, takie jak lepsza moc, lepsze czujniki serwo itp.
źródło
Rozwiązałem problem, „wyłączając serwo” po jego przeniesieniu. Przykład:
PIN
jest pin PWM podłączony do twojego serwomechanizmu. przełączając go w tryb wejściowy byłem w stanie wyłączyć wibracje. To nie jest optymalne rozwiązanie i sugerowałbym najpierw wypróbowanie innych rozwiązań.źródło
Miałem ten sam problem z serwomechanizmami MG90S (drgania), moje linie sygnałowe są stosunkowo długie (60 ~ 70 cm), umieszczenie kondensatora 103 (10nF) nad sygnałem i linie uziemienia naprawiły dla mnie problem (umieściłem kondensator gdzieś w środek, w miejscu, w którym oryginalny kabel serwo łączy się z moim kablem wewnętrznym).
Ponadto nie mogłem użyć standardowej biblioteki Servo, ponieważ pierwszym zegarem, który chwyta Arduino Mega, jest Timer-5 i potrzebuję go do pomiaru częstotliwości. Ponieważ używam tylko 10 serwomechanizmów, wyodrębniłem kod klucza z biblioteki serwomechanizmów i zmieniłem go na używanie Timera-1 (każdy zegar obsługuje maksymalnie 12 serwomechanizmów w Mega).
Oddzielny kod znajduje się poniżej w celach informacyjnych, jeśli chcesz uwzględnić go we własnym projekcie, możesz użyć tylko górnej części, dolna część służy do testowania górnej części (nasłuchuje na porcie szeregowym, możesz podać sX i komendy vX, gdzie sX wybiera serwo, s0 wybiera pierwsze serwo, vX ustawia w nas pozycję serwomechanizmu, więc v1500 ustawiłby serwomechanizm 0 w pozycji środkowej, zakładając, że najpierw wydałeś komendę s0).
źródło
Moją najlepszą opcją w tym przypadku było dołączanie i odłączanie serwomechanizmów w każdej operacji.
PS. to naprawdę nie jest żadna jakość, tylko obejście.
źródło
Podczas gdy inni sugerowali różne rozwiązania tego brzęczącego serwomechanizmu, w tym wątku i na innych forach Arduino, a mianowicie:
W moim przypadku stwierdziłem, że brzęczenie ustało po podłączeniu zasilacza 9 V / 2 A do płyty Arduino. Ale najłatwiejszym rozwiązaniem było po prostu powolne przesuwanie serwomechanizmu:
YMMV.
źródło
źródło
Dla mnie wygląda to na błędy lub nieprawidłowe dostrojenie pętli sprzężenia zwrotnego. Najwyższej klasy serwosterowanie ma pewną wiedzę na temat charakterystyki silnika (indukcyjności, momentu obrotowego, prądu szczytowego, liczby biegunów), obciążenia (momentu bezwładności) i warunków chwilowych (pozycja, obroty na minutę, prąd wsteczny, prąd). Dzięki tym informacjom program sterujący silnikiem może przewidywać, co serwo zrobi w odpowiedzi na dane wejście ze sterownika (tj. Wejście prąd / napięcie) i na tej podstawie wygenerować optymalny sygnał wejściowy, aby osiągnąć pożądaną moc wyjściową.
Jak możesz sobie wyobrazić, jest to nieco skomplikowana sprawa, ale zaczniesz szukać w Internecie informacji zwrotnych na temat serwomechanizmu.
źródło