-
PWM für Servo
Hallo,
ich wollte pizypwm.py, die erfolgreich die Motorgeschwindigkeit regelt für meinen Servo verwenden und das Zucken ausschalten:
Code:
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.
-
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.)
-
Doch, ich versorge den Servo vom RPi. Funktioniert ohne PWM ganz gut. Möglicherweise habe ich Stromschwankungen, die das auslösen.
-
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.
-
Hey Pinsel,
ich versuche gerade selber einen Servo mittels PizyPWM anzusteuern (Modelcraft ES-05).
Der Code sieht so aus:
Code:
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 :)
-
Hallo Kampi,
versuchs mal damit:
Code:
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:
Code:
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 ;-)
-
mmh klappt immer noch nicht :(
-
Hast du meine Ergänzung im vorherigen Post gesehen? Damit schlägt mein Servo nach links und rechts voll aus.
-
Hey,
ja ich habe den Code direkt raus kopiert.
-
hmm, und auch pin 26? bei mir funktioniert das programm... läuft mein servotestprogramm ohne pwm bei dir?