herbi39:
wenn du mir noch einen zum jetzigen Schaltplan passenden Sketch schreiben könntest, wäre das super.
OK, anbei mal ein erster Versuch.
Ungetestet, können also Fehler drin sein.
// Model railway switch (untested) by 'jurs'
// use button with INPUT and external pull-down resistor
// or with INPUT_PULLUP and internal pull-up resistor
#define BUTTONPIN 2
#define INPUTMODE INPUT // INPUT or INPUT_PULLUP
#define LEDPIN 3
#define POTILEFT 4
#define POTIRIGHT 5
#define SERVOPIN 6
#define SERVOMIDDLE 1500 // 1500µs impulse duration means servo middle position
// define some symbolic constants
enum {LEFT, RIGHT}; // directions
enum {OFF, RED, GREEN}; // LED states
int currentOrientation;
void switchLED(int ledState)
{
switch(ledState)
{
case RED:
pinMode(LEDPIN,OUTPUT);
digitalWrite(LEDPIN,HIGH);
break;
case GREEN:
pinMode(LEDPIN,OUTPUT);
digitalWrite(LEDPIN,LOW);
break;
default:
pinMode(LEDPIN,INPUT);
digitalWrite(LEDPIN,LOW);
}
}
void switchServo(int orientation)
{
switchLED(OFF);
unsigned long time=millis();
while (millis()-time<500) updateServo(orientation); // half second delay updating the servo
if (orientation==LEFT) switchLED(RED);
else switchLED(GREEN);
currentOrientation=orientation;
}
void updateServo(int orientation)
{
int servoImpulse=SERVOMIDDLE;
if (orientation==LEFT) servoImpulse-= analogRead(POTILEFT)/3;
else servoImpulse+= analogRead(POTIRIGHT)/3;
digitalWrite(SERVOPIN,HIGH);
delayMicroseconds(servoImpulse);
digitalWrite(SERVOPIN,LOW);
delayMicroseconds(20000-servoImpulse);
}
boolean buttonPressed()
{
boolean result=false;
static byte lastButtonState;
byte buttonState = digitalRead(BUTTONPIN);
if (INPUTMODE==INPUT_PULLUP) buttonState=!buttonState;
if (buttonState == HIGH && lastButtonState == LOW) result=true;
lastButtonState=buttonState;
return result;
}
void setup() {
pinMode(BUTTONPIN, INPUTMODE);
pinMode(LEDPIN, OUTPUT);
pinMode(SERVOPIN, OUTPUT);
switchServo(LEFT);
}
void loop() {
if (buttonPressed())
{
if (currentOrientation==LEFT) switchServo(RIGHT);
else switchServo(LEFT);
}
updateServo(currentOrientation);
}
In Deiner Schaltung hast Du einen externen PullDown-Widerstand am Button, also "INPUTMODE INPUT". Dasselbe Programm könnte auch mit den internen PullUp-Widerstand aktivieren und mit INPUT_PULLUP betrieben werden, aber das ist nur sinnvoll, wenn sich der Button sehr nahe am Controller befindet und mit einer kurzen Leitung angeschlossen ist.
Der beabsichtigte Ablauf ist wie folgt:
Beim Einschalten fährt der Servo in eine Richtung.
Während der Servofahrt werden die LEDs für eine halbe Sekunde ausgeschaltet.
Nach der Servofahrt wird die eine oder die andere LED eingeschaltet.
Mit den Potis kann die Servo-Sollposition eingestellt werden, und zwar ausgehend von der Servo-Mittellage.
Die eine Sollposition ergibt sich aus der Mittellage bei 1500µs Impulsdauer + ADC-Messwert/3, beim anderen Sollwert wird ADC-Messwert/3 abgezogen.
Da der ADC-Messwert bis zu 1023 betragen kann, variiert die Servo-Impulsdauer also
1500 +/-341
Da eine Impulsveränderung von 500µs typischerweise einem Drehwinkel von 90° entsprechen, kann mit den Potis jeder Endanschlag um ca. 60° verändert werden.
Also Linkswert 90° ... 30° Servowinkel einstellbar und Rechtswert 90° ... 150° Servowinkel einstellbar.
Bei Servomittelstellung beider Potis sollte der Servo also zwischen ca. 60° und 120° Stellwinkel drehen.
Die Drehgeschwindigkeit des Servos wird bei diesem Programm nicht künstlich ausgebremst, sondern der Servo läuft quasi mit der ihm eigenen maximalen Stellgeschwindigkeit zwischen den Endpositionen.
Probier's mal aus, ob das so grob funktioniert!
Wenn nicht, müßte ich mir selbst mal einen kleinen Versuchsaufbau mit LEDs, Potis und Servo machen.