Skocz do zawartości
Komentator

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki

Pomocna odpowiedź

Dnia 25.01.2020 o 20:52, Miki_elektronik napisał:

Jakie są wartości tych kondensatorów filtrujących w układzie z serwomechanizmem

@Miki_elektronik te wartości nie muszą być bardzo precyzyjnie dobrane, kondensatory ceramiczne 100 nF i elektrolityczne 100 uF spokojnie wystarczą.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
// ZADANIE 5.3 FORBOT JEST NAJLEPSZY!



#include <Arduino.h>

#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 czas = 200;



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;

    czas = czas + 50; ////////////////////////////// ZADANIE 5.3 - zwiekszanie czasu kolejnego przeskoku o 50 milisekund //////////////////////////////////////





  pozycja = pozycja + zmiana; //Zwiększenie aktualnej pozycji serwa

  delay(czas);

}

 

Edytowano przez Gieneq
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@Mattti87 super, o to chodziło! 🙂 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dzień dobry

Mam pytanie odnośnie pracy z serwomechanizmami. Czy jeśli mam serwa Hitec hs311 które co 10 sekund zmieniają pozycję (mają podłączone ramię Pan/tilt z niewielkim obciążeniem) to czy trzymanie pozycji przez te 10 sekund jest dla nich bardzo szkodliwe? W momencie gdy przerywam sygnał (co intuicyjnie wydawałoby się bardziej higienicznym postępowaniem to serwa zaczynają się w skrajnych pozycjach ślizgać i nie trzymają pozycji. 

Będę bardzo wdzięczna za odpowiedź.  

Udostępnij ten post


Link to post
Share on other sites

@karolina witam na forum 🙂 Serwomechanizmy nie podtrzymują same z siebie zadanej pozycji, jeśli odłączy się sygnał sterujący. Nie ma tam też mechanicznego hamowania (pomijając opór przekładni). "Niewielkie obciążenie" raczej im nie zaszkodzi 😉

Udostępnij ten post


Link to post
Share on other sites

Witam, jestem zupełnie zielony w Arduino i elektronice i robię kurs Arduino, który dostałem w prezencie od żony. Jestem aktualnie na podłączeniu servomechanizmu i musze przyznać, że pierwszy schemat nie bardzo do mnie przemawia. Nie widzę w zestawie takich kondensatorów (nie widzę także opisu jakie to są kondensatory, tylko że filtrujące) a obrazek nie jest zbyt wyraźny dlatego nie wiem jak podłączyć ten stabilizator 7805 i kondensatory. Nigdzie nie jest także napisane czy Arduino ma być cały czas podłączone przez USB czy tylko na początku przy wgraniu programu?

 

1650116345_Zrzutekranuz2020-02-1718-35-26.png.cea408f3aee337351dca6a7ce93c10e5.png

Udostępnij ten post


Link to post
Share on other sites

@przemko Na stronie 19 i 20 tego forum jest dokładnie opisane jak możesz je podłączyć. Są to dwa kondensatory ceramiczne, ale możesz także podłączyć 1 ceramiczny i 1 elektrolityczny. W takim przypadku nie możesz pomieszać plusa z minusem 😉

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

A co do zasilania. Aby program działał, arduino nie musi być podłączone przez USB, wystarczy, że jest podłączone do baterii 9V. Za to na samym USB, nie pociągnie.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Mam pytanie. W zadaniu 5.5 użyłem rownania

odczyt=analogRead(A1);

pozycja=(odczyt*180)/1024;

Serwo zaczęło wariowac. Jak podłączyłem się do UART pokazywał mi wartości dla zmiennej pozycja od - 30 do 120. Odczyt zaś wskazywal normalnie od 0 do 1023. 

odczyt to zmienna typu int. Pozycję próbowałem i na int i na float. 

Dlaczego wartość pozycja mogła przyjąć wartości ujemne? 

Wcześniej jak rownanie napisałem w następujący sposób:

pozycja=odczyt*(180/1024);

to pozycje wyświetlał mi jako wartość 0

Edytowano przez Kerotes

Udostępnij ten post


Link to post
Share on other sites

@Kerotes wygląda na to że zmienna jest rzutowana na int.

pozycja=odczyt*(180/1024);

W tym to co jest w nawiasie wynosi 0 jako wyniki dzielenia całkowitoliczbowego, więc taka metoda odpada.

int pozycja=(int)(odczyt*180.0/1024.0);

Spróbuj tego albo użyj funkcji map, która przeskaluje wartości.

Udostępnij ten post


Link to post
Share on other sites

Może ktoś będzie miał ochotę skomentować:

#include <Servo.h>

Servo serwo;
int vvlpot = 0;
int vvlpot2 = 0;
int zakres = 0;

void setup()
{ serwo.attach(9);
  Serial.begin (9600);
 }

void loop()
{ vvlpot = analogRead(A0);                            //przypisanie wartości zmiennym do porównania 
  vvlpot2 = analogRead(A0);                           //i zatrzymania programu
  
 while (vvlpot > vvlpot2 - 5 && vvlpot < vvlpot2 + 5) //zatrzymanie programu
 {  vvlpot = analogRead(A0);                          //monitorowanie stanu potencjometru
  }
  zakres = map(vvlpot, 0, 1024, 0, 180);              //zakres napięcia na kąt serwa
  serwo.write(zakres);
  delay(10);                                          //Opóźnienie ma wyeliminować "drgania" serwa
  Serial.println (vvlpot);                            //"monitor", czy program faktycznie 
  Serial.println (vvlpot2);                           //się zatrzymujev

I pytanie: w niektórych ustawieniach potencjometru serwo drga (domyślam się ze próbuje się ustawić precyzyjnie do nastaw potencjometru). Czy da się ten efekt wyeliminować czy serwa tak mają i to nie jest problem?

Udostępnij ten post


Link to post
Share on other sites

Tak się zastanawiałem co robi ten program, ale rozumiem że jest to coś w rodzaju strefy nieczułości? Starasz się odrzucić niewielki (1%) szum na potencjometrze i gdy różnica jest wystarczająco duża to coś ustawić. Jeżeli metoda write przyjmuje inty to ta 1% strefa jest już wliczona przy mapowaniu bo około 5 jednostek z ADC zamieniane jest na 1 jednostkę nastawy serwa. Więc może zwiększ tą strefę do np. 30.

Niemniej, serwa tak mają że czasem sobie drgają 🙂 Wbudowany sterownik próbuje osiągnąć zadaną pozycję i wpada w oscylacje wokół stanu ustalonego.

Udostępnij ten post


Link to post
Share on other sites
33 minuty temu, Gieneq napisał:

zwiększ tą strefę do np. 30

co nie oznacza, że wyeliminuje się drgania tylko że prawdopodobieństwo ich wystąpienia będzie sześciokrotnie mniejsze niż w przypadku 5.

Zamiast vvplot i vvplot2 wypisuj stan zmiennej "zakres" (przed i po mapowaniu) - będziesz wiedział czy to wina szumów potencjometru, czy konstrukcji serwa.

Przy okazji: delay(10) nic nie wyeliminuje jako że serwo i tak nie przyjmie informacji częściej niż co 20 milisekund - taka już jego serwiasta uroda.

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dlaczego stabilizator zasilany jest z PINu Vin a nie z 5V? Jaka jest różnica pomiędzy tymi PINami?

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