Ziel: Mein Programm zur Gesichtserkennung liefert permanent X/Y Daten. Diese X/Y Daten verwende ich als Grundlage für die Steuerung von zwei Servos auf denen eine Web-Cam sitzt.
Servo-1 => X Achse
Servo-2 => Y Achse
Anmerkung zu Servos bzw. unterschied zu einem Elektromotor:
Ein normaler Elektromotor erzeugt schlicht und einfach eine Drehbewegung, wobei man die Drehrichtung meist durch die Polung einstellen kann. Der einfache Elektromotor kann sich beliebig oft drehen, allerdings ist es schwierig genaue Bewegungen zu erzeugen – man kann nicht einfach sagen: “Jetzt 3 Umdrehungen vorwärts und dann 2 Rückwärts”.
Der Servo funktioniert komplett anders, da man normalerweise nicht mehr als eine halbe Umdrehung mit der Achse machen kann, diese aber auf wenige Grad genau steuern kann. Dazu ist im Servo bereits eine Steuerlogik und ein Getriebe verbaut.
Hier mal mein erster Erguss – ansteuern eines Servos:
int servoPin = 2; // Steuerpin für den Servo
int minPulse = 500; // Minimalposition des Servos
int maxPulse = 2500; // Maximalposition des Servos
int pulse = 0; // Aktueller Pulswert
long lastPulse = 0; // Zeitpunkt des letzten Pulses
int refreshTime = 20; // Zeit dazwischen
boolean updown = true; // Pegel - rauf oder runter
void setup() {
pinMode(servoPin, OUTPUT); // Servopin ist ein Ausgabepin
pulse = minPulse; // Position des Servos startet auf Minimum
Serial.begin(9600); // Serielle Verbindung zur Kontrolle
}
void loop() {
if(updown) {
pulse++;
if(pulse >= maxPulse) {
updown = false;
}
} else {
pulse--;
if(pulse <= minPulse) {
updown = true;
}
}
// Neuer Puls nach der eingestellten Pause
if (millis() - lastPulse >= refreshTime) {
digitalWrite(servoPin, HIGH); // Puls beginnt
delayMicroseconds(pulse); // Länge des Pulses bestimmt neue Position
digitalWrite(servoPin, LOW); // Puls endet
lastPulse = millis(); // Speichert die aktuelle Zeit
}
}