• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Użycie serwa w celu wykonania jednego ruchu ramieniem
#1
Zaczynam dopiero korzystać z Arduino i nie mogę znaleźć rozwiązania prostego problemu. Chcę aby po włączeniu Arduino ramię serwa wykonało ruch do końca w jedną stronę po czym wróciło do pozycji początkowej i na tym zakończyło program, tak jakby wykonało np. otwarcie i zamknięcie jakiejś klapki.

Próbowałem przerobić kod, który powoduje, że ramię idzie do końca, po czym szybciej wraca do pozycji początkowej i ponownie wykonuje to samo.
Kod:
#include <Servo.h> //Biblioteka odpowiedzialna za serwa
 
Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
int pozycja = 0; //Aktualna pozycja serwa 0-180
int zmiana = 6; //Co ile ma się zmieniać pozycja serwa?
 
void setup() 

  serwomechanizm.attach(9);  //Serwomechanizm podłączony do pinu 9

 
void loop() 
{  
  if (pozycja < 180) { //Jeśli pozycja mieści się w zakresie
    serwomechanizm.write(pozycja); //Wykonaj ruch
  } else { //Jeśli nie, to powrót na początek
    pozycja = 0;
  }    
  
  pozycja = pozycja + zmiana; //Zwiększenie aktualnej pozycji serwa
  delay(200); //Opóźnienie dla lepszego efektu                        
}
Po małej modyfikacji jedyne co udało mi się zrobić, że wykonuje ruch do końca ale już nie wraca do pozycji startowej.
Kod:
#include <Servo.h> //Biblioteka odpowiedzialna za serwa

Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa
int pozycja = 0; //Aktualna pozycja serwa 0-180
int zmiana = 6; //Co ile ma się zmieniać pozycja serwa?
int blokada = 0;

void setup()
{
 serwomechanizm.attach(9);  //Serwomechanizm podłączony do pinu 9
}

void loop()
{  
 if (pozycja < 180) { //Jeśli pozycja mieści się w zakresie
   serwomechanizm.write(pozycja); //Wykonaj ruch
 } else { //Jeśli nie, to powrót na początek
   blokada = 0;
 }    
 
 pozycja = pozycja + zmiana; //Zwiększenie aktualnej pozycji serwa
 delay(200); //Opóźnienie dla lepszego efektu                        
blokada = 1;
}
Nie wiem jak zrobić, żeby wykonało cały pierwszy kod i po powrocie do pozycji startowej program się zakończył. Dodam, że chodzi o wykonanie programu po włączeniu zasilania Arduino z zewnętrznego programatora (póki co czekam na moduł zegara dlatego to będzie najprostsze rozwiązanie) o określonej godzinie bez użycia żadnych przycisków, po prostu załącza się prąd, ramie wykonuje ruch w jedną stronę, najlepiej aby ze 2-3 sekundy po otwarciu odczekało po czym wykonuje ruch powrotny i kończy program, po około minucie programator czasowy odcina prąd i zadanie wykonane.

Może ktoś będzie w stanie jakoś rozwiązać ten problem?
 
Odpowiedź
#2
Witam,
Nie będzie to dobre rozwiązanie, gdyż w momencie podania zasilania serwo będzie wykonywać niepożądane ruchy do momentu "zaladowania" się programu. Dla Uno to 1 - 2 sekundy.
Pozdrawiam,
Tomek
 
Odpowiedź
#3
W sumie faktycznie serwo coś robi na początku, ale ramienia nie miałem założonego i na to uwagi nie zwracałem. W takim razie czy da się w ogóle zrealizować projekt za pomocą serwa ale w jakiś inny sposób? Ewentualnie jak inaczej w możliwie najprostszy sposób się za to zabrać?
Jeszcze jedno pytanie z tematu bardzo mnie zastanawia, otóż jak zrobić to co opisałem na początku. Już nawet nie koniecznie w kontekście użycia serwa do otwierania czegokolwiek ale po prostu aby serwo wykonało ruch w jedną stronę i wróciło do punktu wyjścia po czym zakończyło działanie, bo w dalszym ciągu nie udało mi się go programowo zatrzymać w tym momencie. Również opcja Delay opóźnia skok ramienia, które porusza się z punktu początkowego do końcowego (jak wraca to już ciągiem, bez opóźnień), a chciałbym aby ramię idąc od lewej do prawej zatrzymało się powiedzmy na sekundę i dopiero wtedy zaczęło wracać do punktu początkowego.

Edit. W sumie sprawdziłem i faktycznie serwo wykonuje na początku ruch do przodu ale jest to około 1-2mm i w moim projekcie nie byłoby to aż tak dużym problemem tylko, że mimo wszystko pozostaje reszta problemów do rozwiązania.
 
Odpowiedź
#4
Witam,
Jeśli nie masz dużych obciążeń serwa to może pomysl o tym żeby ustawiać konkretne położenie, odciąć zasilanie serwa na żądany czas, przewrócić zasilanie i spowodować ruch do drugiego położenia. I znowu odejmij zasilanie serwa.
Pozdrawiam,
Tomek
 
Odpowiedź
#5
Nie, obciążenia dużego nie będzie, myślę, że nie będzie większe niż waga serwa, a siebie bez problemu unosi na ramieniu. Odcięcie zasilania byłoby najprostsze, ale minimalny czas zewnętrznego programatora to 1 minuta, a przez ten czas ramię wielokrotnie wykona powtarzalny ruch, a tego chciałbym uniknąć dlatego też wolałbym programowo je zatrzymać.
 
Odpowiedź
#6
Witam,
Przecież możesz programowo załączać i wyłączać zasilanie serwa. Zwykły klucz na tranzystorze.
Możesz też spróbować wyłączać serwo funkcją detach().
Pozdrawiam,
Tomek.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości