für diejenigen, die in absehbarer Zeit mal einen Servo am RF1000/RF2000 betreiben wollen, will ich mal kurz eine Möglichkeit vorstellen, wie man dem Servo das Zittern abgewöhnen kann. Die Idee dazu kam bei Digibike's Dualextruderumbau, da seine Neuanschaffung einen Servo verbaut hat. Dieser zeigte laut Digibike ein Zittern wie "Hemmy auf Exstasie". Messungen mit dem Oszilloskop haben gezeigt, dass das Signal vom RF1000 nicht ganz sauber ist und um ca. 30 µs schwanken kann, was das Zittern verursacht.
Um dem Servo das Zittern abzugewöhnen, hab ich einen Arduino Mini Pro, wie unten abgebildet, zw. RF1000 und Servo geschaltet.
Das folgende kleine Programm wertet das PWM-Signal an A2 aus und gibt ein stabiles PWM-Signal an D9 aus. Mit Hilfe von vordefinierten Schwellwerten (MIN_THR_ANGLE, MAX_THR_ANGLE) und Totbereichen für die Mittelstellung (MIN_ANGLE, MAX_ANGLE), kann man seine Lagen festlegen und so das Zittern los werden.
Code: Alles auswählen
#include "Servo.h"
#define MIN_THR_ANGLE 80
#define MAX_THR_ANGLE 100
#define MIN_ANGLE 70
#define MID_ANGLE 90
#define MAX_ANGLE 110
int servo_in = 2;
float pos;
int a_pos = 0;
unsigned long t_start, t_stop, t_pulse = 0;
//volatile int state = LOW;
Servo myservo;
void setup() {
pinMode(servo_in, INPUT);
myservo.attach(9);
}
void loop() {
//a_pos = pos;
t_pulse = pulseIn(servo_in, HIGH, 2400);
if (t_pulse > 0)
{
if (t_pulse < 700)
t_pulse = 700;
Serial.println(t_pulse);
pos = ((t_pulse - 700) / 1500.0) * 180.0;
a_pos = abs(pos);
Serial.println(pos);
if(a_pos < MIN_THR_ANGLE)
a_pos = MIN_ANGLE;
else if(a_pos > MAX_THR_ANGLE)
a_pos = MAX_ANGLE;
else
a_pos = MID_ANGLE;
if ( pos != a_pos)
myservo.write(a_pos);
}
}
Viel Spaß damit
JoBo