Hallo zusammen,
wie versprochen möchte ich nun (kurz vor dem ersten Geburtstag des Threads) skizzieren, wie das Anfahren der Gleise funktioniert.
Die absolute Position der Anschlussgleise ist in "Steps-ab-Nullpunkt" in einem Array hinterlegt. Die Null könnte man sich im Prinzip sparen, muss dann aber immer die Index-Verschiebung berücksichtigen. Also war ich da etwas großzügig. Bei einem kommerziellen Produkt würde sowas natürlich im EEPROM gespeichert - aber ich habe ja immer Zugriff auf meinen Code . Die Berechnung der Gleisanzahl über sizeof ( gleisPos ) funktioniert vermutlich wegen des "long"-Typs nicht, daher habe ich sie separat als Konstante hinterlegt - wahrscheinlich könnte man sie auch irgendwie richtig berechnen … aber so oft ändert sich das ja auch nicht.
1
2
3
// Positionen der Gleisabgänge gemessen ab Nullpunkt
const long gleisPos[] = { 0,82,3434,8285,10708 };
const byte gleisZahl = 5; // Anzahl der (max.8 bzw.max.16) Gleisabgänge
Durch die Verwendung des MCP23017 und der dazugehörigen Adafruit-Library für die Eingabe-Taster lässt sich die Gleisanfahrt im Hauptprogramm einfach über eine Schleife realisieren. Alternativ kann man natürlich auch die Input-Pins in ein Array legen:
1
2
3
4
5
for ( int i=1; i<gleisZahl; i++ ) {
if ( !mcp.digitalRead(i) ) {
Gleisfahrt(i); // Gleis i anfahren
}
}
Das Unterprogramm für die Fahrt der Bühne besteht jetzt i.w. noch darin, Geschwindigkeit und Rampenlänge zu setzen und den Motor zur definierten Position zu fahren:
1
2
3
4
5
6
7
void Gleisfahrt(int i) {
Verschubmotor.setSpeed(900); // Setzen der Geschwindigkeit in rpm*10
Verschubmotor.setRampLen(500); // Setzen der Rampenlänge
Verschubmotor.writeSteps(gleisPos[i]); // Ziel anfahren
while ( Verschubmotor.moving() ) {}; // warten, bis Ziel erreicht
}
Zum Schluss noch die Frage, wie man nun die Gleispositionen bestimmt. Ganz grob könnte man erstmal rechnen: 200 Steps = eine Umdrehung = 8mm … und sich dann mit vielen Versuchen rantasten. Zur Erleichterung habe ich die "Messfahrt" implementiert. In diese springt das Programm, wenn beim Start während der Setup-Phase "Taster 0" gedrückt ist (der im Normalbetrieb die Bühne neu initialisiert):
1
2
3
4
Initialisieren(); // Nullpunkt initialisieren (und GleisPos[0] anfahren)
if ( !mcp.digitalRead(0) ) {
Messfahrt(); // Messfahrt, wenn Taster 0 gedrückt
}
Das macht natürlich nur mit laufendem Seriellen Monitor Sinn - oder man müsste eine andere Form von Display mit einbauen.
Erste Aktion: Warten, dass "Taster 0" frei ist, da er auch zum Beenden der Messfahrt verwendet werden soll, d.h. die Schleife läuft dann solange, bis der Taster das nächste Mal gedrückt wird:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void Messfahrt() {
boolean printed=false;
Serial.println("Messfahrt .....");
Verschubmotor.setSpeed(100); // Setzen der Geschwindigkeit in rpm*10
Verschubmotor.setRampLen(0); // Setzen der Rampenlänge für Messfahrt auf 0
while ( !mcp.digitalRead(0) ) { // Warten, bis Initialisierungstaster frei ...
// LED-Anzeige ...
}
while ( mcp.digitalRead(0) ) { // Solange Initialisierungstaster frei ...
while ( !mcp.digitalRead(2) ) { // Falls Taster 2 gedrückt ...
Verschubmotor.setSpeed(100); // ... langsam gegen den Uhrzeigersinn ...
Verschubmotor.rotate(-1);
printed=false;
}
while ( !mcp.digitalRead(3) ) { // Falls Taster 3 gedrückt ...
Verschubmotor.setSpeed(100); // ... langsam im Uhrzeigersinn ...
Verschubmotor.rotate(1);
printed=false;
}
Verschubmotor.stop(); // Stop, falls kein Taster gedrückt ...
if (!printed) {
Serial.print("aktuelle Position: "); Serial.println(Verschubmotor.readSteps());
printed=true; // ... und Position zeigen.
}
}
Serial.println("Messfahrt beendet.");
}
Mit den Tastern kann man die Bühne dann vorwärts oder rückwärts bewegen. Ist kein Taster gedrückt, wird die aktuelle Position auf den seriellen Monitor geschrieben. Diese (in meinem Fall 4) Werte notiert man sich dann und hinterlegt sie als Positionen in dem ganz zu Anfang erwähnten Array.
Im nächsten Beitrag werde ich dann noch das Zusammenspiel mit der NmraDcc-Library erklären. Der Rest ist eigentlich "schmückendes Beiwerk" und dürfte anhand der Kommentare im Sketch schon fast selbsterklärend sein - aber natürlich gehe ich auch gerne darauf noch ein. Da ich den Thread aber gar nicht unter "Digital" sondern unter "Große Spuren" eröffnet habe, möchte ich dann auch noch andere Aspekte wie z.B. Ausgestaltung diskutieren.
Viele Grüße, Bodo