Skocz do zawartości

Serwo cyfrowe sterowanie


Pomocna odpowiedź

Napisano

Witam,

Mam pytanie, posiadam 3 serwa cyfrowe https://botland.com.pl/serwa-typu-standard/3576-serwo-powerhd-lf-20mg-standard.html

i mam pytanie czy nimi steruje się w inny sposób niż serwem analogowym?

Szukając informacji o serwach cyfrowych, znalazłem wiele artykułów mówiących o różnicach między serwem analogowym a cyfrowym ale wszystkie wskazują na to że steruje się tak samo.

Tymczasem podłączając serwo nic się nie dzieje, napięcie 5V ze stabilizatora LM7805. Układ podłączony zgodnie z schematem z kursu:

prosty kod sterujący dla sprawdzenia czy działa:

#include <Servo.h> // biblioteka serwa
Servo servo; // obiekt serwa
int pozycja;
int pozycjaWyjsciowa = 90;
String odebraneDane;
boolean pauza=false;


void setup() {
servo.attach(9);
servo.write(pozycjaWyjsciowa);
pinMode(10, OUTPUT);
digitalWrite(10, HIGH);
Serial.begin(9600);
}

void loop() 
 {
   if (pauza==false){
     Serial.println("Podaj kat wychylenia od 0-180");
     pauza=true;
   }
      if(Serial.available() > 0){
           odebraneDane = Serial.readStringUntil('\n');
           pozycja = odebraneDane.toInt();
        if (pozycja <=180 && pozycja >= 0) 
           {servo.write(pozycja);//wykonaj ruch
           Serial.println(pozycja);
           delay(100);}
        else
           {Serial.println("Pozycja poza zakresem!");}
            }
 }

Dla próby podłączam tanie micro serwo i wszystko działa poprawnie.

W czym może leżeć problem? Serwa cyfrowe są sterowane sygnałem do 333Hz a analogowe stałym 50Hz czy tu szukać problemu?

Robiłem również próbę podłączając serwo przez stabilizator z 2x18650 i również nic. Podejrzewałem że może bateria 9V nie jest wystarczająca dla takiego serwa.

Dodam że serwo jest raczej sprawne bo mam nowe 3 sztuki takiego serwa i żadne nie działa.

Rayu85, prawdopodobnie wina leży w zasilaniu. W kursie korzystaliśmy z baterii 9V jedynie demonstracyjnie (do tamtego malutkiego serwa wystarcza). Przy projektach, które mają działać dłużej z serwami lepiej byłoby wykorzystać akumulator lub 6 baterii AA. Chociaż nawet przy tym zasilaniu serwo powinno trochę drgać lub "tykać"... Ciężko gdybać na odległość, masz możliwość sprawdzenia układu z innym źródłem zasilania?

Dzięki za odpowiedz:) Mieliście racje, udało mi się wczoraj skończyć mój moduł zasilania na ogniwach 18650, i działają wszystkie 3 serwa:)

Jedno co zauważyłem to, że podłączając np 3 serwa sterowane nawet tym samym PWN nie reagują jednocześnie tylko często któreś rusza wcześniej niż 2 pozostałe.

Czy to też może być spowodowane zasilaniem czy już raczej samym serwem? (Serwa są identyczne)

To nadal może być problem przysiadania napięcia. W czasie startu silnik serwa może pobierać bardzo dużo prądu i nie starcza go - nawet z 7805 - na trzy na raz. Spróbuj z dwoma, bo nie zdziwiłbym się, gdyby jedno wciągało przez chwilę >1A. Do serwomechanizmów cyfrowych - w których ceną za szybkość i dokładność jest właśnie pobór prądu - potrzebujesz naprawdę potężnego zasilacza.

  • 3 miesiące później...

