ich versuche gerade einen Servo Motor mit FB zu steuern.
Läuft auch halbwegs, aber ich bekomme es nicht hin, das der Motor
nach Start des Arduinos in Mittelstellung geht. Drücke ich 1 oder 2
auf der FB, fährt er ans Ende bzw Anfang.
auf
myservo.writeMicroseconds(1500);
scheint der Motor nicht zu reagieren....
#include <IRremote.h>
#include <Servo.h>
int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
decode_results results;
int pos = 0;
Servo myservo;
void setup()
{
Serial.begin(9600);
pinMode (13, OUTPUT);
irrecv.enableIRIn();
myservo.attach(9);
myservo.writeMicroseconds(1500);
}
void loop(){
if (irrecv.decode(&results)) {
int value = results.value;
switch (value){
case 3810010651 :
case 16753245 :
Serial.println("Taste 1");
for (pos = 550; pos <= 2400; pos += 10) {
// in steps of 1 degree
myservo.writeMicroseconds(pos);
delay(10);
}
break;
case 5316027 :
case 16736925 :
Serial.println("Taste 2");
for (pos = 2400; pos >= 550; pos -= 10) {
myservo.writeMicroseconds(pos);
delay(10);
}
break;
} // switch ende
Serial.println(results.value, DEC);
delay(1000);
irrecv.resume();
} // if ende
} //loop ende
// Codes
// 1 - 3810010651
// 2 - 5316027
Teste gerade noch, am Ende möchte ich das der Servo nach Start in Mittelstellung geht und
bei druck auf Taste 1 (+100) macht und bei Taste 2 (-100).
Mmh - bei mir macht er das (beim Start auf Mittelstellung). Was natürlich nicht funktioniert, dass er dann beim ersten Drücken auf eine Taste von der Mitte aus losläuft. Da springt er erstmal auf Anfang oder Ende bevor es losgeht.
P.S. bist Du dir sicher, dass dein Servo den gesamten Bereich der vorgegebenen Pulslängen verträgt? Meins kann das jedenfalls nicht.
Das steht bei den Daten meist nicht dabei. Standard ist ja nur 1000...2000µs. Aber die meisten Servos können mehr - mal mehr, mal weniger. Digitale Servos reagieren auf Impulsbreiten ausserhalb ihres Spektrums üblicherweise garnicht. Letztendlich kannst Du das nur ausprobieren, wenn Du sie bis an die Grenzen nutzen willst.
Aber, dennoch muss er doch irgendwie in Mittelstellung zu bekommen sein, nach Start. Die 1500 sollten doch immer passen, oder?
Die For Schleifen läuft er ja auch sauber durch
Das stimmt. Wenn ich deinen Sketch auf meine Test-HW spiele funktioniert das ja auch, weshalb ich mich etwas schwer tue eine Ursache zu finden.
Was passiert denn, wenn Du die ganz IR-Steuerung rausnimmst, und die Positionierung auf Mitte machst? Und welchen Arduino nutzt Du überhaupt?
noxx2:
weiß der Servo beim anschalten wo er sich
aktuell befindet?
Das Servo schon, aber die Servolib nicht.
int position = myservo.read();
gibt einfach den Wert der aktuellen Pulsbreite zurück. Allerdings sollte das Servo dann ja auch da stehen, wenn die Impulse ausgegeben werden.
Bist Du denn sicher, dass das Servo nicht schon auf Mitte steht? Eigentlich startet die Servolib bereits mit dem attach Impulse von 1,5ms zu erzeugen. Ein
Hast Du die Möglichkeit, das mal mit einem anderen Servo zu testen? Oder den erzeugten Impuls zu messen?
Wie gesagt, die Servolib beginnt bereits mit dem attach Impulse zu erzeugen. Der Standardwert sind da bereits 1,5ms. Dein Servo sollte also bereits mit dem attach-Kommando reagieren. Evtl. kannst Du eine LED mit Vorwiderstand parallel zum Servo an den Ausgang hängen. Dann siehst Du zumindest, ob sich nach dem Start da überhaupt was tut.
Womit versorgst Du das Servo ( Spannungsanschluss )?
Wenn Du den Servo auf 120° schickst, wird Dir .read() diese 120 zurück geben - sch*** egal, ob überhaupt ein Servo angeschlossen ist - DAS ist NUR die SOLL-POSITION des Servo, Die zuletzt gesetzt wurde.
Teste Es - reiß das Servo raus und wundere Dich, warum Der IMMER NOCH auf 93 steht.