Ich hab ein seltsames Problem mit einem Sketch für'n Arduino an dem ein Pan&Tilt angeschlossen ist.
Dazu verwende ich die in Arduino-IDE bei gefügte Servo.h
Die Servos vom Pan/Tilt hab ich so angeschlossen das sich jeweils ein 470µF Elko zwischen Steuersignal und GND befindet.
Da ich sowohl zur Seite/Schwenken (Pan) als auch nach Oben/Unten/Kippen (Tilt) möchte, hab ich 2x die Servo Klasse initialisiert.
Hab jetzt ein Sketch geschrieben wo er bei Initialisierung in eine eingestellte Nullstellung fährt.
Die Schritte für PAN-Bewegungen sind auf 10 eingestellt, für TILT auf 20.
Dann geht er in 10er Schritten erst nach Rechts, beim erreichen eines eingestellten Maximums (damit man den Servo nicht überdreht und beschädigt, sollte nicht über 179 liegen) geht er nach Links und beim erreichen des eingestellten Minimums (sollte nicht unter 0 liegen) macht er eine sog. NewLine dh der TILT geht um 20 Schritte nach oben und dann beginnt das Spiel wieder von Vorne:
Der PAN macht erst nach rechts bis ans Max, dann nach Links bis zum Min. Ist die Line fertig geht der TILT weiter nach oben - dafür kann man ebenfalls ein Maximum einstellten. Ist das TILT_Maximum erreicht soll er wieder um 20 runter usw, und auch für TILT gibts ein Minimum...
Das Problem besteht jetzt allerdings darin das er beim erreichen des TILT Maximums oder Minimums die Line noch mals in der selben TILT Einstellung abfährt, aber das soll er nicht
Da werkel ich jetzt schon seit gestern dran aber komm nicht auf den Fehler bzw was ich anders programmieren muss.
Sketch:
Spoiler anzeigen
#include <Servo.h>
#define UP (1)
#define DOWN (2)
#define RIGHT (3)
#define LEFT (4)
Servo pan_servo;
Servo tilt_servo;
int pos_pan = 70; // variable to store the servo position
int pos_tilt = 150; // variable to store the servo position
char dir_pan = RIGHT;
char dir_tilt = UP;
int newLine = 0;
//#########################################################
void servo_pan(int pos) {
static int old_pos=0;
int difference = pos - old_pos;
for(int i=0; i < (abs(difference) +1 ); i++) {
if (difference > 0)
pan_servo.write(old_pos++);
else if (difference<0)
pan_servo.write(old_pos--);
else {
pan_servo.write(pos);
break;
}
delay(15);
}
old_pos=pos;
}
void servo_tilt(int pos) {
static int old_pos=0;
int difference = pos - old_pos;
for(int i=0; i < (abs(difference) +1 ); i++) {
if (difference > 0)
tilt_servo.write(old_pos++);
else if (difference < 0)
tilt_servo.write(old_pos--);
else {
tilt_servo.write(pos);
break;
}
delay(15);
}
old_pos=pos;
}
void PanTilt(void) {
servo_tilt(pos_tilt);
servo_pan(pos_pan);
delay(500);
Serial.print("Pan: ");
Serial.print(pos_pan, DEC);
Serial.print(", Tilt: ");
Serial.print(pos_tilt, DEC);
if (dir_pan == RIGHT) {
pos_pan = pos_pan + 10;
if (pos_pan > 160) {
pos_pan = pos_pan - 10;
dir_pan = LEFT;
newLine = 1;
}
} else {
pos_pan = pos_pan - 10;
if (pos_pan < 20) {
pos_pan = pos_pan + 10;
dir_pan = RIGHT;
newLine = 1;
}
}
if (newLine) {
Serial.print(", newLine: ");
Serial.print(newLine, DEC);
newLine=0;
if (dir_tilt == UP) {
pos_tilt = pos_tilt - 20;
if (pos_tilt < 130) {
pos_tilt = pos_tilt + 20;
dir_tilt = DOWN;
}
} else {
pos_tilt = pos_tilt + 20;
if (pos_tilt > 170) {
pos_tilt = pos_tilt - 20;
dir_tilt = UP;
}
}
}
Serial.println("");
}
//#########################################################
void setup() {
Serial.begin(9600);
pan_servo.attach(8); // attaches the servo on pin 8 to the servo object
tilt_servo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
PanTilt();
}
Alles anzeigen
Serial Ausgabe:
Spoiler anzeigen
[...]
Pan: 40, Tilt: 150
Pan: 30, Tilt: 150
Pan: 20, Tilt: 150, newLine: 1
Pan: 20, Tilt: 170
Pan: 30, Tilt: 170
Pan: 40, Tilt: 170
Pan: 50, Tilt: 170
Pan: 60, Tilt: 170
Pan: 70, Tilt: 170
Pan: 80, Tilt: 170
Pan: 90, Tilt: 170
Pan: 100, Tilt: 170
Pan: 110, Tilt: 170
Pan: 120, Tilt: 170
Pan: 130, Tilt: 170
Pan: 140, Tilt: 170
Pan: 150, Tilt: 170
Pan: 160, Tilt: 170, newLine: 1
Pan: 160, Tilt: 170
Pan: 150, Tilt: 170
Pan: 140, Tilt: 170
Pan: 130, Tilt: 170
Pan: 120, Tilt: 170
Pan: 110, Tilt: 170
Pan: 100, Tilt: 170
Pan: 90, Tilt: 170
Pan: 80, Tilt: 170
Pan: 70, Tilt: 170
Pan: 60, Tilt: 170
Pan: 50, Tilt: 170
Pan: 40, Tilt: 170
Pan: 30, Tilt: 170
Pan: 20, Tilt: 170, newLine: 1
Pan: 20, Tilt: 150
Pan: 30, Tilt: 150
[...]
Alles anzeigen
In der Mitte ist das Problem (2.newLine)