PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] PWM für Servo



pinsel120866
05.02.2013, 16:02
Hallo,

ich wollte pizypwm.py, die erfolgreich die Motorgeschwindigkeit regelt für meinen Servo verwenden und das Zucken ausschalten:

import RPi.GPIO as GPIO

import time
import signal

from pizypwm import *

def endProcess(signalnum = None, handler = None):
servo.stop()

GPIO.cleanup()
exit(0)

signal.signal(signal.SIGTERM, endProcess)
signal.signal(signal.SIGINT, endProcess)

servo = PiZyPwm(50, 26, GPIO.BOARD)

GPIO.setwarnings(False)

GPIO.setmode(GPIO.BOARD)

GPIO.setup(26,GPIO.OUT)

while True:

servo.start(5)
print "Drehung nach links"
time.sleep(1)

servo.start(7.5)
print "Drehung Mitte"
time.sleep(1)

servo.start(10)
print "Drehung nach rechts"
time.sleep(1)

Das Problem ist, das der Servo unkontolliert herumschwenkt, obwohl ich 50 Hz (20ms) eingestellt habe und die 1ms 1,5ms und 2ms Impulse sende. Könnte bitte jemand meinen Code überprüfen?

Wäre nett, danke.

tucow
05.02.2013, 21:17
Ich benutze für die Servos meines Humanoiden, am RPi, den PCA9685 mit 60Hz.

Das sie unkontolliert herumschwenkt hatte ich mal bei den Controllern die ich vor dem Pi entworfen habe, da habe ich vergessen GND vom ATmega mit dem GND von den Servos zu verbinden, kann das bei Dir der Fall sein? (Ich denke mal nicht das Du die Servos vom RPi aus versorgst.)

pinsel120866
06.02.2013, 07:28
Doch, ich versorge den Servo vom RPi. Funktioniert ohne PWM ganz gut. Möglicherweise habe ich Stromschwankungen, die das auslösen.

pinsel120866
09.02.2013, 16:25
Nun habe ich den halben Nachmittag versucht, den Servo anzusteuern (die andere Hälfte des Nachmittags habe ich Schnee geschaufelt...)

Ich kriege es nicht hin, auch nicht mit externer Stromquelle für den Servo. Ich gehe mal davon aus, dass pizypwm für Servos nicht geeignet ist.

Kampi
09.02.2013, 16:31
Hey Pinsel,

ich versuche gerade selber einen Servo mittels PizyPWM anzusteuern (Modelcraft ES-05).
Der Code sieht so aus:



import RPi.GPIO as GPIO
import time
import os
from pizypwm import *


GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(9, GPIO.OUT)


while True:

Servo = PiZyPwm(50, 9, GPIO.BCM)

user_input = raw_input("Bitte treffen Sie Ihre Wahl: ")

if(user_input == "l"):
Servo.start(5)
print "Drehung nach Links"
time.sleep(1)
Servo.stop()
GPIO.cleanup()
elif(user_input == "m"):
Servo.start(8)
print "Drehung in die Mitte"
time.sleep(1)
Servo.stop()
GPIO.cleanup()
elif(user_input == "r"):
Servo.start(11)
print "Drehung nach Rechts"
time.sleep(1)
Servo.stop()
GPIO.cleanup()
elif(user_input == "q"):
Print "Programm wird beendet......"
os._exit(1)
Servo.stop()
GPIO.cleanup()
else:
print "Ungueltige Eingabe!"


Und bei mir zuckt der Servo nicht mal. Das Oszi zeigt einen Puls an (variabel von 1ms - 2ms). Den Servo habe ich direkt an die 5V vom Pi angeschlossen und den Signalanschluss direkt an das Pi, aber nichts tut sich....weißt du eine Lösung?

Btw....die Lösung mit dem "Menü" ist klasse :)
Danke @ tucow :)

pinsel120866
09.02.2013, 18:42
Hallo Kampi,

versuchs mal damit:

import RPi.GPIO as GPIO
import time
import signal
import os
from pizypwm import *

def endProcess(signalnum = None, handler = None):
servo.stop()

GPIO.cleanup()
exit(0)

signal.signal(signal.SIGTERM, endProcess)
signal.signal(signal.SIGINT, endProcess)

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(26, GPIO.OUT)


while True:

Servo = PiZyPwm(50, 26, GPIO.BOARD)

user_input = raw_input("Bitte treffen Sie Ihre Wahl: ")

