Hallo Leute, ich möchte mich mal an diesem Projekt hier versuchen (Quadruped Spider):
Ich möchte für das Projekt einen 3S 650mAh - 1000mAh Lipo nutzen, damit der Spider mobil ist, aber nicht zu viel Gewicht mitbringt.
Das für 12 Servos ein 3A UBEC ratsam ist, leuchtet mir ein (ich habe aber auch schon ähnliche Projekte gesehen, bei denen die 12 Servos direkt vom Arduino gefüttert werden! :o ).
Was mir aber nicht so recht einleuchtet, ist, warum nach obiger Anleitung sowohl ein UBEC (das allein das Servo-Board versorgt), als auch ein weiterer DC-DC Step-Down benutzt werden, der dann den Ardu füttert.
Beide hängen doch am selben Lipo und beide geben 5V aus. Würde das UBEC allein hier nicht reichen um alles zu versorgen? Also Ardu und das Servo Board an das UBEC? 3A reichen doch, oder? Oder ist es doch ratsam, den Ardu über einen eigenen Step-Down zu betreiben?
ich könnte mir vorstellen, dass die Servos im Betrieb zu viel Störungen produzieren und mit dem 2.Stepdown werden die von den Controllern ferngehalten.
Also das PCA9685 Servo Board erlaubt eine Servospannung bis zu 6V. Die Servos (diese hier) ebenfalls, also könnte ich dann wohl auf 6V gehen.
Die Programmierung des PCA9685 Servo Boards verwirrt mich momentan noch etwas. Die dazugehörige Adafruit PWM Library steuert die Servos ja nicht über Grad, sondern PWM an. Im Beispielcode "servo.ino" der Library werden zwei Werte definiert:
#define SERVOMIN 150 // This is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX 600 // This is the 'maximum' pulse length count (out of 4096)
Und die unterscheiden sich ja je nach Servo-Typ. Wie man diese Werte ermittelt, beschreibt Adafruit so:
Find the Minimum:
Using the example code, edit SERVOMIN until the low-point of the sweep reaches the minimum range of travel. It is best to approach this gradually and stop before the physical limit of travel is reached.
Find the Maximum:
Again using the example code, edit SERVOMAX until the high-point of the sweep reaches the maximum range of travel. Again, is best to approach this gradually and stop before the physical limit of travel is reached.
Ich möchte aber schon gerne vermeiden, das es knirscht (also die Servos über ihren Endpunkt drehen). Dann wohl lieber vorher erst vorsichtig manuell in beide Richtungen zu drehen und die Endpunkte z.B. mit einem Stift zu markieren, um sich dann vorsichtig mit dem Sketch den Markierungen zu nähern? Wie macht ihr das?
Die Steuersignale sind Impulse die alle 20mS wiederholt werden.
Die Dauer der Impulse entspricht dem Drehwinkel.
Normalerweise spricht man von Impulsen von 1 bis 2mS für den gesamten Ausschlag des Servos. Das gilt aber nicht für alle Servos und darum muß Du das Kontrollieren. Für manche Servos sind auch kürzere oder längere Zeiten sinnvoll.
Ich habe das jetzt mal so gemacht und mir einen Sketch mit zwei Buttons gebastelt. Der eine dreht den Servo immer ein wenig nach rechts, der andere nach links. Die Werte kurz vor den Endstops (also wenn er nicht mehr weiter konnte) habe ich mir notiert und bin so auf
SERVOMIN = 70
SERVOMAX = 515
gekommen. Aber stimmt diese Vorgehensweise überhaupt?
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
#define SERVOMIN 70 // This is the 'minimum' pulse length count (out of 4096)
//Original 150, changing it to 70
#define SERVOMAX 515 // This is the 'maximum' pulse length count (out of 4096)
#define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates
int val = 300; // Servo start position
const int BUTTON_MIN = 3; // Button to decrease servo value
const int BUTTON_MAX = 4; // Button to increase servo value
void setup()
{
Serial.begin(9600);
Serial.println("PWM Servo Calibration");
// initialize the pushbuttons:
pinMode(BUTTON_MIN, INPUT_PULLUP);
pinMode(BUTTON_MAX, INPUT_PULLUP);
pwm.begin();
pwm.setOscillatorFrequency(27000000);
pwm.setPWMFreq(SERVO_FREQ);
pwm.setPWM(0, 0, val);
}
void loop()
{
if (digitalRead(BUTTON_MIN) == LOW)
{
val -= 5;
Serial.print("MIN VALUE ");
Serial.println(val);
pwm.setPWM(0, 0, val);
delay(100);
}
else if (digitalRead(BUTTON_MAX) == LOW)
{
val += 5;
Serial.print("MAX VALUE ");
Serial.println(val);
pwm.setPWM(0, 0, val);
delay(100);
}
}
Schaltung ist so, wie auf dem Diagramm, funktioniert soweit prima.
uwefed:
3A finde ich für 12 Servo schon etwas stark bescheiden.
Grüße Uwe
3A reichen für das Ding völlig aus. Es laufen ja nicht alle 12 Servos unter Volllast simultan. Man merkt bei schnellen Bewegungen (Speed auf 2x) aber, das die Plastikgetriebe der Servos an ihre Grenze getrieben werden. . Mom. hängt ein popeliger 2S 25C 1000mAh Lipo dran. Damit läuft es ewig. Könnte noch einen etwas kleineren nehmen, um Gewicht zu sparen und die Servos zu schonen.