Arduino Polska Forum

Pełna wersja: Sterowanie serwem AR - 3603 HB
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam,

Mam problem z precyzyjnym sterowaniem serwem AR - 3603 HB. Problem polega,że w tym serwie jest możliwa tylko praca ciągła, a wiec po podaniu krotkiego impulsu serwo obraca się w dajmy na to w lewo a przekroczeniu danej długości impulsu w prawo. Gdy ustawimy długość graniczną serwo się zatrzymuje. Problem polega na tym iż chce wysterować odpowiednio w czasie taką samą drogę w jedną jak i w drugą strone, ale nigdy mi sie to nie udaje.

mój program działa w następujacy sposób po przekroczeniu danej wartosci na przetworniku analogowym serwo obraca się w jedną strone przez dany okres czasu a po ponownym przekroczeniu wartosci progowej w tym samym czasie w drugą strone. Jednak widać iż drogi te są różne a nie równe. Z górzy dziękuje za pomoc.

Kod:
#include <Servo.h>

Servo moje_serwo;  // stworz obiekt moje_serwo do kontroli serwa

int potencjometr = A2;  // pin analogowy do odczytu potencjometra
int wartorsc;    // zmienna przechowujaca odczyt z potencjometru
int i = 0;
int g = 0;
int k = 0;

void setup() {
  moje_serwo.attach(9); // serwo podlaczone jest do pinu 11
  Serial.begin(9600);
}

void loop() {
 
wartorsc = analogRead(potencjometr);
Serial.print(wartorsc);       

if ( wartorsc > 510 && k==0) {
  k=1;
  }

if ( wartorsc < 500 && k==1) {
  k=2;
  }
 
if ( wartorsc > 510 && k==2) {
  k=3;
  }

if ( wartorsc < 500 && k==3) {
  k=0;
  }

if(( k == 1) && (i == 0) && (g == 0)){
g=1;
moje_serwo.write(180);
delay(500); 
moje_serwo.write(90);
delay(500);
i = 1;
g=0;
}

if((k == 3) && (i == 1) && (g == 0)){
g=1;
moje_serwo.write(0);
delay(500); 
moje_serwo.write(90);
delay(500);   
i = 0;
g=0;
}
Przestań używać delay, to jest tylko do programów DEMO, naucz się obsługi micros i millis. Serwo co do zasady pracuje w wychyleniu o określony kąt, jak zdjąłeś ograniczniki by przerobić je na silniczek to tak to działa, możesz na piechotę próbować zmieniać czasy a i tak nic Ci to nie gwarantuje. Chcesz dokładnie pozycjonować się w ruchu po okręgu to użyj silnika krokowego, zabawkowe do Arduino są już od dziesięciu złotych, lepsze + driver to kilkadziesiąt złotych, oczywiście są i droższe, nie wiem jaka jest górna granica ani Twoje potrzeby.
(10-10-2019, 01:24)kaczakat napisał(a): [ -> ]Przestań używać delay, to jest tylko do programów DEMO, naucz się obsługi micros i millis. Serwo co do zasady pracuje w wychyleniu o określony kąt, jak zdjąłeś ograniczniki by przerobić je na silniczek to tak to działa, możesz na piechotę próbować zmieniać czasy a i tak nic Ci to nie gwarantuje. Chcesz dokładnie pozycjonować się w ruchu po okręgu to użyj silnika krokowego, zabawkowe do Arduino są już od dziesięciu złotych, lepsze + driver to kilkadziesiąt złotych, oczywiście są i droższe, nie wiem jaka jest górna granica ani Twoje potrzeby.

Z używaniem delay się zgodze, ale tego serwo nie przerabiałem. Ono fabrycznie jest tak skonsturowane ze pracuje w trybie ciągłym. Długośc impulsu nie decyduje o kącie wychylenia, a o kierunku obrotów
(11-10-2019, 10:16)pejdzejro napisał(a): [ -> ]Ono fabrycznie jest tak skonsturowane ze pracuje w trybie ciągłym. Długośc impulsu nie decyduje o kącie wychylenia, a o kierunku obrotów
Przyznam, że nie wiedziałem, iż takie serwa istnieją, bo i po co? Tak działają siłowniki (przynajmniej bardzo podobnie). Umieść dokumentację tego serwa lub daj linki do niego ale pełną dokumentację (producenta) a nie ulotkę umieszczaną przez sprzedawców, którzy w 90% nie wiedzą co sprzedają (rekordy bije Botland, stanowczo odradzam).
Jak umieścisz dokumentację to postaram się znaleźć rozwiązanie.

PS
Na beznadziejnie wolne odświeżanie graficznych wyświetlaczy kolorowych rozwiązanie znalazłem https://forbot.pl/forum/topic/16876-akce...ent-136600
Na problem zawieszania przerwań w czasie transmisji do WS282x też https://forum.atnel.pl/post222192.html#p222192
a nawet dwa, drugie (bez dodatkowego sprzętu) będzie opisane w "Elektronice dla wszystkich"
to i na problem serwa tez znajdę lekarstwo.

PS2
Pytanie, czy pacjent przeżyje :-) ?
Cytat:The AR-3606HB continuous rotation servo converts standard RC servo position pulses into continuous rotation speed. The default rest point is 1.5 ms, but this can be adjusted by using a small screwdriver to turn the middle-point positioner. Pulse widths above the rest point result in counterclockwise rotation, with speed increasing as the pulse width increases; pulse widths below the rest point result in clockwise rotation, with speed increasing as the pulse width decreases.
Kod:
ps://www.pololu.com/file/0J693/AR-3606HB.pdf
(15-10-2019, 08:52)pejdzejro napisał(a): [ -> ]
Cytat:The AR-3606HB continuous rotation servo converts standard RC servo position pulses into continuous rotation speed. The default rest point is 1.5 ms, but this can be adjusted by using a small screwdriver to turn the middle-point positioner. Pulse widths above the rest point result in counterclockwise rotation, with speed increasing as the pulse width increases; pulse widths below the rest point result in clockwise rotation, with speed increasing as the pulse width decreases.
Kod:
ps://www.pololu.com/file/0J693/AR-3606HB.pdf
Nie potrafię odczytać "krzaków".
(15-10-2019, 09:33)semi napisał(a): [ -> ]
(15-10-2019, 08:52)pejdzejro napisał(a): [ -> ]
Cytat:The AR-3606HB continuous rotation servo converts standard RC servo position pulses into continuous rotation speed. The default rest point is 1.5 ms, but this can be adjusted by using a small screwdriver to turn the middle-point positioner. Pulse widths above the rest point result in counterclockwise rotation, with speed increasing as the pulse width increases; pulse widths below the rest point result in clockwise rotation, with speed increasing as the pulse width decreases.
Kod:
ps://www.pololu.com/file/0J693/AR-3606HB.pdf
Nie potrafię odczytać "krzaków".
Ale tam jest po ang też?
Skromna ta nota. Jakaś informacja o kierunku dla impulsów 1500..2200us, pozycja neutralna 1500us i zakres impulsów 800..2200us. Co dla impulsów 800..1500us ?

Musiałby mieć takie serwo aby sprawdzić jak się zachowuje.