if(user_input == "l"):
Servo.start(5)
print "Drehung nach Links"
time.sleep(1)
Servo.stop()
GPIO.cleanup()
elif(user_input == "m"):
Servo.start(8)
print "Drehung in die Mitte"
time.sleep(1)
Servo.stop()
GPIO.cleanup()
elif(user_input == "r"):
Servo.start(11)
print "Drehung nach Rechts"
time.sleep(1)
Servo.stop()
GPIO.cleanup()
elif(user_input == "q"):
print "Programm wird beendet......"
os._exit(1)
Servo.stop()
GPIO.cleanup()
else:
print "Ungueltige Eingabe!"


Du musst allerdings PIN 26 (BOARD) verwenden.

- - - Aktualisiert - - -

Halt, Stop - ich habs:


import RPi.GPIO as GPIO
import time
import signal
import os
from pizypwm import *

def endProcess(signalnum = None, handler = None):
servo.stop()
GPIO.cleanup()
exit(0)

signal.signal(signal.SIGTERM, endProcess)
signal.signal(signal.SIGINT, endProcess)

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(26, GPIO.OUT)


while True:

Servo = PiZyPwm(500, 26, GPIO.BOARD)

user_input = raw_input("Bitte treffen Sie Ihre Wahl: ")

if(user_input == "l"):
Servo.start(95)
print "Drehung nach Links"
time.sleep(1)
Servo.stop()
GPIO.cleanup()
elif(user_input == "m"):
Servo.start(50)
print "Drehung in die Mitte"
time.sleep(1)
Servo.stop()
GPIO.cleanup()
elif(user_input == "r"):
Servo.start(5)
print "Drehung nach Rechts"
time.sleep(1)
Servo.stop()
GPIO.cleanup()
elif(user_input == "q"):
print "Programm wird beendet......"
os._exit(1)
Servo.stop()
GPIO.cleanup()
else:
print "Ungueltige Eingabe!"


Ich weiss zwar nicht genau warum, aber so gehts ;-)

Kampi
09.02.2013, 18:54
mmh klappt immer noch nicht :(

pinsel120866
09.02.2013, 18:59
Hast du meine Ergänzung im vorherigen Post gesehen? Damit schlägt mein Servo nach links und rechts voll aus.

Kampi
09.02.2013, 19:06
Hey,

ja ich habe den Code direkt raus kopiert.

pinsel120866
09.02.2013, 19:35
hmm, und auch pin 26? bei mir funktioniert das programm... läuft mein servotestprogramm ohne pwm bei dir?

Kampi
09.02.2013, 20:10
Hey,

ja ist Pin 26.
Ich sehe das Signal ja mit dem Oszi. Nur der Servo zuckt nicht :/

Edit:
Es funktioniert......
Ich Esel hatte die Steckbrücke für die 5V auf dem Steckbrett eine Reihe zu weit gesteckt -> keine Spannung am Servo ^.^
Jetzt zuckt er zumindest schon mal.

Noch ein Edit:
Bewegt sich ein Servo PRO Puls in eine bestimmte Richtung?

pinsel120866
10.02.2013, 09:28
Bewegt sich ein Servo PRO Puls in eine bestimmte Richtung?

Was meinst du damit?

Zameer
10.02.2013, 14:02
Ja, die Servos bewegen sich nur pro Puls.

Kampi
10.02.2013, 15:54
Hey,

also ich habe nun das "Problem", dass der Servo nur zuckt wenn ich eine Richtung eingebe. Drehe ich den Servo vorher aber, so dreht er sich ordnungsgemäß. Danach zuckt er dann wieder nur, bis ich ihn wieder drehe.
Woran liegt das?

pinsel120866
10.02.2013, 20:16
möglicherweise passt die frequenz nicht.

Kampi
10.02.2013, 20:43
Die Frequenz ist 50Hz. Damit kommt eine Periodenzeit von 20ms raus, wie es die Servos haben wollen.

pinsel120866
11.02.2013, 06:49
Komischerweise muss ich bei meinem Servo eine Frequenz von 500 Hz eingeben, damit es funktioniert.

Kampi
11.02.2013, 09:36
Hey,

ich weiß nicht genau was die Servos für eine Frequenz wollen (bin von 20µS Periodenzeit ausgegangen), da ich dazu nur hier nachgeschaut habe:

http://www.rn-wissen.de/index.php/Servos

Die Servos habe ich noch bei mir in der Schublade gefunden ;), aber ich gucke mal ob ich was über die Frequenz raus finde.

Kampi
11.02.2013, 15:54
Problem ist gelöst.
Ursache war eine nicht funktionierende Masseverbindung zwischen Servo und Raspberry Pi. Die beiden waren quasi galvanisch voneinander getrennt und das mochte der Servo nicht.

pinsel120866
12.02.2013, 06:38
Prima, dass es jetzt funktioniert. Welche Frequenz verwendest du jetzt? Und ist das zucken weg?

