Arduino Servo Steuerung für Weichen

Nach einem Abstecher nach 1:35 wieder zurück zur Eisenbahn!

Nach langem tüfteln, einigen fehlerhaften Prototypen und anderen Stolpersteinen ist meine Servosteuerung endlich fertig!

Im Prinzip ein sehr einfaches Shield:

WP_20151101_11_18_14_Pro WP_20151101_11_17_45_Pro

  • 4x  Anschlüsse für Servos
  • 1x 8 Pin Leiste für die Schalter (gegen GND)
  • 1x 8 Pin Leiste  für die Rückmelde-LEDs (mit Widerstand)
  • 1x Stromversorgung

Die Led’s laufen über einen ULN2003 um den Arduino nicht zu überlasten, bzw. eventuell statt den LED’s Relais anzuhängen.

Geschaltet wird mit Drucktastern die bei jedem Tastendruck den Zustand von LED und Servo umschalten. Start- und Endwinkel sind für jedes Servo zu definieren, Stellgeschwindigkeit kann auch verändert werden.

WP_20151101_11_16_55_Pro

Beim Code wird es jedem Programmierer die Zehennägelaufrollen, aber es funktioniert soweit. Leider hab ichs nicht geschafft die 4 Schalter in einer Schleife abzufragen, jetzt gehts halt nacheinander.

Ein bisschen hier abgeschaut ein bisschen dort,

Rudys Model Railway war ein Quell der Inspiration, ebenso die Tutorials auf der Arduino Homepage.

 

const int weiche_anzahl = 4;
int servspeed = 20; // higher = slower
int debounce = 50;
 
typedef struct
{
int ledPin;
int buttonPin;
boolean currentState = LOW;//stroage for current button state
boolean lastState = LOW;//storage for last button state
boolean ledState = HIGH;//storage for the current state of the LED (off/on)
int servpos = 90;
int maxwinkel;
int minwinkel;
}WeicheStruct;
 
WeicheStruct weiche[weiche_anzahl];
 
Servo servo[weiche_anzahl];
 
