Archiv der Kategorie: Modelleisenbahn

Arduino Servo Steuerung für Weichen

Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /home/.sites/674/site7434035/web/wp/wp-content/plugins/wp-syntax/wp-syntax.php on line 380

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;
}

 

Gleisprobe 2

Leider geht es viel zu langsam voran..

Die Fortschritte der letzten Wochen:

  • Mittlerweile sind alle Gleise für den Bahnhof verklebt und zu 75% farblich nachbehandelt (Schwellen und Gleisprofil)
  • Teilweise gibts schon Sand und Schotter
  • Eine Weiche hat Motor und Gestänge bekommen
  • Die Gleiswendel hat Strom und ein Tunnelportal aus XPS bekommen

Und das wars dann auch schon wieder.

WP_20150921_13_47_09_Pro WP_20150921_13_47_23_Pro

WP_20150921_13_47_30_Pro WP_20150921_13_47_40_Pro

Ein neuer Bahnhof entseht

 

ScreenshotNach einigem recherchieren hab ich ddiesen Bahnhof konstruiert, verwendet habe ich dazu SketchUp weil es erstens schön einfach ist und es zweitens esin tolles SVG Export Plugin gibt mit dem ich alle Faces (einzelnen 2D Elemente) zur weiterverarbeitung nach Inkscape bekomme. Von dort geht es über Estlcam an meine 3020Z CNC.

So sehen die ersten Bauteile aus:

 

 

 

2mm ForexWP_20150628_09_20_05_Pro

1mm PolystolWP_20150628_09_20_13_Pro

1 mm BalsaWP_20150628_09_20_35_Pro

 

Gefräst mit einem 0,8mm Fräser.

 

 

 

 

Phönix aus der Asche

Aber es geht schon wieder weiter,

Da ich ja sozusagen ein Eisenbahn-Quereinsteiger bin und meine bisherigen Planungen eher bescheiden waren halt ich mich lieber an „vorgekautes“ in Form der MiniMax Bahnhöfe von Diete aus dem StummiForum.

Also werden fürs erste einmal 3x 100x50cm Module gebaut und werde mich am Bahnhof Ohr versuchen

Weiterer Plan: ums Eck einen 2. Bahnhof und ans Ende jeweils eine Wendel mit einer Schiebebühne statt eines Schattenbahnhofs.

Zwischenstand:

Gleismaterial (Tillig Elite) ist schon einmal angekommen. Vielleicht mach ich aber eine Weiche mehr für den Vorschlag Bahnhof Hellingst

Die 3 Kästen (Rahmen 15mm, Deckel 8mm Sperrholz) sind bis auf die Beine fertig.

WP_20150627_12_59_13_Pro WP_20150627_14_04_25_Pro WP_20150627_14_14_06_Pro

So schön, schön war die Zeit…

WP_20150627_13_01_07_Pro

 

Innerhalb von knapp zwei Jahren erwuchs dieses Konstrukt aus einem Pallettenstapel mit Rasenteppich.

Ich war aber zum einen mit dem Gleisplan nicht ganz zufrieden, auch die Gleise sind nicht optimal verlegt.

Nachdem ich alle Gleise (Roco Geoline) noch einmal abgebaut, gealtert und geschottert habe, kämpfe ich mit nicht mehr passsenden Weichen, Stromaussetzern und anderen Nervigkeiten.

Darum ist jetzt Schluss……. mit dieser „Anlage“

20140130_133017pljxx