Podpinam się pod temat sterowania serwa Tower Pro MG995 digi hi-speed. Serwo w miare dobrze działa jeśli w pętli ciągle jest sterowane, natomiast jeśli np chcę nim sterować czyli np za pomocą klawiatury to serwo drga gdy czeka na komendę. Zasilanie ciągne z zasilacza komputerowego 5V i mam wspólną masę z raspberry pi zero.

import RPi.GPIO as GPIO
import time 
# use P1 header pin numbering convention
GPIO.setmode(GPIO.BOARD)

GPIO.setup(11,GPIO.OUT)
pwm = GPIO.PWM(11,50)
pwm.start(2)
time.sleep(1)

try:
dane = -1

while (dane != "0"):			
	dane = raw_input("Wprowadz cyfre:");		
	pwm.ChangeDutyCycle(float(dane))	
	time.sleep(.03)


except KeyboardInterrupt:
pwm.stop()
GPIO.cleanup()

pwm.stop()
GPIO.cleanup()
print "Konic"

Serwo nie może być "nieciągle" sterowane. Zawsze musisz do niego wysyłać ciąg impulsów PWM. Nie ma tu czegoś takiego jak "komendy". Jeśli zatrzymujesz generację sygnału dla serwa to ten stan jest przez nie traktowany jak awaryjny - jak utrata łączności radiowej lub urwanie kabelka. I tak masz dużo szczęścia, że nie zwariowało i w tym czasie nie ukręciło sobie np. potencjometru tylko w miarę spokojnie czekało na powrót impulsów. Nie każde jest takie mądre.

Z tego, co wiem, to serwa cyfrowe przy utracie sygnału albo się wyłączają (tak jak analogowe), albo po prostu trzymają poprzednią pozycję. I nie ma tym nic złego -- sam tak robię z serwami, kiedy nie muszą trzymać pozycji, a nie chcę, żeby brały prąd albo hałasowały.

Natomiast patrząc na przedstawiony kod nie widzę nigdzie "wyłączania sygnału" (poza tym przy KeyboardInterrupt, ale to jest przy przerywaniu działania programu).

Podejrzewam, że problemem jest raczej albo jak zwykle nieadekwatne zasilanie, albo nierówny sygnał PWM generowany przez software na Raspberry Pi na którym jest Linux, który jakby nie patrzeć systemem czasu rzeczywistego nie jest.

Przedałoby się zmierzyć napięcie zasilania na tym serwie i/lub popatrzeć na ten sygnał PWM jakimś oscyloskopem albo analizatorem logicznym -- ale pewnie nie ma co na to liczyć.

Oczywiście masz rację, słabe zasilanie to powód większości problemów z serwami, ale "zasilacz komputerowy" to zwykle kawał elektronicznego mięcha.

Swoją drogą nie zauważyłem, by producenci jakoś opisywali zachowanie się swoich serw w przypadku braku sygnału PWM. Dalekowschodnie karty katalogowe są lakoniczne i specyfikują tylko oczywiste parametry. Mówię tu o tanich, nieprogramowalnych serwach, nawet "cyfrowych" takich jak wspomniane TowerPro MG995 czy 996. Z pewnością wbudowują w nie jakieś mechanizmy obronne żeby nie robiły tego co starsze modele, ale standardu tu raczej nie ma. Lepiej nie liczyć na takie cechy przed zakupem jeśli nie ma tego wyraźnie opisanego w dokumentacji. Ty to wiesz, sprawdziłeś na swoich sztukach i OK, można to wykorzystać. Tutaj też się udało o tyle, że żadna maskara się nie wydarzyła, ale lekkomyślne wyłączanie PWM bez specjalnej przyczyny to moim zdaniem jednak błąd w sztuce.

tzn miałem na myśli, że gdy w pętli jest zmianieniany dutyCycle czyli wypełnienie to serwo nie wydaje dziwnych dzwięków i chodzi płynnie (ciągle zmienia pozycję). Gdy stoi w jednej pozycji to słychać niepokojące dzwięki i trochę szaleje.Co do napięcia na serwach to na mierniku pokazuje mi 6.14V w stanie spoczynku,a podczas ruchu serw spada do 5.5V.