void setup(){
servo[0].attach(0);
servo[1].attach(1);
servo[2].attach(2);
servo[3].attach(3);
 
weiche[0].ledPin = 4;
weiche[0].buttonPin = 8;
weiche[0].maxwinkel = 105;
weiche[0].minwinkel = 75;
 
weiche[1].ledPin = 5;
weiche[1].buttonPin = 9;
weiche[1].maxwinkel = 105;
weiche[1].minwinkel = 75;
 
weiche[2].ledPin = 6;
weiche[2].buttonPin = 10;
weiche[2].maxwinkel = 105;
weiche[2].minwinkel = 75;
 
weiche[3].ledPin = 7;
weiche[3].buttonPin = 11;
weiche[3].maxwinkel = 105;
weiche[3].minwinkel = 75;
 
for (int i=0; i<weiche_anzahl; i++) { pinMode(weiche[i].buttonPin, INPUT_PULLUP);//this time we will set the pin as INPUT pinMode(weiche[i].ledPin, OUTPUT); } } void loop(){ weiche[0].currentState = digitalRead( weiche[0].buttonPin); if ( weiche[0].currentState == HIGH && weiche[0].lastState == LOW){//if button has just been pressed delay(10);//crude form of button debouncing //toggle the state of the LED if ( weiche[0].ledState == HIGH){ digitalWrite(weiche[0].ledPin, LOW); // weiche.write(minwinkel); weiche[0].servpos = (weiche[0].maxwinkel); for (weiche[0].servpos = weiche[0].maxwinkel; weiche[0].servpos >= weiche[0].minwinkel; weiche[0].servpos -=1)
{servo[0].write(weiche[0].servpos);
delay(servspeed);}
weiche[0].ledState = LOW;
} else {
digitalWrite(weiche[0].ledPin, HIGH);
//weiche.write(maxwinkel);
weiche[0].servpos = weiche[0].minwinkel;
for (weiche[0].servpos=weiche[0].minwinkel; weiche[0].servpos <=weiche[0].maxwinkel; weiche[0].servpos +=1) {servo[0].write(weiche[0].servpos); delay(servspeed);} weiche[0].ledState = HIGH; } } weiche[0].lastState = weiche[0].currentState; weiche[1].currentState = digitalRead( weiche[1].buttonPin); if ( weiche[1].currentState == HIGH && weiche[1].lastState == LOW){//if button has just been pressed delay(10);//crude form of button debouncing //toggle the state of the LED if ( weiche[1].ledState == HIGH){ digitalWrite(weiche[1].ledPin, LOW); // weiche.write(minwinkel); weiche[1].servpos = (weiche[1].maxwinkel); for (weiche[1].servpos = weiche[1].maxwinkel; weiche[1].servpos >= weiche[1].minwinkel; weiche[1].servpos -=1)
{servo[1].write(weiche[1].servpos);
delay(servspeed);}
weiche[1].ledState = LOW;
} else {
digitalWrite(weiche[1].ledPin, HIGH);
//weiche.write(maxwinkel);
weiche[1].servpos = weiche[1].minwinkel;
for (weiche[1].servpos=weiche[1].minwinkel; weiche[1].servpos <=weiche[1].maxwinkel; weiche[1].servpos +=1) {servo[1].write(weiche[1].servpos); delay(servspeed);} weiche[1].ledState = HIGH; } } weiche[1].lastState = weiche[1].currentState; weiche[2].currentState = digitalRead( weiche[2].buttonPin); if ( weiche[2].currentState == HIGH && weiche[2].lastState == LOW){//if button has just been pressed delay(10);//crude form of button debouncing //toggle the state of the LED if ( weiche[2].ledState == HIGH){ digitalWrite(weiche[2].ledPin, LOW); // weiche.write(minwinkel); weiche[2].servpos = (weiche[2].maxwinkel); for (weiche[2].servpos = weiche[2].maxwinkel; weiche[2].servpos >= weiche[2].minwinkel; weiche[2].servpos -=1)
{servo[2].write(weiche[2].servpos);
delay(servspeed);}
weiche[2].ledState = LOW;
} else {
digitalWrite(weiche[2].ledPin, HIGH);
//weiche.write(maxwinkel);
weiche[2].servpos = weiche[2].minwinkel;
for (weiche[2].servpos=weiche[2].minwinkel; weiche[2].servpos <=weiche[2].maxwinkel; weiche[2].servpos +=1) {servo[2].write(weiche[2].servpos); delay(servspeed);} weiche[2].ledState = HIGH; } } weiche[2].lastState = weiche[2].currentState; weiche[3].currentState = digitalRead( weiche[3].buttonPin); if ( weiche[3].currentState == HIGH && weiche[3].lastState == LOW){//if button has just been pressed delay(10);//crude form of button debouncing //toggle the state of the LED if ( weiche[3].ledState == HIGH){ digitalWrite(weiche[3].ledPin, LOW); // weiche.write(minwinkel); weiche[3].servpos = (weiche[3].maxwinkel); for (weiche[3].servpos = weiche[3].maxwinkel; weiche[3].servpos >= weiche[3].minwinkel; weiche[3].servpos -=1)
{servo[3].write(weiche[3].servpos);
delay(servspeed);}
weiche[3].ledState = LOW;
} else {
digitalWrite(weiche[3].ledPin, HIGH);
//weiche.write(maxwinkel);
weiche[3].servpos = weiche[3].minwinkel;
for (weiche[3].servpos=weiche[3].minwinkel; weiche[3].servpos <=weiche[3].maxwinkel; weiche[3].servpos +=1)
{servo[3].write(weiche[3].servpos);
delay(servspeed);}
weiche[3].ledState = HIGH;
}
}
weiche[3].lastState = weiche[3].currentState;
}

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

*

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.