Skocz do zawartości
alshrom

Serwomechanizm Arduino - problem z utrzymaniem płynności ruchu

Pomocna odpowiedź

Cześć wszystkim.

Udało mi się skompletować wszystkie potrzebne rzeczy do stworzenia pewnego mechanizmu. W skrócie mówiąc jest to mechanizm, który ma za zadanie po naciśnięciu przycisku otwierać klapkę. Pozycja otwarcia/zamknięcia klapki ustawiana jest za pomocą krańcówek. Niestety pojawił mi się problem z serwem (PowerHD LF-20MG-360 standard - praca ciągła 360 stopni). W momencie kiedy ma ono otwierać/zamykać klapkę potrafi nierówno pracować.  Swój układ testowy zasilam z zasilacza ustawionego na 12V, ponieważ z takiego napięcia mam zasilane krańcówki. Reszta układu zasilana jest z przetwornicy 12V/5V (Pololu D24V22F5 - przetwornica step-down - 5V 2,5A). Spróbowałem sprawdzić, czy może pojedyncze elementy w moim układzie wpływają na pracę serwa. W tym celu napisałem program, który miał załączać serwo, gdy arduino otrzymywało sygnał albo z jakiegoś przycisku, albo z jakiejś krańcówki. Z każdego sygnału serwo chodziło równo. Niestety na docelowym programie serwo cały czas chodzi nierówno, a problem potęguje się jeżeli nastawię niską prędkość obrotową (np. 94 stopnie -serwo stoi przy 91*). Próbowałem naprawić problem poprzez wstawienie na wyjściu z przetwornicy kondensatora 470uF, ale jego obecność nic nie daje. Ostatecznie zauważyłem, że zmieniając wartość "delay"  w kodzie programu udaje się trochę poprawić pracę serwo. Przy delay na poziomie 225ms serwo chodzi lepiej niż na 25ms, ale nadal nie jest to praca płynna. Ustawiając duże wartości delay, tracę możliwośc precyzyjnego sterowania klapką, bo zanim sygnał z krańcówki wyłączy serwo, to silnik nadal będzie się kręcił właśnie o tą wartość "delay". Poniżej przedstawiam swój kod, schemat układu i filmiki z pracy serwa (jeden na delay 25ms, drugi na 225ms).

 

 

#include<Servo.h>


Servo servo;


void setup() {

pinMode(10, INPUT); //przelacznik M
pinMode(9, INPUT); //przelacznik D
pinMode(8, INPUT); //krancowka na otwarciu
pinMode(7, INPUT); //krancowka na zamknieciu
pinMode(3, OUTPUT); //servo pin

}

void loop() 
{
      //ruch przesłony

    if(((digitalRead(10)==HIGH || digitalRead(9)==HIGH)&&(digitalRead(8)==LOW)))
 
      { servo.attach(3);
       
        
      servo.write(80);
      delay(25);}           //servo otwiera przesłone
      
    else
      { digitalWrite(3,LOW);} //servo nie działa
      
    if((digitalRead(10)==LOW && digitalRead(9)==LOW && digitalRead(7)==LOW))
      
      { 
        servo.attach(3);
        
      servo.write(100);
      delay(25);}           //servo zamyka przesłone
      
    else
      { digitalWrite(3,LOW);} //servo nie działa  
      

 

}

Jeżeli filmiki są za mało wyraźne to postaram się je wrzucić w lepszej jakości.

schemat układu.png

praca uklad.rar

Udostępnij ten post


Link to post
Share on other sites

Może zacznij od tego że polecenie servo.attach(3); powinno być raczej jednorazowo na początku programu wydane a nie wielokrotnie w pętli.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Jak dobrze pamiętam to komendę "servo.attach" dałem wielokrotnie w pętli, ponieważ gdy była jednorazowo na początku to miałem problem z serwem przy wyłączeniu i włączeniu ponownym zasilania. Z ciekawości jednak umieściłem ją teraz raz na początku, ale to i tak nic nie dało. Serwo nadal chodzi nierówno. Postaram się więc zaopatrzyć w odpowiednie kondensatory i wpiąć je jak na poniższym schemacie. Teoretycznie kondensatory te mają zniwelować szumy.

serwo szum.PNG

Edytowano przez alshrom

Udostępnij ten post


Link to post
Share on other sites

To może w komendzie digitalWrite(3,LOW); masz problem. Nietypowy sposób na zatrzymanie serwa.

skoro

servo.write(80);  //servo otwiera przesłone 

servo.write(100); //servo zamyka przesłone

to moze

servo.write(90); zatrzyma to serwo zamiast digitalWrite(3,LOW)

Ale to już ty musisz przetestować bo ja takiego serwa nie mam

 

 

Udostępnij ten post


Link to post
Share on other sites

Przy ustawieniu serwo na 90 stopni problem jest taki, że cały czas ono pracuje i co jakiś czas drgnie.

Udostępnij ten post


Link to post
Share on other sites

Daj tam jakiegoś małego mosfeta i odcinaj zasilanie od serwa.

Te serwa 360 świetnie pracują na "cała naprzód" i "cała wstecz", ale mają problemy z zerem

 Teoretycznie masz tam taką śrubkę do ustalania zera... ale w większości przypadków to tylko teoria.

  • 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ść
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...