Guten Abend
bei meinem Aktuellen Projekt stehe ich vor einer Hürde, welches mir das voranschreiten sehr erschwert.
Zurzeit Steuere ich Vier bis Acht Servomotoren des Types RDS3115 über ein PCA9685.
Diese Servos bewegen sich nicht zeitgleich. Wenn Sie von Anschlag zu Anschlag fahren,
kommt es vor, dass sie aus dem "Takt" kommen.
Nach einigen Zyklen sind die Servos wieder Parallel.
Das Taktsignal konnte ich mit dem Oscilloscope abgreifen, welches keine Zeitlichen verschieben aufwies.
Mein Netzteil liefert einigermassen Stabile 7.4V für die Servomotoren.
Diese werden nicht über das Board bestrommt, da dieses nur für 6V ausgelegt ist.
Das PCA 9685 Board wird über das Raspberry gespeist.
Versuchte zeigten, dass es keinen unterschied machte, ob das Board + Servos über mein Netzteil vorsorgt wurden,
oder die Servos und das Board getrennt.
Mein Programm habe ich einfach aus dem Original Test Programm erweitert.
Meine erste Vermutung ist, dass das Phyton Skript nicht ausreicht, um diese ganzen Servos parallel betreiben zu können.
Die zweite wäre, dass die Servos einfach solch hohe Tolleranz aufweisen, das dies in Ihrer Natur liegt. Was ich mir aber nicht vorstellen kann.
Das Servo Board sollte in Ordnung sein. Ich habe zwei von diesen Bestellt, bei beiden zeigt sich ein ähnliches Ergebnis.
Könnt Ihr mir bitte einen Ratschlag geben?
Falls Ihr möchtet, kann ich ggf. noch ein Video Hochladen, dort sollte es gut ersichtlich sein, wie Asynchron die Motoren laufen.
Im Spoiler ist mein Skript.
Spoiler anzeigen
from __future__ import division
import time
import Adafruit_PCA9685
pwm = Adafruit_PCA9685.PCA9685()
servo_min = 150 # Min pulse length out of 4096
servo_max = 600 # Max pulse length out of 4096
servo_Neutral = 375
def set_servo_pulse(channel, pulse):
pulse_length = 1000000 # 1,000,000 us per second
pulse_length //= 60 # 60 Hz
print('{0}us per period'.format(pulse_length))
pulse_length //= 4096 # 12 bits of resolution
print('{0}us per bit'.format(pulse_length))
pulse *= 1000
pulse //= pulse_length
pwm.set_pwm(channel, 0, pulse)
pwm.set_pwm_freq(60)
print('Moving servo all on channel 0 - 3, press Ctrl-C to quit...')
while True:
pwm.set_pwm(0, 0, servo_Neutral)
pwm.set_pwm(1, 0, servo_Neutral)
pwm.set_pwm(2, 0, servo_Neutral)
pwm.set_pwm(3, 0, servo_Neutral)
time.sleep(1)
pwm.set_pwm(0, 0, servo_min)
pwm.set_pwm(1, 0, servo_min)
pwm.set_pwm(2, 0, servo_min)
pwm.set_pwm(3, 0, servo_min)
time.sleep(1)
pwm.set_pwm(0, 0, servo_max)
pwm.set_pwm(1, 0, servo_max)
pwm.set_pwm(2, 0, servo_max)
pwm.set_pwm(3, 0, servo_max)
time.sleep(1)
Alles anzeigen
Vielen Dank
Gruss
Christian