oberallgeier
12.02.2013, 07:29
Problem ist gelöst ... nicht funktionierende Masseverbindung ...Ohhh - ich wollte Dich schon danach fragen, dachte aber . . . na ja, weils ja doch eigentlich DER Anfängerfehler ist.


... nicht genau was die Servos für eine Frequenz wollen (bin von 20µS Periodenzeit ausgegangen) ...Mal gaaanz pingelig: 25 µs sind knapp 0,1% des Standards. Zumindest wenn man meinen Ausführungen (http://www.rn-wissen.de/index.php/Servo#Ansteuerung:_Signalform_und_Schaltung) im RNWiki glauben kann. Es gibt zwar Toleranzen, aber ob man soo weit runter gehen kann ? Oder ist das ein Schreibfehler von Dir?

Kampi
12.02.2013, 08:07
Ohhh - ich wollte Dich schon danach fragen, dachte aber . . . na ja, weils ja doch eigentlich DER Anfängerfehler ist.

Mal gaaanz pingelig: 25 µs sind knapp 0,1% des Standards. Zumindest wenn man meinen Ausführungen (http://www.rn-wissen.de/index.php/Servo#Ansteuerung:_Signalform_und_Schaltung) im RNWiki glauben kann. Es gibt zwar Toleranzen, aber ob man soo weit runter gehen kann ? Oder ist das ein Schreibfehler von Dir?

Bei der Masseverbindung war das wieder mein Steckbrettaufbau. Das Ding ist schon bisl älter weswegen da ab und an eine Verbindung nicht ganz stimmt :/
Das mit den 20µs ist ein Schreibfehler meinerseits. Ich meinte 20ms (also 50Hz).
Ich bin (was das Timing angeht) ja auch nach deiner Anleitung ausm Wiki vorgegangen :), weswegen ich mich bei den Timings auf den Artikel verlassen habe (was auch gepasst hat).
Jetzt mit der funktionierenden Masseverbindung laufen die Dinger 1a. Sie zucken nicht mal wenn sie an der Endposi sind.....außer ich sage das ich 1 Sekunde lang in eine Richtung drehe und die schon nach der Hälfte der Zeit auf Anschlag sind.
Ich habe mein Programm auch bisl umgearbeitet, sodass ich auch eine Schrittweite angeben kann.
Werde den ganzen Rummel aber noch auf meine Homepage schreiben (ich leihe mir dafür dein Bildchen bzgl. der Timings ausm Wiki aus ;) ..... natürlich mit Quellenangabe usw. )

oberallgeier
12.02.2013, 08:19
... mit ... Masseverbindung laufen die Dinger 1a. Sie zucken nicht mal wenn sie an der Endposi sind ...Na gut - aber am mechanischen Endanschlag dürften sie ja auch nicht zucken - weil das Motordrehmoment die Nase (Anschlag der Abtriebswelle) gegen den internen Anschlag im Gehäuse klemmt. Sieht man am Stromverbrauch.

Ich bin ja derzeit ziemlich von den Socken über die lausige Präzision der Servos (meinen Billigdingern). Da werden traumhafte Nennmomente angegeben (mit fast beliebig phantasievollen Dimensionsangaben - nur longton-pro-werst hab ich noch nicht gefunden) aber das wirklich Wichtige ist nicht da. Beispiel: wie viel Abweichung pro Lastmoment, sprich: die Weichheit des Reglers (hab ich auch bei Teuerdingern noch nicht gesehen). Da sind schon mal zehn, fünfzehn Grad locker drin. usw - ich will hier nicht OT in endlose Klagen ausbrechen.

Viel Erfolg für Dich weiterhin

PS: ich hab durch Deine Ausführungen schon längst Appetit bekommen, meine Himbeerschnitte zum Steuern zu nehmen. Häng leider in meinem neuen Projekt deutlich hinterm Zeitplan.

Kampi
12.02.2013, 09:57
Na gut - aber am mechanischen Endanschlag dürften sie ja auch nicht zucken - weil das Motordrehmoment die Nase (Anschlag der Abtriebswelle) gegen den internen Anschlag im Gehäuse klemmt. Sieht man am Stromverbrauch.
.

Ja der Stromverbrauch steigt an und der Servo will halt weiter in die Richtung drehen, was aber nicht klappt. Deswegen zittert er etwas.
Wenn ich hingegen sage, dass er nur eine bestimmte Anzahl an Schritten in eine Richtung drehen soll dreht er sich flüssig und ohne zittern.
Was das Drehmoment angeht sind die Servos glaube ich nicht soooooooooo toll (sind 4€ Servos :D ) aber in erster Linie möchte ich diese ja nur für meinen Ultraschall einsetzen und vielleicht für die Kamera. Dafür reichen die allemal.