Skocz do zawartości

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


alshrom

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

Link do komentarza
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
Link do komentarza
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

 

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

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
Link do komentarza
Share on other sites

Po długiej przerwie udało mi się w końcu spróbować włożyć do układu mosfeta. W skrócie chodzi o to, że tranzystor ma się otwierać w momencie kiedy serwo ma pracować, a zamykać, gdy chcę by serwo się nie ruszało. Byłem w sklepie i na szybko został mi dobrany mosfet o oznaczeniu IRF540N. Jeżeli dobrze rozumiem to powinien się otworzyć przy napięciu 2-4V. Ogólnie to układ działa poprawnie. Gdy czujnik wysyła sygnał arduino podaje 4.9V na bramkę i tranzystor się otwiera. Problem jest jednak taki, że między drenem a źródłem zmierzyłem opór i wynosi on ~70 Ohm, co sprawia, że przez serwo płynie mały prąd i nie ma siły się kręcić. Rozumiem, że problem leży w źle dobranym mosfecie? Czy jest ktoś mi w stanie polecić jakiś tranzystor, który idealnie nada się w projekcie z arduino? Wklejam schemat układu i dane do tranzystora. https://pdf1.alldatasheet.com/datasheet-pdf/view/68172/IRF/IRF540N.html

serwo dane.PNG

schemat mosfet.jpg

Link do komentarza
Share on other sites

(edytowany)

@slawko_k, @ethanak

Kupiłem tranzystor IRL2203. Daje mi on na otwarciu jakieś ~0.5 Ohm gdy nie wpinam w niego serwo i z 6 ohm gdy mam wpięte serwo. Chyba ok?

Problem jest taki, że serwo i tak zaczyna drgać. Co prawda jest lepiej niż na poprzednim (IRF540N), ale to nadal do niczego się nie nadaję. Czy może lepiej jest mi zastosować tranzystor który jest normalnie zwarty i sterować sobie moment, w którym nie chcę by serwo pracowało? Ogólnie skończyły mi się pomysły na to w czym jest problem.

Edytowano przez alshrom
Link do komentarza
Share on other sites

Nie jest ok. Coś robisz źle. Albo układ zły albo coś źle mierzysz.

IRL2203 wg opisu ma 0,007 ohma.

Taki układ bardzo często się stosuje i bezproblemowo działa.

 

Edytowano przez slawko_k
  • Lubię! 1
Link do komentarza
Share on other sites

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.