Skocz do zawartości

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

  • 2 tygodnie później...
(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
  • 2 tygodnie później...

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

@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 😉

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

@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

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

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

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?

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.

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
  • 2 tygodnie później...

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