Zastanawiam się nad ustawioną częstotliwością czy powinna ona wynosić 50 Hz

Możesz próbować coś na oślep:

- lepszy/inny zasilacz - strasznie spada napięcie, komputerowy to myślałem, że jakiś ATX z 5V/15A a to jakiś cienias,
- lepsze kabelki, dobra masa, dodatkowy kondensator z 1000uF/16V przy zasilaczu itp

ale bez obejrzenia sygnału PWM na oscyloskopie będzie trudno coś poprawić. Być może programowa generacja w Malinie pozostawia wiele do życzenia i serwo powtarza jitter tego co dostaje. Może spróbuj podłączyć serwo do sprzętowego PWM z jakiegoś Arduino lub 555?

EDIT: Tak, powinno być 50Hz. Na pewno oglądałeś już kartę katalogową tego serwa. Stoi tam jak byk 20ms.

Zasilacz ATX 300 niby 30A przy 5V wszelki wypadek spróbuje inny. Spróbuje też z kondensatorem ewentualnie pod Arduino potestuje i pod hardwareowym pwm. Ewentualnie myślałem nad sterownikiem do serw KLIK

z tym że przy niektórych pisze, że obsługują tylko analogowe serwa

Wszystko, co obsługuje analogowe serwa obsłuży też to serwo cyfrowe. Tam, gdzie piszą, że nie obsługuje cyfrowych nie mają na myśli zwykłych serw od zabawek ze zdalnym sterowaniem, tylko specjalistyczne serwa do robotów w rodzaju AX-12 -- tak zwane "smart servo". Tego nie obsłuży, bo to jest sterowane komendami po half-duplexowym serialu, a nie sygnałem PWM.

Na raspberry pi możesz jeszcze spróbować sterownika "servo blaster" w trybie demona użytkownika (https://github.com/richardghirst/PiBits/tree/master/ServoBlaster) -- w przeciwieństwie do biblioteki GPIO on robi PWM prawie całkiem sprzętowo -- z wykorzystaniem DMA -- więc powinien dawać lepsze efekty. Ja tego używałem w jednym z moich pająkowatych robotów.

Dzięki wielkie, będę wykonywał testy i dam znać jaki rezultat.

Edit: Na arduino znacznie lepiej działają te serwa, teraz przejdę do testów z servoBlaster na malinie

[ Dodano: 13-03-2017, 08:56 ]

Jeszcze jedno mam pytanie co do podłączanie serw pod arduino a sterowanie z pi zero. Połączyłem przez port USB płytki i dane przesyłam przez Serial o prędkości 9600. Nadaje liczby jako kąt obrotu silników z klawiatury w pętli i jest następujący problem. Około 3 razy udaje się szybko odebrać dane przez arduino (silniki obracają się bez opóźnień), ale później każde kolejne wysłanie kąta powoduje, że serwo reaguje po około 2s. Jak wyłącze i włącze program to znowu 2 lub 3 razy szybko serwo reaguje, a później z opóźnieniem. Ktoś ma pomysł czym może być spowodowane dane opóźnienie?

Może być, że malina jest za bardzo obciążona lub ma jakieś przerwania?

[ Dodano: 13-03-2017, 18:16 ]

Podczas kolejnych prób w połączeniu raspberry pi -> Arduino udało mi się dziwnym trafem uzyskać płynną transmisję (bez opóźnień) kabel od GND odłączyłe podłączyłem i coś jeszcze. Niestety po odłączeniu arduino i podłączeniu jeszcze raz znowu zaczęło działać powoli połączenie i nie potrafiłem powrócić do dobrego stanu. Wydaje mi się że może problem być z napięciami lub zbyt niskim prądem, dlatego też załączam schemat może ktoś pomoże.

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